SlideShare a Scribd company logo
1 of 17
Download to read offline
Trường Đại Học Bách Khoa Hà Nội 
Viện Điện Tử Viễn Thông 
======o0o====== 
BÁO CÁO TUẦN 1 
SỬ DỤNG UBUNTU VÀ 
MAKEFILE 
Sinh viên: NGÔ TRUNG KIÊN 
20111719 
ĐTTT10-K56 
Hà Nội, 7/2014
MỤC LỤC 
MỤC LỤC.................................................................................................................................. 1 
1. Học cách sử dụng ubuntu......................................................................................................2 
1.1 Ubuntu là gì?................................................................................................................2 
1.2 Tập lệnh cơ bản........................................................................................................... 2 
1.2.1 Lệnh liên quan đến hệ thống...........................................................................2 
1.2.2 Lệnh thao tác tập tin........................................................................................ 2 
1.2.3 Lệnh làm việc trên terminal............................................................................ 3 
1.2.4 Lệnh quản lý hệ thống.....................................................................................3 
2. Make file.................................................................................................................................4 
2.1 Định nghĩa....................................................................................................................4 
2.2 Quy tắc chung..............................................................................................................4 
2.3 Tổng quan về make..................................................................................................... 4 
2.3.1 Gọi make trên terminal....................................................................................4 
2.3.2 Ví dụ cơ bản..................................................................................................... 5 
2.3.3 Sử dụng biến môi trường.................................................................................6 
2.3.4 Bài toán make những file ở ngoài thư mục root............................................6 
2.4 Những quy luật cụ thể trong makefiile......................................................................8 
2.4.1 Explicit rules:................................................................................................... 8 
2.4.2Wildcards - những kí tự đại diện.................................................................... 8 
2.4.3 Phony targets( đích đến giả)............................................................................9 
2.4.4 Empty targets( đích đến trống)....................................................................... 9 
2.4.5 Variables and Automatic Variables(Biến và các biến tự động).................... 9 
2.4.6 VPATH và vpath............................................................................................ 10 
2.4.7 Quản lý thư viện.............................................................................................11 
2.5 Hàm............................................................................................................................ 11 
2.5.1 Cú pháp của hàm........................................................................................... 12 
2.5.2 Những hàm thực hiện thao tác trên văn bản................................................12 
2.5.3. Những hàm thao tác với tên file.................................................................. 13 
2.5.4. Những hàm có điều kiện.............................................................................. 14 
2.5.5. Hàm foreach..................................................................................................14 
2.5.6. Hàm file.........................................................................................................15 
2.5.7. Hàm Call....................................................................................................... 15 
2.5.8. Hàm Value.....................................................................................................15 
2.5.9. Hàm Origin....................................................................................................15 
2.5.10. Hàm flavor.................................................................................................. 15
1. Học cách sử dụng ubuntu 
1.1 Ubuntu là gì? 
- Ubuntu (phát âm IPAuːˈbuːntuː) là một hệ điều hành máy tính dựa trên Debian 
GNU/Linux, một bản phân phối Linux thông dụng. Tên của nó bắt nguồn từ "ubuntu" 
trong tiếng Zulu, có nghĩa là "tình người", mô tả triết lí ubuntu: "Tôi được là chính 
mình nhờ có những người xung quanh," một khía cạnh tích cực của cộng đồng. Mục 
đính của Ubuntu bao gồm việc cung cấp một hệ điều hành ổn định, cập nhật cho 
người dùng bình thường, và tập trung vào sự tiện dụng và dễ dàng cài đặt. Ubuntu đã 
được đánh xếp hạng là bản phân phối Linux thông dụng nhất cho máy tính để bàn, 
chiếm khoảng 30% số bản Linux được cài đặt trên máy tính để bàn năm 2007. 
- Ubuntu là phần mềm mã nguồn mở tự do, có nghĩa là người dùng được tự do 
chạy, sao chép, phân phối, nghiên cứu, thay đổi và cải tiến phần mềm theo điều 
khoản của giấy phép GNU GPL. Ubuntu được tài trợ bởi Canonical Ltd (chủ sở hữu 
là một người Nam Phi Mark Shuttleworth). Thay vì bán Ubuntu, Canonical tạo ra 
doanh thu bằng cách bán hỗ trợ kĩ thuật. Bằng vệc để cho Ubuntu tự do và mở mã 
nguồn, Canonical có thể tận dụng tài năng của những nhà phát triển ở bên ngoài 
trong các thành phần cấu tạo của Ubuntu mà không cần phải tự mình phát triển. 
- Canonical ủng hộ và cung cấp hỗ trợ cho bốn bản phân phối dựa trên Ubuntu 
khác: Kubuntu và Xubuntu, vốn sử dụng KDE và Xfce như là môi trường desktop 
thay cho hệ thống GNOME mặc định được sử dụng bởi Ubuntu; Edubuntu, một dự 
án con và là phần bổ sung cho Ubuntu, được thiết kế cho môi trường học tập và sử 
dụng ở nhà; and Ubuntu JeOS (pronounced "Juice"), một phiên bản khác của Ubuntu, 
thiết kế cho các máy ảo. 
1.2 Tập lệnh cơ bản 
1.2.1 Lệnh liên quan đến hệ thống. 
 exit: thoát khỏi cửa sổ dòng lệnh. 
 logout: tương tự exit. 
 reboot: khởi động lại hệ thống. 
 halt: tắt máy. 
 startx: khởi động chế độ xwindows từ cửa sổ terminal. 
 mount: gắn hệ thống tập tin từ một thiết bị lưu trữ vào cây thư mục chính. 
 unmount: ngược với lệnh mount. 
1.2.2 Lệnh thao tác tập tin 
 ls: lấy danh sách tất cả các file và thư mục trong thư mục hiện hành. 
 pwd: xuất đường dẫn của thư mục làm việc.
 cd: thay đổi thư mục làm việc đến một thư mục mới. 
 mkdir: tạo thư mục mới. 
 rmdir: xoá thư mục rỗng. 
 cp: copy một hay nhiều tập tin đến thư mục mới. 
 mv: đổi tên hay di chuyển tập tin, thư mục. 
 rm: xóa tập tin. 
 wc: đếm số dòng, số kí tự... trong tập tin. 
 touch: tạo một tập tin. 
 cat: xem nội dung tập tin. 
 vi: khởi động trình soạn thảo văn bản vi. 
 df: kiểm tra dung lượng đĩa. 
 du: xem dung lượng đĩa đã dùng cho một số tập tin nhất định 
1.2.3 Lệnh làm việc trên terminal 
 clear: xoá trắng cửa sổ dòng lệnh. 
 date: xem ngày, giờ hệ thống. 
 cal: xem lịch hệ thống. 
1.2.4 Lệnh quản lý hệ thống 
 rpm: kiểm tra gói đã cài đặt hay chưa, hoặc cài đặt một gói, hoặc sử dụng để gỡ 
bỏ một gói. 
 ps: kiểm tra hệ thống tiến trình đang chạy. 
 kill: dừng tiến trình khi tiến trình bị treo. Chỉ có người dùng super-user mới có thể 
dừng tất cả các tiến trình còn người dùng bình thường chỉ có thể dừng tiến trình mà 
mình tạo ra. 
 top: hiển thị sự hoạt động của các tiến trình, đặc biệt là thông tin về tài nguyên hệ 
thống và việc sử dụng các tài nguyên đó của từng tiến trình. 
 pstree: hiển thị tất cả các tiến trình dưới dạng cây. 
 sleep: cho hệ thống ngừng hoạt động trong một khoảng thời gian. 
 useradd: tạo một người dùng mới. 
 groupadd: tạo một nhóm người dùng mới. 
 passwd: thay đổi password cho người dùng. 
 userdel: xoá người dùng đã tạo. 
 groupdel: xoá nhóm người dùng đã tạo. 
 gpasswd: thay đổi password của một nhóm người dùng. 
 su: cho phép đăng nhập với tư cách người dùng khác. 
 groups: hiển thị nhóm của user hiện tại.
 who: cho biết ai đang đăng nhập hệ thống. 
 w: tương tự như lệnh who. 
 man: xem hướng dẫn về dòng lệnh như cú pháp, các tham số.. 
2. Make file 
2.1 Định nghĩa. 
- Makefile là 1 file đặc biệt dùng để quản lý các tập tin trong dự án, hiểu đơn 
giản makefile là 1 kịch bản build tức là khi Linux đọc file đó nó biết nó sẽ phải làm 
những nhiệm vụ gì, làm như thế nào và tài nguyên nó cần là gì nằm ở đâu. 
- Một ví dụ về quá trình biên dịch make file 
2.2 Quy tắc chung. 
- Make có quy tắc và cú pháp như sau: 
<target> ... : <prerequisites>... 
“TAB”<command>... 
target: thường là tên của file được tạo ra bởi chương trình, hoặc cũng có thể là 
các chỉ định để thực thi một hoặc một loạt tác vụ nào đó, ví dụ `clean' thường để xoá 
các file nhị phân được tạo ra trong quá trình biên dịch. Các target không được bắt đầu 
bằng dấu '.'. 
prerequisites: là file hoặc các file đầu vào hoặc phụ thuộc để tạo ra target. target 
thường phụ thuộc vào các file này, khi các file này thay đổi (do chỉnh sửa mã 
nguồn->thời gian lưu cửa file bị thay đổi) thì target sẽ được biên dịch lại. 
command: là lệnh hoặc tập lệnh mà trình make sẽ thực thi. Một rule (quy tắc) có 
thể có nhiều lệnh (command), mỗi lệnh thường được viết trên một dòng. Chú ý: 
trước mỗi dòng lệnh bạn cần phải có dấu tab. 
2.3 Tổng quan về make. 
2.3.1 Gọi make trên terminal 
make 
Chương trình sẽ tự động thực hiện make với file tên là makefile hay Makefile 
trong thư mục, còn nếu muốn chạy 1file make với tên gọi khác ví dụ make_kien thì
ta gõ 
make -f make_kien 
2.3.2 Ví dụ cơ bản 
Ta xét 1 chương trình: main.cpp,hello.cpp,factorial.cpp,functions.h 
//functions.h 
void print_hello(); 
int factorial(int n); 
//hello.cpp 
void print_hello()[ 
cout<<"Hello world!"; 
} 
//factorial.cpp 
int factorial(int n){ 
if(n!=1) return (n*factorial(n-1)); 
else return 1; 
} 
//main.cpp 
#include<iostream> 
#include"functions.h" 
int main(){ 
print_hello(); 
cout<<"n5!= "<<factorial(5)<<endl; 
return 0; 
} 
Bình thương khi compile, trên terminal ta phải gõ : 
g++ -o main main.cpp hello.cpp factorial.cpp 
Còn với make, lệnh sẽ đơn giản hơn, ta tạo file makefile với nội dung 
+ Makefile đơn giản: 
//makefile 
all: 
g++ -o main main.cpp hello.cpp factorial.cpp 
+ Makefile sử dụng các thành phần phụ thuộc 
//makefile using dependencies 
all: hello 
hello: main.o factorial.o hello.o 
g++ main.o factorial.o hello.o -o hello 
main.o: main.cpp 
g++ -c main.cpp
factorial.o: factorial.cpp 
g++ -c factorial.cpp 
hello.o: hello.cpp 
g++ -c hello.cpp 
#xoa di cac file rac .o trong qua trinh compiler 
clean: 
rm -rf *o hello 
2.3.3 Sử dụng biến môi trường 
Ví dụ với bài trên 
Khi dặt biến: ví dụ CC=g++, thì cứ chỗ nào g++ ta thay bằng $(CC) 
CC=g++ 
CFLAGS=-c -Wall 
all: hello 
hello: main.o factorial.o hello.o 
$(CC) main.o factorial.o hello.o -o hello 
main.o: main.cpp 
$(CC) $(CFLAGS) main.cpp 
factorial.o: factorial.cpp 
$(CC) $(CFLAGS) factorial.cpp 
hello.o: hello.cpp 
$(CC) $(CFLAGS) hello.cpp 
clean: 
rm -rf *o hello 
Bên tạo biến môi trường, khi mà phát triển chương trình lớn cỡ hàng nghìn dòng dổ 
lên mà muốn thay đổi 1 số thành phần, target ta chỉ cần thay đổi ở khai báo, đơn giản về 
dễ sửa đổi hơn rất nhiều. 
2.3.4 Bài toán make những file ở ngoài thư mục root 
Phân tích ví dụ make cơ bản 
USER_DIR = .. 
#biến USER_DIR với nội dung là “..” dùng để chỉ tên user 
LIB_DIR= $(USER_DIR)/libraries
#đường dẫn đến thư viện cần sử dụng 
MAIN_FILE_DIR=$(USER_DIR)/mainFile 
#địa chỉ chương trình main 
#name of main file 
MAIN_FILE_NAME= ngokien 
#tên chương trình main 
INC = -I$(LIB_DIR) 
#Sử dụng tùy chọn -I để báo với gcc biết cần tìm trong đường dẫn LIB_DIR những 
file .h include vào. 
#compiler 
GXX = g++ 
#biến đại diện cho công cụ compiler g++ 
FLAG = -Wall -g -W 
#Đây là những tùy chọn về tối ưu trong g++. Bật những cờ này lên sẽ giúp đưa ra 
những cảnh báo về code chương trình giúp viết code tốt hơn. 
#source 
STUB = $(LIB_DIR)/ipc.cpp $(LIB_DIR)/person.cpp 
#chứa tên các file thành viên( phụ thuộc) 
#object 
OBJECT = ipc.o person.o 
#chứa tên các file object thành viên 
#The Target 
#lệnh 
run: ready code 
//tác vụ này gồm 2 công việc, ready và code, thực hiện lần lượt ở dưới 
$(GXX) $(INC) $(FLAG) $(MAIN_FILE_NAME).o $(OBJECT) -o run 
ready: 
$(GXX) $(INC) $(FLAG) -c $(STUB) 
code: 
$(GXX) $(INC) $(FLAG) -c $(MAIN_FILE_DIR)/$(MAIN_FILE_NAME).cpp 
clean: 
rm -rf *.o run 
#xóa file rác .o khi bạn làm việc với project lớn thì việc tạo clean khá quan trọng vì 
khi gọi nó sẽ xóa đi những gì được gọi là rác trong quá trình build như là những file 
object hoặc file executable cũ chẳng hạn
Một số lệnh với make: 
make gọi target đầu tiên 
make <tên target> gọi target có tên được ghi ra 
make <tên target> -n show toàn bộ kịch bản build của target được gọi 
2.4 Những quy luật cụ thể trong makefiile 
2.4.1 Explicit rules: 
+ Hầu hết những quy tắc mà ta sẽ viết đều phải qui định rõ ràng các thành phần: 
những cái đích đến (targets) và danh sách những thành phần phụ thuộc (prerequisites). 
+ Một quy tắc có thể có nhiều hơn một đích đến, nghĩa là những đích đến đó đều có 
chung những thành phần phụ thuộc. 
+ Nếu như những đích đến đó mà chưa được cập nhật thì sẽ có những lệnh giống 
nhau để cập nhật cho mỗi đích đến đó. 
+ Ví dụ: 
target1.o target2.o: prerequisite1.h prerequisite2.h prerequisite3.cpp 
→ tức là target1.o và target2.o đều phụ thuộc vào 3 tập tin là prerequisite1.h 
prerequisite2.h và prerequisite3.cpp 
→ ta có thể viết lại là: 
target1.o : prerequisite1.h prerequisite2.h prerequisite3.cpp 
target2.o : prerequisite1.h prerequisite2.h prerequisite3.cpp 
+ Mỗi 1 đích đến được quản lý một cách độc lập. Mỗi lần thấy một đích đến, make sẽ 
thêm 
đích đến đó và danh sách thành phần phụ thuộc vào đồ thị phụ thuộc của make. 
+ Tuy nhiên, chỉ có một bộ danh sách các lệnh được liên kết với bất kỳ đích đến 
nào.Nếu 
chúng ta tạo ra 2 bộ danh sách lệnh cho cùng một thời điểm thì make sẽ cảnh báo và 
kết quả 
có được có thể sẽ sai so với những gì ta mong muốn. 
* Chú ý: make hỗ trợ cách viết một quy tắc theo kiểu: 
target : prerequisites ; command 
2.4.2 Wildcards - những kí tự đại diện. 
+ Trong makefile luôn tồn tại một danh sách rất dài các file. Vì vậy, để giúp cho 
make file đơn giản hơn thì make hỗ trợ việc sử dụng các ký tự đại diện. 
+ Các ký tự đại diện như: ~, *, ?, [...], and [^...] 
→ ~: diễn tả đường dẫn của thư mục home 
→ * : ví dụ: → *.* chỉ tất cả những file chứa dấu “.” 
→ *.cpp chỉ tất cả những file có phần đuôi là “.cpp” như: node.cpp , 
graph.cpp , egde.cpp … 
→ [...] : diễn tả một lớp đối tượng nào đó 
→ [^...]: diễn tả phủ định của lớp đối tượng trên. 
+ Cần cẩn thận khi sử dụng các ký tự đại diện vì ta có thể hiểu sai ý nghĩa của chúng.
2.4.3 Phony targets( đích đến giả) 
+ Đa số các trường hợp thì đích đến (target) trong makefile là tên một tệp tồn tại thực 
tế. Tuy nhiên, đích đến ở đây có thể chỉ đơn giản là một nhãn dùng để đại diện cho một 
tập lệnh. 
+ Ví dụ: đích đến giả clean: 
clean: 
rm -rf *.o 
+ Để thực hiện lệnh trên, chỉ cần gõ make clean. 
+ Tuy nhiên,nếu chỉ viết như vậy ta sẽ không thể phân biệt được đây là đích đến giả 
hay là tên một tập tin. 
+ Đích đến giả luôn luôn không có danh sách thành phần tệp phụ thuộc, vì vậy nó 
luôn luôn bị xác định là chưa được thực thi. Để tránh hiện tượng này, tiện ích make cung 
cấp một đích đến đặc biệt là .PHONYđể thông báo với make rằng đích đến ở đây không 
phải là một file thực sự. 
+ Ví dụ: 
.PHONY: clean 
clean: 
rm -rf *.o 
+ Dưới đây là danh sách những đích đến giả tiêu chuẩn, hay được sử dụng trong 
makefile 
là:→ 
all: thực hiện tất cả các nhiệm vụ để xây dựng ứng dụng. 
→ install: cài đặt ứng dụng từ cây nguồn đã được biên dịch 
→ clean: xoá các tập tin được tạo ra từ các nguồn. 
→ distclean: xoá tất cả các file mà nó không được tạo ra từ cây nguồn. 
→ TAGS: tạo ra các bảng thẻ để sử dụng cho các biên tập viên. 
→ info: tạo ra các tệp tin info GNU từ các nguồn Texinfo 
→ check: chạy bất kỳ một bài kiểm tra nào liên quan tới ứng dụng. 
2.4.4 Empty targets( đích đến trống) 
+ Đích đến trống gần giống với đích đến giả 
+ Tuy nhiên, đích đến giả không có danh sách tập tin phụ thuộc. Còn đích đến trống 
thì có tồn tại danh sách tập tin phụ thuộc. 
+ Đích đến trống nhằm thực hiện một số lệnh nhưng không muốn tạo ra file đầu ra. 
2.4.5 Variables and Automatic Variables(Biến và các biến tự động) 
+ Như đã viết ở trên, ta có thể đặt tên biến rồi gọi biến như sau 
$(variable-name) 
+ Các biến tự động được cài đặt bởi make sau 1 quy luật dùng để truy cập tới các 
đích đến và danh sách các tập tin phụ thuộc. 
+ Việc sử dụng các biến tự động giúp cho makefile gọn hơn, tránh lặp code
+ Một vài biến tự động là: 
→ $@ : tên của đích đến hiện tại. 
→ $% : 
→ $< : tên của tệp tin phụ thuộc đầu tiên. 
→ $? : tên của tất cả các tệp tin phụ thuộc mới hơn so với đích đến, được ngăn 
cách bởi dấu cách. 
→ $^ : tên của tất cả các tệp tin phụ thuộc được ngăn cách nhau bởi dấu cách, và 
trong danh sách này các tên bị trùng lặp đã bị loại bỏ. 
→ $+ : giống $^ ở chỗ đây cũng là tên của tất cả các tệp tin phụ thuộc được ngăn 
cách nhau bởi dấu cách, nhưng khác ở chỗ là trong danh sách này chấp nhận việc trùng 
lặp tên. Biến này được dùng trong các trường hợp cụ thể nơi mà các bản sao là có nghĩa. 
2.4.6 VPATH và vpath 
+ Ở đây sẽ đề cập đến việc giải quyết bài toán biên dịch file ở những thư mục khác 
nhau 
+ Ví du: ta có 1 project: 
~/src/MyProject 
----> Makefile 
----> include 
----> counter.h 
----> lexer.h 
---- src 
----> count_words.c 
----> counter.c 
----> lexer.l 
+ Nội dung của makefile là: 
count_words: count_words.o counter.o lexer.o -lfl 
gcc $^ -o $@ 
count_words.o: count_words.c include/counter.h 
gcc -c $< 
counter.o: counter.c include/counter.h include/lexer.h 
gcc -c $< 
lexer.o: lexer.c include/lexer.h 
gcc -c $< 
lexer.c: lexer.l 
flex -t $< > $@ 
+ Khi chạy make: thì sẽ thông báo lỗi vì make không thể tìm thấy vị trí của file 
count_words.c vì file này không trong cùng một thư mục với Makefile. 
+ Ta sửa như sau: 
VPATH = src 
+ Makefile thành: 
count_words: count_words.o counter.o lexer.o -lfl 
gcc $^ -o $@ 
count_words.o: count_words.c include/counter.h
gcc -c $(VPATH)/$< 
counter.o: counter.c include/counter.h include/lexer.h 
gcc -c $(VPATH)/$< 
lexer.o: lexer.c include/lexer.h 
gcc -c $< 
lexer.c: lexer.l 
flex -t $(VPATH)/$< > $@ 
+ Bây giờ, chạy make , ta vẫn bị thông báo lỗi, vì make không thể tìm được file thư 
viện. Ta sửa bằng cách sau: 
CPPFLAGS = -I include 
// ta đặc tả tên thư viện để make biết. 
+ Makefile bây giờ thành : 
count_words: count_words.o counter.o lexer.o -lfl 
gcc $^ -o $@ 
count_words.o: count_words.c include/counter.h 
gcc $(CPPFLAGS) -c $(VPATH)/$< 
counter.o: counter.c include/counter.h include/lexer.h 
gcc $(CPPFLAGS) -c $(VPATH)/$< 
lexer.o: lexer.c include/lexer.h 
gcc $(CPPFLAGS) -c $< 
lexer.c: lexer.l 
flex -t $(VPATH)/$< > $@ 
2.4.7 Quản lý thư viện 
- Mặc định gcc, g++ có thể liên kết với các file đối tượng. 
- Gõ: gcc –o main main.c func.o. 
- Tĩnh: chứa các file đối tượng .o được tạo bởi công cụ ar 
+ Gõ: ar rcs libfunc.a func.o (tạo ra thư viện libfunc.a) 
+ Dịch main với: gcc -o main main.c libfunc.a 
- Động: được load khi chương trình chạy, dược tạo bởi gcc g++ 
+ Gõ: gcc –c –fPIC func.c (tạo ra func.o) 
+ Gõ: gcc –shared –W1,soname,libfunc.so.1 –o libfunc.so.1.0 func.o 
+ Tạo ra libfunc.so.1.0 (libfunc.dll) 
+ Dịch main với: gcc –o main main.c libfunc.so.1.0 
- Trường hợp chạy main lỗi không tìm thấy thư viện liên kết động 
--> chỉ lại đường dẫn thư viện: 
export LD_LIBRARY_PATH=$(pwd) 
--> sao chép libfunc.so.1.0 đến /usr/lib rồi chạy ldconfig để cập nhật thư viện 
2.5 Hàm 
+ GNU make hỗ trợ việc xây dựng hàm 
+ Hàm trong make gần giống với việc định nghĩa biến, nhưng trong hàm luôn bao 
gồm 1 hay nhiều tham số được ngăn cách bởi “,”
2.5.1 Cú pháp của hàm 
+ $(function arguments)hay ${function arguments} 
+ Ở đây: 
- function ở đây là tên của hàm 
- arguments là danh sách tên biến, biến ngăn cách với function bởi một hay nhiều dấu 
cách, hoặc dấu tab. Và nếu có nhiều biến thì chúng sẽ ngăn cách nhau bởi dấu phẩy 
+ Trong danh sách arguments có thể có chứa một hàm khác 
2.5.2 Những hàm thực hiện thao tác trên văn bản. 
2.5.2.1 Hàm $(subst from,to,text) 
+ Chức năng là thay thế from thành to trong text 
+ ví dụ: $(subst ee,EE,feet on the street) 
→ kết quả sẽ là: “fEEt on the strEEt” 
2.5.2.2 Hàm $(patsubst pattern,replacement,text) 
+ Chức năng: thay thế trong text thành phần có dạng mẫu patternthành replacement 
+ Ví dụ: $(patsubst %.c,%.o,x.c.c bar.c) 
+ Kết quả là : “x.c.o bar.o” 
2.5.2.3 Hàm $(strip string) 
+ Chức năng: loại bỏ khoảng trắng ở đầu và cuối đoạn text và nhiều khoảng trắng 
giữa các ký tự bằng một khoảng trắng duy nhất 
+ Ví dụ: $(strip a b c ) 
+ Kết quả là : “a b c” 
2.5.2.4. Hàm $(findstring find,in) 
+ Chức năng là: tìm thành phần findtrong in 
+ Ví dụ:$(findstring a,a b c) 
+ Kết quả: trả về là a 
+ Còn nếu là $(findstring a,b c)thì kết quả là khoảng trắng 
2.5.2.5. Hàm $(filter pattern...,text) 
+ Chức năng: lọc lấy trong texttất cả những thành phần có mẫu parttern 
+ Ví dụ: 
sources := foo.c bar.c baz.s ugh.h 
foo: $(sources) 
cc $(filter %.c %.s,$(sources)) -o foo 
+ Kết quả: cc chỉ biên dịch những file có dạng .c và .s trong soucre, nghĩa là chỉ biên 
dịch 
file foo.c bar.c và baz.s 
2.5.2.6. Hàm $(filter-out pattern...,text) 
+ Chức năng: loại bỏ tất cả trong textnhững file dạng pattern 
+ Ví dụ: 
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o 
$(filter-out $(mains),$(objects)) 
+ Kết quả: còn lại những file mà khác những file trong mainđó là foo.ovà bar.o 
2.5.2.7. Hàm $(sort list) 
+ Chức năng: sắp xếp những từ trong danh sách theo thứ tự bảng chữ cái và bỏ đi từ 
trùng lặp 
+ Ví dụ: $(sort foo bar lose bar) 
+ Kết quả là: bar foo lose 
2.5.2.8. Hàm $(word n,text) 
+ Chức năng: trả về từ thứ n trong text 
+ Ví dụ: $(word 2, foo bar baz) 
+ Kết quả: trả về bar 
2.5.2.9. Hàm $(wordlist s,e,text) 
+ Chức năng: trả về danh sách những từ bắt đầu từ từ thứ s và kết thúc từ từ thứ 2. 
nếu e lớn hơn s thì kết quả trả về rỗng 
+ Ví dụ: $(wordlist 2, 3, foo bar baz) 
+ Kết quả: trả về bar baz 
2.5.2.10. Hàm $(words text) 
+ Chức năng: trả về số lượng từ trong text 
+ Ví dụ: $(words foo bar) 
+ Kết quả: trả về giá trị 2 
2.5.2.11. Hàm $(firstword names...) 
+ Chức năng: trả về từ đầu tiên trong danh sách names. 
+ Ví dụ: $(firstword foo bar) 
+ Kết quả: trả về foo 
2.5.2.12. Hàm $(lastword names...) 
+ Chức năng: trả về từ cuối cùng trong danh sách names. 
+ Ví dụ: $(firstword foo bar) 
+ Kết quả: trả về bar 
2.5.3. Những hàm thao tác với tên file 
2.5.3.1. $(dir names...) 
+ Chức năng: lấy ra một phần đường dẫn của mỗi tên tệp trong names, nếu tên tệp 
không có đường dẫn thì kết quả là “./” 
+ Ví dụ: $(dir src/foo.c hacks) 
+ Kết quả: trả về src/ ./ 
2.5.3.2.$(notdir names...) 
+ Chức năng: Lấy ra tất cả những thành phần đằng sau dấu gạch chéo, nếu sau dấu
gạch chéo không có ký tự nào thì kết qủa trả về rỗng, nếu tên không có dấu gạch chéo thì 
nó được giữ nguyên. 
+ Ví dụ: $(notdir src/foo.c hacks) 
+Kết quả trả về: foo.c hacks 
2.5.3.3.$(suffix names...) 
+ Chức năng: kết quả trả về tất cả hậu tố của tên trong names 
+ Ví dụ: $(suffix src/foo.c src-1.0/bar.c hacks) 
+ Kết quả : .c .c 
2.5.3.4. $(basename names...) 
+ Chức năng: kết quả trả về thành phần của tên bỏ đi hậu tố 
+ Ví dụ: $(suffix src/foo.c src-1.0/bar.c hacks) 
+ Kết quả là: src/foo src-1.0/bar hacks 
2.5.3.5. $(addsuffix suffix,names...) 
+ Chức năng: thêm hậu tố vào tên trong names 
+ Ví dụ:$(addsuffix .c,foo bar) 
+ Kết quả là: foo.c bar.c 
2.5.3.6.$(addprefix prefix,names...) 
+ Chức năng: thêm tiền tố cho tên 
+ Ví dụ: $(addprefix src/,foo bar) 
+ Kết quả là src/foo src/bar 
2.5.3.7.$(join list1,list2) 
+ Chức năng: nối những từ trong list1với những từ tronglist2theo kiểu word by word 
+ Ví dụ:$(join a b,.c .o) 
+ Kết quả là: a.c b.o 
2.5.3.8. $(wildcard pattern) 
+ Chức năng: trả về danh sách những tên file có dạng giống mô hình pattern 
2.5.3.9. $(realpath names...) 
+ Chức năng: với mỗi tên trong namessẽ trả về một tên tuyệt đối, tức không chưa bất 
kỳ dấu “.” hay ..hay dấu / hoặc bất kỳ liên kết nàoiện 
2.5.4. Những hàm có điều kiện 
2.5.4.1. $(if condition,then-part[,else-part]) 
2.5.4.2. $(or condition1[,condition2[,condition3...]]) 
2.5.4.3. $(and condition1[,condition2[,condition3...]]) 
2.5.5. Hàm foreach 
+ Chức năng là lặp lại một vài đoạn text với những biến thể được kiểm soát.
+ Cú pháp của hàm là: $(foreach var,list,text) 
2.5.6. Hàm file 
+ Chức năng là cho phép makefile viết text lên file 
+ Cú pháp: $(file op filename,text) 
+ Toán tử opcó thể thay thế bằng >hay >> 
+ text là nội dung và sẽ ghi lên file có tên filename 
2.5.7. Hàm Call 
+ Chức năng là tạo ra các hàm với những tham số mới 
+ Cú pháp: $(call variable,param,param,...) 
+ Tức ta có thể viết một biểu thức phức tạp biểu diễn giá trị của một biến, sau đó mở 
rộng ra với các giá trị biến khác nhau. 
+ Ví dụ: 
reverse = $(2) $(1) 
foo = $(call reverse,a,b) 
+ Khí đó : foo = b a 
2.5.8. Hàm Value 
+ Đây là cách khác để sử dụng giá trị của một biến 
+ Cú pháp: $(value variable) 
2.5.9. Hàm Origin 
+ Chức năng dùng để tìm vị trí nơi mà biến được tạo giá trị 
+ Cú pháp: $(origin variable) 
+ Các giá trị trả về là: 
→ ‘undefined’ : nếu biến chưa được định nghĩa 
→ ‘default’: nếu biến có giá trị mặc định 
→ ‘environment’: nếu như biến được thừa hưởng từ môi trường cung cấp để thực 
hiện. 
→ ‘environment override’: nếu biến được thừa hưởng từ môi trường cung cấp để 
thực hiện và như là kết quả của tuỳ chọn -e 
→ ‘file’: nếu như biến được định nghĩa trong makefile 
→ ‘command line’ : nếu như biến được định nghĩa trong command line 
→ ‘override’: nếu như biến được định nghĩa với một chỉ thị được thiết lập trong 
makefile 
→ ‘automatic’: nếu biến là biến tự động được định nghĩa để thực hiện các công thức 
của mỗi quy tắc. 
2.5.10. Hàm flavor 
+ Dùng để chỉ ra một số thông tin của biến, gần giống với hàm origin 
+ Cú pháp: $(flavor variable)
+ Các kết quả trả về: 
→ undefined: nếu biến chưa được định nghĩa 
→ recursive : nếu biến được mở rộng một cách đệ quy 
→ simple : nếu là biến đơn giản.

More Related Content

What's hot

Phân tích mã độc cơ bản - báo cáo thực tập
Phân tích mã độc cơ bản - báo cáo thực tậpPhân tích mã độc cơ bản - báo cáo thực tập
Phân tích mã độc cơ bản - báo cáo thực tậpPhạm Trung Đức
 
ChuyenDeANM ung dung he thong IDS securityonion vao giam sat moi truong mang ...
ChuyenDeANM ung dung he thong IDS securityonion vao giam sat moi truong mang ...ChuyenDeANM ung dung he thong IDS securityonion vao giam sat moi truong mang ...
ChuyenDeANM ung dung he thong IDS securityonion vao giam sat moi truong mang ...nataliej4
 
Báo cáo môn mã nguồn mở
Báo cáo môn mã nguồn mởBáo cáo môn mã nguồn mở
Báo cáo môn mã nguồn mởThuyet Nguyen
 
Kiem thu phan mem
Kiem thu phan memKiem thu phan mem
Kiem thu phan memTIen Le
 
Hướng dẫn xây dựng mô hình mạng với vmware
Hướng dẫn xây dựng mô hình mạng với vmwareHướng dẫn xây dựng mô hình mạng với vmware
Hướng dẫn xây dựng mô hình mạng với vmwarelaonap166
 
Tìm hiểu và triển khai các dịch vụ trên Windows Server 2008
Tìm hiểu và triển khai các dịch vụ trên Windows Server 2008Tìm hiểu và triển khai các dịch vụ trên Windows Server 2008
Tìm hiểu và triển khai các dịch vụ trên Windows Server 2008Long Kingnam
 
Nghiên cứu một số hình thức tấn công website phổ biến và các giải pháp phòng ...
Nghiên cứu một số hình thức tấn công website phổ biến và các giải pháp phòng ...Nghiên cứu một số hình thức tấn công website phổ biến và các giải pháp phòng ...
Nghiên cứu một số hình thức tấn công website phổ biến và các giải pháp phòng ...Thịt Xốt Cà Chua
 
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 FithouSlideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 FithouTú Cao
 
Báo cáo phân tích thiết kế mạng
Báo cáo phân tích thiết kế mạngBáo cáo phân tích thiết kế mạng
Báo cáo phân tích thiết kế mạngjackjohn45
 
bao cao linux
bao cao linuxbao cao linux
bao cao linuxbinhnv186
 
Tai lieu lap trinh shell linux unix
Tai lieu lap trinh shell linux   unixTai lieu lap trinh shell linux   unix
Tai lieu lap trinh shell linux unixkaivnit
 
Đồ Án Thiết Kế Mạng ĐHCNTPHCM
Đồ Án Thiết Kế Mạng ĐHCNTPHCMĐồ Án Thiết Kế Mạng ĐHCNTPHCM
Đồ Án Thiết Kế Mạng ĐHCNTPHCMTeemo Hành Gia
 
Báo cáo t hiết kế mạng doanh nghiệp
Báo cáo t hiết kế mạng doanh nghiệpBáo cáo t hiết kế mạng doanh nghiệp
Báo cáo t hiết kế mạng doanh nghiệpLe Trung Hieu
 
tài liệu Mã nguồn mở 17308 he dieu hanh ma nguon mo
tài liệu Mã nguồn mở  17308   he dieu hanh ma nguon motài liệu Mã nguồn mở  17308   he dieu hanh ma nguon mo
tài liệu Mã nguồn mở 17308 he dieu hanh ma nguon moThuyet Nguyen
 

What's hot (20)

Đề tài: Tìm hiểu hệ thống phát hiện xâm nhập IDS-SNORT, 9đ
Đề tài: Tìm hiểu hệ thống phát hiện xâm nhập IDS-SNORT, 9đĐề tài: Tìm hiểu hệ thống phát hiện xâm nhập IDS-SNORT, 9đ
Đề tài: Tìm hiểu hệ thống phát hiện xâm nhập IDS-SNORT, 9đ
 
Luận văn: Tìm hiểu giải pháp ảo hóa docker và ứng dụng, HOT
Luận văn: Tìm hiểu giải pháp ảo hóa docker và ứng dụng, HOTLuận văn: Tìm hiểu giải pháp ảo hóa docker và ứng dụng, HOT
Luận văn: Tìm hiểu giải pháp ảo hóa docker và ứng dụng, HOT
 
Phân tích mã độc cơ bản - báo cáo thực tập
Phân tích mã độc cơ bản - báo cáo thực tậpPhân tích mã độc cơ bản - báo cáo thực tập
Phân tích mã độc cơ bản - báo cáo thực tập
 
ChuyenDeANM ung dung he thong IDS securityonion vao giam sat moi truong mang ...
ChuyenDeANM ung dung he thong IDS securityonion vao giam sat moi truong mang ...ChuyenDeANM ung dung he thong IDS securityonion vao giam sat moi truong mang ...
ChuyenDeANM ung dung he thong IDS securityonion vao giam sat moi truong mang ...
 
Đề tài: Hệ thống giám sát mạng dựa trên phần mềm nguồn mở, HAY
Đề tài: Hệ thống giám sát mạng dựa trên phần mềm nguồn mở, HAYĐề tài: Hệ thống giám sát mạng dựa trên phần mềm nguồn mở, HAY
Đề tài: Hệ thống giám sát mạng dựa trên phần mềm nguồn mở, HAY
 
Báo cáo môn mã nguồn mở
Báo cáo môn mã nguồn mởBáo cáo môn mã nguồn mở
Báo cáo môn mã nguồn mở
 
Linux seminar
Linux seminarLinux seminar
Linux seminar
 
TỰ HỌC LPI 2
TỰ HỌC LPI 2TỰ HỌC LPI 2
TỰ HỌC LPI 2
 
Kiem thu phan mem
Kiem thu phan memKiem thu phan mem
Kiem thu phan mem
 
Hướng dẫn xây dựng mô hình mạng với vmware
Hướng dẫn xây dựng mô hình mạng với vmwareHướng dẫn xây dựng mô hình mạng với vmware
Hướng dẫn xây dựng mô hình mạng với vmware
 
Tìm hiểu và triển khai các dịch vụ trên Windows Server 2008
Tìm hiểu và triển khai các dịch vụ trên Windows Server 2008Tìm hiểu và triển khai các dịch vụ trên Windows Server 2008
Tìm hiểu và triển khai các dịch vụ trên Windows Server 2008
 
Nghiên cứu một số hình thức tấn công website phổ biến và các giải pháp phòng ...
Nghiên cứu một số hình thức tấn công website phổ biến và các giải pháp phòng ...Nghiên cứu một số hình thức tấn công website phổ biến và các giải pháp phòng ...
Nghiên cứu một số hình thức tấn công website phổ biến và các giải pháp phòng ...
 
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 FithouSlideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
 
Báo cáo phân tích thiết kế mạng
Báo cáo phân tích thiết kế mạngBáo cáo phân tích thiết kế mạng
Báo cáo phân tích thiết kế mạng
 
bao cao linux
bao cao linuxbao cao linux
bao cao linux
 
Tai lieu lap trinh shell linux unix
Tai lieu lap trinh shell linux   unixTai lieu lap trinh shell linux   unix
Tai lieu lap trinh shell linux unix
 
Đồ Án Thiết Kế Mạng ĐHCNTPHCM
Đồ Án Thiết Kế Mạng ĐHCNTPHCMĐồ Án Thiết Kế Mạng ĐHCNTPHCM
Đồ Án Thiết Kế Mạng ĐHCNTPHCM
 
Báo cáo t hiết kế mạng doanh nghiệp
Báo cáo t hiết kế mạng doanh nghiệpBáo cáo t hiết kế mạng doanh nghiệp
Báo cáo t hiết kế mạng doanh nghiệp
 
Tấn Công DDOS
Tấn Công DDOSTấn Công DDOS
Tấn Công DDOS
 
tài liệu Mã nguồn mở 17308 he dieu hanh ma nguon mo
tài liệu Mã nguồn mở  17308   he dieu hanh ma nguon motài liệu Mã nguồn mở  17308   he dieu hanh ma nguon mo
tài liệu Mã nguồn mở 17308 he dieu hanh ma nguon mo
 

Viewers also liked

Mô phỏng vi điều khiển
Mô phỏng vi điều khiểnMô phỏng vi điều khiển
Mô phỏng vi điều khiểnNguyễn Trung
 
Tìm hiểu về Linux
Tìm hiểu về LinuxTìm hiểu về Linux
Tìm hiểu về LinuxNhan Nguyen
 
Cac lenh co_ban_linux
Cac lenh co_ban_linuxCac lenh co_ban_linux
Cac lenh co_ban_linuxgofriv
 
Kb2 hipertensi gravidarum
Kb2 hipertensi gravidarumKb2 hipertensi gravidarum
Kb2 hipertensi gravidarumpjj_kemenkes
 
Co so dieu khien tu dong thay duy
Co so dieu khien tu dong thay duyCo so dieu khien tu dong thay duy
Co so dieu khien tu dong thay duyminhnhatfrog269
 
Hướng dẫn in pcb âm bản Altium
Hướng dẫn in pcb âm bản AltiumHướng dẫn in pcb âm bản Altium
Hướng dẫn in pcb âm bản Altiumheromap
 
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52quanglocbp
 
Huong dan dung proteus
Huong dan dung proteusHuong dan dung proteus
Huong dan dung proteusĐức Đỗ
 
ứNg dụng phép biến đổi laplace giải một lớp các phương trình toán lý
ứNg dụng phép biến đổi laplace giải một lớp các phương trình toán   lýứNg dụng phép biến đổi laplace giải một lớp các phương trình toán   lý
ứNg dụng phép biến đổi laplace giải một lớp các phương trình toán lýhttps://www.facebook.com/garmentspace
 
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52quanglocbp
 
Hướng dẫn làm khối LED 3D 8x8x8
Hướng dẫn làm khối LED 3D 8x8x8Hướng dẫn làm khối LED 3D 8x8x8
Hướng dẫn làm khối LED 3D 8x8x8Mr Giap
 
Dientuso Sld
Dientuso SldDientuso Sld
Dientuso Sldhoadktd
 
Ebook altium designer
Ebook altium designerEbook altium designer
Ebook altium designerDo Tien Dat
 
He thong chong trom bang hong ngoai dung vi xu ly
He thong chong trom bang hong ngoai dung vi xu lyHe thong chong trom bang hong ngoai dung vi xu ly
He thong chong trom bang hong ngoai dung vi xu lyDao Nguyen Thi
 
Giáo trình kiến trúc máy tính i chương 4 mạch logic số - tài liệu, ebook
Giáo trình kiến trúc máy tính i   chương 4  mạch logic số - tài liệu, ebookGiáo trình kiến trúc máy tính i   chương 4  mạch logic số - tài liệu, ebook
Giáo trình kiến trúc máy tính i chương 4 mạch logic số - tài liệu, ebookNguyễn Cảnh Sang
 

Viewers also liked (20)

Mô phỏng vi điều khiển
Mô phỏng vi điều khiểnMô phỏng vi điều khiển
Mô phỏng vi điều khiển
 
Tìm hiểu về Linux
Tìm hiểu về LinuxTìm hiểu về Linux
Tìm hiểu về Linux
 
Ubuntu in Education - MOE OSS Day 2010
Ubuntu in Education - MOE OSS Day 2010Ubuntu in Education - MOE OSS Day 2010
Ubuntu in Education - MOE OSS Day 2010
 
MOE Ubuntu Desktop training
MOE Ubuntu Desktop trainingMOE Ubuntu Desktop training
MOE Ubuntu Desktop training
 
Cac lenh co_ban_linux
Cac lenh co_ban_linuxCac lenh co_ban_linux
Cac lenh co_ban_linux
 
Kb2 hipertensi gravidarum
Kb2 hipertensi gravidarumKb2 hipertensi gravidarum
Kb2 hipertensi gravidarum
 
Co so dieu khien tu dong thay duy
Co so dieu khien tu dong thay duyCo so dieu khien tu dong thay duy
Co so dieu khien tu dong thay duy
 
Hướng dẫn in pcb âm bản Altium
Hướng dẫn in pcb âm bản AltiumHướng dẫn in pcb âm bản Altium
Hướng dẫn in pcb âm bản Altium
 
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
 
Huong dan dung proteus
Huong dan dung proteusHuong dan dung proteus
Huong dan dung proteus
 
ứNg dụng phép biến đổi laplace giải một lớp các phương trình toán lý
ứNg dụng phép biến đổi laplace giải một lớp các phương trình toán   lýứNg dụng phép biến đổi laplace giải một lớp các phương trình toán   lý
ứNg dụng phép biến đổi laplace giải một lớp các phương trình toán lý
 
Giaotrinh ltdkd 2007
Giaotrinh ltdkd 2007Giaotrinh ltdkd 2007
Giaotrinh ltdkd 2007
 
Bất đẳng thức hình học
Bất đẳng thức hình họcBất đẳng thức hình học
Bất đẳng thức hình học
 
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
 
Hướng dẫn làm khối LED 3D 8x8x8
Hướng dẫn làm khối LED 3D 8x8x8Hướng dẫn làm khối LED 3D 8x8x8
Hướng dẫn làm khối LED 3D 8x8x8
 
Dientuso Sld
Dientuso SldDientuso Sld
Dientuso Sld
 
Ebook altium designer
Ebook altium designerEbook altium designer
Ebook altium designer
 
Huong dan su dung photoshop cs5
Huong dan su dung photoshop cs5Huong dan su dung photoshop cs5
Huong dan su dung photoshop cs5
 
He thong chong trom bang hong ngoai dung vi xu ly
He thong chong trom bang hong ngoai dung vi xu lyHe thong chong trom bang hong ngoai dung vi xu ly
He thong chong trom bang hong ngoai dung vi xu ly
 
Giáo trình kiến trúc máy tính i chương 4 mạch logic số - tài liệu, ebook
Giáo trình kiến trúc máy tính i   chương 4  mạch logic số - tài liệu, ebookGiáo trình kiến trúc máy tính i   chương 4  mạch logic số - tài liệu, ebook
Giáo trình kiến trúc máy tính i chương 4 mạch logic số - tài liệu, ebook
 

Similar to Cach su dung Ubuntu

Linux Network Administration (LPI-1,LPI-2)
Linux Network Administration (LPI-1,LPI-2)Linux Network Administration (LPI-1,LPI-2)
Linux Network Administration (LPI-1,LPI-2)laonap166
 
Tom tat lenh_ubuntu
Tom tat lenh_ubuntuTom tat lenh_ubuntu
Tom tat lenh_ubuntuthanhhokh03
 
Tom tat lenh ubuntu
Tom tat lenh ubuntuTom tat lenh ubuntu
Tom tat lenh ubuntunghoanganh
 
00-Phieu Yeu Cau Thuc Hanh QTM-Linux-CD.pdf
00-Phieu Yeu Cau Thuc Hanh QTM-Linux-CD.pdf00-Phieu Yeu Cau Thuc Hanh QTM-Linux-CD.pdf
00-Phieu Yeu Cau Thuc Hanh QTM-Linux-CD.pdfvnprothanh
 
Th linux
Th linuxTh linux
Th linuxthocntt
 
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mở
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mởBài 2: Hệ điều hành và các ứng dụng mã nguồn mở
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mởMasterCode.vn
 
Làm thế nào để học linux trong 24h?
Làm thế nào để học linux trong 24h?Làm thế nào để học linux trong 24h?
Làm thế nào để học linux trong 24h?Công Nghệ - VTC Mobile
 
Linux Backup & Restore.docx
Linux Backup & Restore.docxLinux Backup & Restore.docx
Linux Backup & Restore.docxssuserca116d
 
Cài đặt quản trị hệ điều hành Ubuntu 12.0
Cài đặt quản trị  hệ điều hành Ubuntu 12.0Cài đặt quản trị  hệ điều hành Ubuntu 12.0
Cài đặt quản trị hệ điều hành Ubuntu 12.0Cường Nguyễn Tam
 
Phân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên UbuntuPhân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên UbuntuLương Kiên
 
Phân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên UbuntuPhân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên UbuntuLương Kiên
 
Chuong2 cautruchedieuhanh
Chuong2 cautruchedieuhanhChuong2 cautruchedieuhanh
Chuong2 cautruchedieuhanhHai Nguyen
 

Similar to Cach su dung Ubuntu (20)

Linux Network Administration (LPI-1,LPI-2)
Linux Network Administration (LPI-1,LPI-2)Linux Network Administration (LPI-1,LPI-2)
Linux Network Administration (LPI-1,LPI-2)
 
Tom tat lenh_ubuntu
Tom tat lenh_ubuntuTom tat lenh_ubuntu
Tom tat lenh_ubuntu
 
Tom tat lenh ubuntu
Tom tat lenh ubuntuTom tat lenh ubuntu
Tom tat lenh ubuntu
 
Su dung linux shell
Su dung linux shellSu dung linux shell
Su dung linux shell
 
Su dung linux shell
Su dung linux shellSu dung linux shell
Su dung linux shell
 
00-Phieu Yeu Cau Thuc Hanh QTM-Linux-CD.pdf
00-Phieu Yeu Cau Thuc Hanh QTM-Linux-CD.pdf00-Phieu Yeu Cau Thuc Hanh QTM-Linux-CD.pdf
00-Phieu Yeu Cau Thuc Hanh QTM-Linux-CD.pdf
 
Linux+02
Linux+02Linux+02
Linux+02
 
Các lệnh shell cơ bản trong linux
Các lệnh shell cơ bản trong linuxCác lệnh shell cơ bản trong linux
Các lệnh shell cơ bản trong linux
 
Th linux
Th linuxTh linux
Th linux
 
--De cuong on tap hdh
 --De cuong on tap hdh --De cuong on tap hdh
--De cuong on tap hdh
 
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mở
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mởBài 2: Hệ điều hành và các ứng dụng mã nguồn mở
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mở
 
Làm thế nào để học linux trong 24h?
Làm thế nào để học linux trong 24h?Làm thế nào để học linux trong 24h?
Làm thế nào để học linux trong 24h?
 
Thuc hanh 13
Thuc hanh  13Thuc hanh  13
Thuc hanh 13
 
Bai bao cao 3
Bai bao cao 3Bai bao cao 3
Bai bao cao 3
 
Linux Backup & Restore.docx
Linux Backup & Restore.docxLinux Backup & Restore.docx
Linux Backup & Restore.docx
 
Cài đặt quản trị hệ điều hành Ubuntu 12.0
Cài đặt quản trị  hệ điều hành Ubuntu 12.0Cài đặt quản trị  hệ điều hành Ubuntu 12.0
Cài đặt quản trị hệ điều hành Ubuntu 12.0
 
Xoa mu linux
Xoa mu linuxXoa mu linux
Xoa mu linux
 
Phân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên UbuntuPhân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên Ubuntu
 
Phân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên UbuntuPhân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên Ubuntu
 
Chuong2 cautruchedieuhanh
Chuong2 cautruchedieuhanhChuong2 cautruchedieuhanh
Chuong2 cautruchedieuhanh
 

Cach su dung Ubuntu

  • 1. Trường Đại Học Bách Khoa Hà Nội Viện Điện Tử Viễn Thông ======o0o====== BÁO CÁO TUẦN 1 SỬ DỤNG UBUNTU VÀ MAKEFILE Sinh viên: NGÔ TRUNG KIÊN 20111719 ĐTTT10-K56 Hà Nội, 7/2014
  • 2. MỤC LỤC MỤC LỤC.................................................................................................................................. 1 1. Học cách sử dụng ubuntu......................................................................................................2 1.1 Ubuntu là gì?................................................................................................................2 1.2 Tập lệnh cơ bản........................................................................................................... 2 1.2.1 Lệnh liên quan đến hệ thống...........................................................................2 1.2.2 Lệnh thao tác tập tin........................................................................................ 2 1.2.3 Lệnh làm việc trên terminal............................................................................ 3 1.2.4 Lệnh quản lý hệ thống.....................................................................................3 2. Make file.................................................................................................................................4 2.1 Định nghĩa....................................................................................................................4 2.2 Quy tắc chung..............................................................................................................4 2.3 Tổng quan về make..................................................................................................... 4 2.3.1 Gọi make trên terminal....................................................................................4 2.3.2 Ví dụ cơ bản..................................................................................................... 5 2.3.3 Sử dụng biến môi trường.................................................................................6 2.3.4 Bài toán make những file ở ngoài thư mục root............................................6 2.4 Những quy luật cụ thể trong makefiile......................................................................8 2.4.1 Explicit rules:................................................................................................... 8 2.4.2Wildcards - những kí tự đại diện.................................................................... 8 2.4.3 Phony targets( đích đến giả)............................................................................9 2.4.4 Empty targets( đích đến trống)....................................................................... 9 2.4.5 Variables and Automatic Variables(Biến và các biến tự động).................... 9 2.4.6 VPATH và vpath............................................................................................ 10 2.4.7 Quản lý thư viện.............................................................................................11 2.5 Hàm............................................................................................................................ 11 2.5.1 Cú pháp của hàm........................................................................................... 12 2.5.2 Những hàm thực hiện thao tác trên văn bản................................................12 2.5.3. Những hàm thao tác với tên file.................................................................. 13 2.5.4. Những hàm có điều kiện.............................................................................. 14 2.5.5. Hàm foreach..................................................................................................14 2.5.6. Hàm file.........................................................................................................15 2.5.7. Hàm Call....................................................................................................... 15 2.5.8. Hàm Value.....................................................................................................15 2.5.9. Hàm Origin....................................................................................................15 2.5.10. Hàm flavor.................................................................................................. 15
  • 3. 1. Học cách sử dụng ubuntu 1.1 Ubuntu là gì? - Ubuntu (phát âm IPAuːˈbuːntuː) là một hệ điều hành máy tính dựa trên Debian GNU/Linux, một bản phân phối Linux thông dụng. Tên của nó bắt nguồn từ "ubuntu" trong tiếng Zulu, có nghĩa là "tình người", mô tả triết lí ubuntu: "Tôi được là chính mình nhờ có những người xung quanh," một khía cạnh tích cực của cộng đồng. Mục đính của Ubuntu bao gồm việc cung cấp một hệ điều hành ổn định, cập nhật cho người dùng bình thường, và tập trung vào sự tiện dụng và dễ dàng cài đặt. Ubuntu đã được đánh xếp hạng là bản phân phối Linux thông dụng nhất cho máy tính để bàn, chiếm khoảng 30% số bản Linux được cài đặt trên máy tính để bàn năm 2007. - Ubuntu là phần mềm mã nguồn mở tự do, có nghĩa là người dùng được tự do chạy, sao chép, phân phối, nghiên cứu, thay đổi và cải tiến phần mềm theo điều khoản của giấy phép GNU GPL. Ubuntu được tài trợ bởi Canonical Ltd (chủ sở hữu là một người Nam Phi Mark Shuttleworth). Thay vì bán Ubuntu, Canonical tạo ra doanh thu bằng cách bán hỗ trợ kĩ thuật. Bằng vệc để cho Ubuntu tự do và mở mã nguồn, Canonical có thể tận dụng tài năng của những nhà phát triển ở bên ngoài trong các thành phần cấu tạo của Ubuntu mà không cần phải tự mình phát triển. - Canonical ủng hộ và cung cấp hỗ trợ cho bốn bản phân phối dựa trên Ubuntu khác: Kubuntu và Xubuntu, vốn sử dụng KDE và Xfce như là môi trường desktop thay cho hệ thống GNOME mặc định được sử dụng bởi Ubuntu; Edubuntu, một dự án con và là phần bổ sung cho Ubuntu, được thiết kế cho môi trường học tập và sử dụng ở nhà; and Ubuntu JeOS (pronounced "Juice"), một phiên bản khác của Ubuntu, thiết kế cho các máy ảo. 1.2 Tập lệnh cơ bản 1.2.1 Lệnh liên quan đến hệ thống.  exit: thoát khỏi cửa sổ dòng lệnh.  logout: tương tự exit.  reboot: khởi động lại hệ thống.  halt: tắt máy.  startx: khởi động chế độ xwindows từ cửa sổ terminal.  mount: gắn hệ thống tập tin từ một thiết bị lưu trữ vào cây thư mục chính.  unmount: ngược với lệnh mount. 1.2.2 Lệnh thao tác tập tin  ls: lấy danh sách tất cả các file và thư mục trong thư mục hiện hành.  pwd: xuất đường dẫn của thư mục làm việc.
  • 4.  cd: thay đổi thư mục làm việc đến một thư mục mới.  mkdir: tạo thư mục mới.  rmdir: xoá thư mục rỗng.  cp: copy một hay nhiều tập tin đến thư mục mới.  mv: đổi tên hay di chuyển tập tin, thư mục.  rm: xóa tập tin.  wc: đếm số dòng, số kí tự... trong tập tin.  touch: tạo một tập tin.  cat: xem nội dung tập tin.  vi: khởi động trình soạn thảo văn bản vi.  df: kiểm tra dung lượng đĩa.  du: xem dung lượng đĩa đã dùng cho một số tập tin nhất định 1.2.3 Lệnh làm việc trên terminal  clear: xoá trắng cửa sổ dòng lệnh.  date: xem ngày, giờ hệ thống.  cal: xem lịch hệ thống. 1.2.4 Lệnh quản lý hệ thống  rpm: kiểm tra gói đã cài đặt hay chưa, hoặc cài đặt một gói, hoặc sử dụng để gỡ bỏ một gói.  ps: kiểm tra hệ thống tiến trình đang chạy.  kill: dừng tiến trình khi tiến trình bị treo. Chỉ có người dùng super-user mới có thể dừng tất cả các tiến trình còn người dùng bình thường chỉ có thể dừng tiến trình mà mình tạo ra.  top: hiển thị sự hoạt động của các tiến trình, đặc biệt là thông tin về tài nguyên hệ thống và việc sử dụng các tài nguyên đó của từng tiến trình.  pstree: hiển thị tất cả các tiến trình dưới dạng cây.  sleep: cho hệ thống ngừng hoạt động trong một khoảng thời gian.  useradd: tạo một người dùng mới.  groupadd: tạo một nhóm người dùng mới.  passwd: thay đổi password cho người dùng.  userdel: xoá người dùng đã tạo.  groupdel: xoá nhóm người dùng đã tạo.  gpasswd: thay đổi password của một nhóm người dùng.  su: cho phép đăng nhập với tư cách người dùng khác.  groups: hiển thị nhóm của user hiện tại.
  • 5.  who: cho biết ai đang đăng nhập hệ thống.  w: tương tự như lệnh who.  man: xem hướng dẫn về dòng lệnh như cú pháp, các tham số.. 2. Make file 2.1 Định nghĩa. - Makefile là 1 file đặc biệt dùng để quản lý các tập tin trong dự án, hiểu đơn giản makefile là 1 kịch bản build tức là khi Linux đọc file đó nó biết nó sẽ phải làm những nhiệm vụ gì, làm như thế nào và tài nguyên nó cần là gì nằm ở đâu. - Một ví dụ về quá trình biên dịch make file 2.2 Quy tắc chung. - Make có quy tắc và cú pháp như sau: <target> ... : <prerequisites>... “TAB”<command>... target: thường là tên của file được tạo ra bởi chương trình, hoặc cũng có thể là các chỉ định để thực thi một hoặc một loạt tác vụ nào đó, ví dụ `clean' thường để xoá các file nhị phân được tạo ra trong quá trình biên dịch. Các target không được bắt đầu bằng dấu '.'. prerequisites: là file hoặc các file đầu vào hoặc phụ thuộc để tạo ra target. target thường phụ thuộc vào các file này, khi các file này thay đổi (do chỉnh sửa mã nguồn->thời gian lưu cửa file bị thay đổi) thì target sẽ được biên dịch lại. command: là lệnh hoặc tập lệnh mà trình make sẽ thực thi. Một rule (quy tắc) có thể có nhiều lệnh (command), mỗi lệnh thường được viết trên một dòng. Chú ý: trước mỗi dòng lệnh bạn cần phải có dấu tab. 2.3 Tổng quan về make. 2.3.1 Gọi make trên terminal make Chương trình sẽ tự động thực hiện make với file tên là makefile hay Makefile trong thư mục, còn nếu muốn chạy 1file make với tên gọi khác ví dụ make_kien thì
  • 6. ta gõ make -f make_kien 2.3.2 Ví dụ cơ bản Ta xét 1 chương trình: main.cpp,hello.cpp,factorial.cpp,functions.h //functions.h void print_hello(); int factorial(int n); //hello.cpp void print_hello()[ cout<<"Hello world!"; } //factorial.cpp int factorial(int n){ if(n!=1) return (n*factorial(n-1)); else return 1; } //main.cpp #include<iostream> #include"functions.h" int main(){ print_hello(); cout<<"n5!= "<<factorial(5)<<endl; return 0; } Bình thương khi compile, trên terminal ta phải gõ : g++ -o main main.cpp hello.cpp factorial.cpp Còn với make, lệnh sẽ đơn giản hơn, ta tạo file makefile với nội dung + Makefile đơn giản: //makefile all: g++ -o main main.cpp hello.cpp factorial.cpp + Makefile sử dụng các thành phần phụ thuộc //makefile using dependencies all: hello hello: main.o factorial.o hello.o g++ main.o factorial.o hello.o -o hello main.o: main.cpp g++ -c main.cpp
  • 7. factorial.o: factorial.cpp g++ -c factorial.cpp hello.o: hello.cpp g++ -c hello.cpp #xoa di cac file rac .o trong qua trinh compiler clean: rm -rf *o hello 2.3.3 Sử dụng biến môi trường Ví dụ với bài trên Khi dặt biến: ví dụ CC=g++, thì cứ chỗ nào g++ ta thay bằng $(CC) CC=g++ CFLAGS=-c -Wall all: hello hello: main.o factorial.o hello.o $(CC) main.o factorial.o hello.o -o hello main.o: main.cpp $(CC) $(CFLAGS) main.cpp factorial.o: factorial.cpp $(CC) $(CFLAGS) factorial.cpp hello.o: hello.cpp $(CC) $(CFLAGS) hello.cpp clean: rm -rf *o hello Bên tạo biến môi trường, khi mà phát triển chương trình lớn cỡ hàng nghìn dòng dổ lên mà muốn thay đổi 1 số thành phần, target ta chỉ cần thay đổi ở khai báo, đơn giản về dễ sửa đổi hơn rất nhiều. 2.3.4 Bài toán make những file ở ngoài thư mục root Phân tích ví dụ make cơ bản USER_DIR = .. #biến USER_DIR với nội dung là “..” dùng để chỉ tên user LIB_DIR= $(USER_DIR)/libraries
  • 8. #đường dẫn đến thư viện cần sử dụng MAIN_FILE_DIR=$(USER_DIR)/mainFile #địa chỉ chương trình main #name of main file MAIN_FILE_NAME= ngokien #tên chương trình main INC = -I$(LIB_DIR) #Sử dụng tùy chọn -I để báo với gcc biết cần tìm trong đường dẫn LIB_DIR những file .h include vào. #compiler GXX = g++ #biến đại diện cho công cụ compiler g++ FLAG = -Wall -g -W #Đây là những tùy chọn về tối ưu trong g++. Bật những cờ này lên sẽ giúp đưa ra những cảnh báo về code chương trình giúp viết code tốt hơn. #source STUB = $(LIB_DIR)/ipc.cpp $(LIB_DIR)/person.cpp #chứa tên các file thành viên( phụ thuộc) #object OBJECT = ipc.o person.o #chứa tên các file object thành viên #The Target #lệnh run: ready code //tác vụ này gồm 2 công việc, ready và code, thực hiện lần lượt ở dưới $(GXX) $(INC) $(FLAG) $(MAIN_FILE_NAME).o $(OBJECT) -o run ready: $(GXX) $(INC) $(FLAG) -c $(STUB) code: $(GXX) $(INC) $(FLAG) -c $(MAIN_FILE_DIR)/$(MAIN_FILE_NAME).cpp clean: rm -rf *.o run #xóa file rác .o khi bạn làm việc với project lớn thì việc tạo clean khá quan trọng vì khi gọi nó sẽ xóa đi những gì được gọi là rác trong quá trình build như là những file object hoặc file executable cũ chẳng hạn
  • 9. Một số lệnh với make: make gọi target đầu tiên make <tên target> gọi target có tên được ghi ra make <tên target> -n show toàn bộ kịch bản build của target được gọi 2.4 Những quy luật cụ thể trong makefiile 2.4.1 Explicit rules: + Hầu hết những quy tắc mà ta sẽ viết đều phải qui định rõ ràng các thành phần: những cái đích đến (targets) và danh sách những thành phần phụ thuộc (prerequisites). + Một quy tắc có thể có nhiều hơn một đích đến, nghĩa là những đích đến đó đều có chung những thành phần phụ thuộc. + Nếu như những đích đến đó mà chưa được cập nhật thì sẽ có những lệnh giống nhau để cập nhật cho mỗi đích đến đó. + Ví dụ: target1.o target2.o: prerequisite1.h prerequisite2.h prerequisite3.cpp → tức là target1.o và target2.o đều phụ thuộc vào 3 tập tin là prerequisite1.h prerequisite2.h và prerequisite3.cpp → ta có thể viết lại là: target1.o : prerequisite1.h prerequisite2.h prerequisite3.cpp target2.o : prerequisite1.h prerequisite2.h prerequisite3.cpp + Mỗi 1 đích đến được quản lý một cách độc lập. Mỗi lần thấy một đích đến, make sẽ thêm đích đến đó và danh sách thành phần phụ thuộc vào đồ thị phụ thuộc của make. + Tuy nhiên, chỉ có một bộ danh sách các lệnh được liên kết với bất kỳ đích đến nào.Nếu chúng ta tạo ra 2 bộ danh sách lệnh cho cùng một thời điểm thì make sẽ cảnh báo và kết quả có được có thể sẽ sai so với những gì ta mong muốn. * Chú ý: make hỗ trợ cách viết một quy tắc theo kiểu: target : prerequisites ; command 2.4.2 Wildcards - những kí tự đại diện. + Trong makefile luôn tồn tại một danh sách rất dài các file. Vì vậy, để giúp cho make file đơn giản hơn thì make hỗ trợ việc sử dụng các ký tự đại diện. + Các ký tự đại diện như: ~, *, ?, [...], and [^...] → ~: diễn tả đường dẫn của thư mục home → * : ví dụ: → *.* chỉ tất cả những file chứa dấu “.” → *.cpp chỉ tất cả những file có phần đuôi là “.cpp” như: node.cpp , graph.cpp , egde.cpp … → [...] : diễn tả một lớp đối tượng nào đó → [^...]: diễn tả phủ định của lớp đối tượng trên. + Cần cẩn thận khi sử dụng các ký tự đại diện vì ta có thể hiểu sai ý nghĩa của chúng.
  • 10. 2.4.3 Phony targets( đích đến giả) + Đa số các trường hợp thì đích đến (target) trong makefile là tên một tệp tồn tại thực tế. Tuy nhiên, đích đến ở đây có thể chỉ đơn giản là một nhãn dùng để đại diện cho một tập lệnh. + Ví dụ: đích đến giả clean: clean: rm -rf *.o + Để thực hiện lệnh trên, chỉ cần gõ make clean. + Tuy nhiên,nếu chỉ viết như vậy ta sẽ không thể phân biệt được đây là đích đến giả hay là tên một tập tin. + Đích đến giả luôn luôn không có danh sách thành phần tệp phụ thuộc, vì vậy nó luôn luôn bị xác định là chưa được thực thi. Để tránh hiện tượng này, tiện ích make cung cấp một đích đến đặc biệt là .PHONYđể thông báo với make rằng đích đến ở đây không phải là một file thực sự. + Ví dụ: .PHONY: clean clean: rm -rf *.o + Dưới đây là danh sách những đích đến giả tiêu chuẩn, hay được sử dụng trong makefile là:→ all: thực hiện tất cả các nhiệm vụ để xây dựng ứng dụng. → install: cài đặt ứng dụng từ cây nguồn đã được biên dịch → clean: xoá các tập tin được tạo ra từ các nguồn. → distclean: xoá tất cả các file mà nó không được tạo ra từ cây nguồn. → TAGS: tạo ra các bảng thẻ để sử dụng cho các biên tập viên. → info: tạo ra các tệp tin info GNU từ các nguồn Texinfo → check: chạy bất kỳ một bài kiểm tra nào liên quan tới ứng dụng. 2.4.4 Empty targets( đích đến trống) + Đích đến trống gần giống với đích đến giả + Tuy nhiên, đích đến giả không có danh sách tập tin phụ thuộc. Còn đích đến trống thì có tồn tại danh sách tập tin phụ thuộc. + Đích đến trống nhằm thực hiện một số lệnh nhưng không muốn tạo ra file đầu ra. 2.4.5 Variables and Automatic Variables(Biến và các biến tự động) + Như đã viết ở trên, ta có thể đặt tên biến rồi gọi biến như sau $(variable-name) + Các biến tự động được cài đặt bởi make sau 1 quy luật dùng để truy cập tới các đích đến và danh sách các tập tin phụ thuộc. + Việc sử dụng các biến tự động giúp cho makefile gọn hơn, tránh lặp code
  • 11. + Một vài biến tự động là: → $@ : tên của đích đến hiện tại. → $% : → $< : tên của tệp tin phụ thuộc đầu tiên. → $? : tên của tất cả các tệp tin phụ thuộc mới hơn so với đích đến, được ngăn cách bởi dấu cách. → $^ : tên của tất cả các tệp tin phụ thuộc được ngăn cách nhau bởi dấu cách, và trong danh sách này các tên bị trùng lặp đã bị loại bỏ. → $+ : giống $^ ở chỗ đây cũng là tên của tất cả các tệp tin phụ thuộc được ngăn cách nhau bởi dấu cách, nhưng khác ở chỗ là trong danh sách này chấp nhận việc trùng lặp tên. Biến này được dùng trong các trường hợp cụ thể nơi mà các bản sao là có nghĩa. 2.4.6 VPATH và vpath + Ở đây sẽ đề cập đến việc giải quyết bài toán biên dịch file ở những thư mục khác nhau + Ví du: ta có 1 project: ~/src/MyProject ----> Makefile ----> include ----> counter.h ----> lexer.h ---- src ----> count_words.c ----> counter.c ----> lexer.l + Nội dung của makefile là: count_words: count_words.o counter.o lexer.o -lfl gcc $^ -o $@ count_words.o: count_words.c include/counter.h gcc -c $< counter.o: counter.c include/counter.h include/lexer.h gcc -c $< lexer.o: lexer.c include/lexer.h gcc -c $< lexer.c: lexer.l flex -t $< > $@ + Khi chạy make: thì sẽ thông báo lỗi vì make không thể tìm thấy vị trí của file count_words.c vì file này không trong cùng một thư mục với Makefile. + Ta sửa như sau: VPATH = src + Makefile thành: count_words: count_words.o counter.o lexer.o -lfl gcc $^ -o $@ count_words.o: count_words.c include/counter.h
  • 12. gcc -c $(VPATH)/$< counter.o: counter.c include/counter.h include/lexer.h gcc -c $(VPATH)/$< lexer.o: lexer.c include/lexer.h gcc -c $< lexer.c: lexer.l flex -t $(VPATH)/$< > $@ + Bây giờ, chạy make , ta vẫn bị thông báo lỗi, vì make không thể tìm được file thư viện. Ta sửa bằng cách sau: CPPFLAGS = -I include // ta đặc tả tên thư viện để make biết. + Makefile bây giờ thành : count_words: count_words.o counter.o lexer.o -lfl gcc $^ -o $@ count_words.o: count_words.c include/counter.h gcc $(CPPFLAGS) -c $(VPATH)/$< counter.o: counter.c include/counter.h include/lexer.h gcc $(CPPFLAGS) -c $(VPATH)/$< lexer.o: lexer.c include/lexer.h gcc $(CPPFLAGS) -c $< lexer.c: lexer.l flex -t $(VPATH)/$< > $@ 2.4.7 Quản lý thư viện - Mặc định gcc, g++ có thể liên kết với các file đối tượng. - Gõ: gcc –o main main.c func.o. - Tĩnh: chứa các file đối tượng .o được tạo bởi công cụ ar + Gõ: ar rcs libfunc.a func.o (tạo ra thư viện libfunc.a) + Dịch main với: gcc -o main main.c libfunc.a - Động: được load khi chương trình chạy, dược tạo bởi gcc g++ + Gõ: gcc –c –fPIC func.c (tạo ra func.o) + Gõ: gcc –shared –W1,soname,libfunc.so.1 –o libfunc.so.1.0 func.o + Tạo ra libfunc.so.1.0 (libfunc.dll) + Dịch main với: gcc –o main main.c libfunc.so.1.0 - Trường hợp chạy main lỗi không tìm thấy thư viện liên kết động --> chỉ lại đường dẫn thư viện: export LD_LIBRARY_PATH=$(pwd) --> sao chép libfunc.so.1.0 đến /usr/lib rồi chạy ldconfig để cập nhật thư viện 2.5 Hàm + GNU make hỗ trợ việc xây dựng hàm + Hàm trong make gần giống với việc định nghĩa biến, nhưng trong hàm luôn bao gồm 1 hay nhiều tham số được ngăn cách bởi “,”
  • 13. 2.5.1 Cú pháp của hàm + $(function arguments)hay ${function arguments} + Ở đây: - function ở đây là tên của hàm - arguments là danh sách tên biến, biến ngăn cách với function bởi một hay nhiều dấu cách, hoặc dấu tab. Và nếu có nhiều biến thì chúng sẽ ngăn cách nhau bởi dấu phẩy + Trong danh sách arguments có thể có chứa một hàm khác 2.5.2 Những hàm thực hiện thao tác trên văn bản. 2.5.2.1 Hàm $(subst from,to,text) + Chức năng là thay thế from thành to trong text + ví dụ: $(subst ee,EE,feet on the street) → kết quả sẽ là: “fEEt on the strEEt” 2.5.2.2 Hàm $(patsubst pattern,replacement,text) + Chức năng: thay thế trong text thành phần có dạng mẫu patternthành replacement + Ví dụ: $(patsubst %.c,%.o,x.c.c bar.c) + Kết quả là : “x.c.o bar.o” 2.5.2.3 Hàm $(strip string) + Chức năng: loại bỏ khoảng trắng ở đầu và cuối đoạn text và nhiều khoảng trắng giữa các ký tự bằng một khoảng trắng duy nhất + Ví dụ: $(strip a b c ) + Kết quả là : “a b c” 2.5.2.4. Hàm $(findstring find,in) + Chức năng là: tìm thành phần findtrong in + Ví dụ:$(findstring a,a b c) + Kết quả: trả về là a + Còn nếu là $(findstring a,b c)thì kết quả là khoảng trắng 2.5.2.5. Hàm $(filter pattern...,text) + Chức năng: lọc lấy trong texttất cả những thành phần có mẫu parttern + Ví dụ: sources := foo.c bar.c baz.s ugh.h foo: $(sources) cc $(filter %.c %.s,$(sources)) -o foo + Kết quả: cc chỉ biên dịch những file có dạng .c và .s trong soucre, nghĩa là chỉ biên dịch file foo.c bar.c và baz.s 2.5.2.6. Hàm $(filter-out pattern...,text) + Chức năng: loại bỏ tất cả trong textnhững file dạng pattern + Ví dụ: objects=main1.o foo.o main2.o bar.o
  • 14. mains=main1.o main2.o $(filter-out $(mains),$(objects)) + Kết quả: còn lại những file mà khác những file trong mainđó là foo.ovà bar.o 2.5.2.7. Hàm $(sort list) + Chức năng: sắp xếp những từ trong danh sách theo thứ tự bảng chữ cái và bỏ đi từ trùng lặp + Ví dụ: $(sort foo bar lose bar) + Kết quả là: bar foo lose 2.5.2.8. Hàm $(word n,text) + Chức năng: trả về từ thứ n trong text + Ví dụ: $(word 2, foo bar baz) + Kết quả: trả về bar 2.5.2.9. Hàm $(wordlist s,e,text) + Chức năng: trả về danh sách những từ bắt đầu từ từ thứ s và kết thúc từ từ thứ 2. nếu e lớn hơn s thì kết quả trả về rỗng + Ví dụ: $(wordlist 2, 3, foo bar baz) + Kết quả: trả về bar baz 2.5.2.10. Hàm $(words text) + Chức năng: trả về số lượng từ trong text + Ví dụ: $(words foo bar) + Kết quả: trả về giá trị 2 2.5.2.11. Hàm $(firstword names...) + Chức năng: trả về từ đầu tiên trong danh sách names. + Ví dụ: $(firstword foo bar) + Kết quả: trả về foo 2.5.2.12. Hàm $(lastword names...) + Chức năng: trả về từ cuối cùng trong danh sách names. + Ví dụ: $(firstword foo bar) + Kết quả: trả về bar 2.5.3. Những hàm thao tác với tên file 2.5.3.1. $(dir names...) + Chức năng: lấy ra một phần đường dẫn của mỗi tên tệp trong names, nếu tên tệp không có đường dẫn thì kết quả là “./” + Ví dụ: $(dir src/foo.c hacks) + Kết quả: trả về src/ ./ 2.5.3.2.$(notdir names...) + Chức năng: Lấy ra tất cả những thành phần đằng sau dấu gạch chéo, nếu sau dấu
  • 15. gạch chéo không có ký tự nào thì kết qủa trả về rỗng, nếu tên không có dấu gạch chéo thì nó được giữ nguyên. + Ví dụ: $(notdir src/foo.c hacks) +Kết quả trả về: foo.c hacks 2.5.3.3.$(suffix names...) + Chức năng: kết quả trả về tất cả hậu tố của tên trong names + Ví dụ: $(suffix src/foo.c src-1.0/bar.c hacks) + Kết quả : .c .c 2.5.3.4. $(basename names...) + Chức năng: kết quả trả về thành phần của tên bỏ đi hậu tố + Ví dụ: $(suffix src/foo.c src-1.0/bar.c hacks) + Kết quả là: src/foo src-1.0/bar hacks 2.5.3.5. $(addsuffix suffix,names...) + Chức năng: thêm hậu tố vào tên trong names + Ví dụ:$(addsuffix .c,foo bar) + Kết quả là: foo.c bar.c 2.5.3.6.$(addprefix prefix,names...) + Chức năng: thêm tiền tố cho tên + Ví dụ: $(addprefix src/,foo bar) + Kết quả là src/foo src/bar 2.5.3.7.$(join list1,list2) + Chức năng: nối những từ trong list1với những từ tronglist2theo kiểu word by word + Ví dụ:$(join a b,.c .o) + Kết quả là: a.c b.o 2.5.3.8. $(wildcard pattern) + Chức năng: trả về danh sách những tên file có dạng giống mô hình pattern 2.5.3.9. $(realpath names...) + Chức năng: với mỗi tên trong namessẽ trả về một tên tuyệt đối, tức không chưa bất kỳ dấu “.” hay ..hay dấu / hoặc bất kỳ liên kết nàoiện 2.5.4. Những hàm có điều kiện 2.5.4.1. $(if condition,then-part[,else-part]) 2.5.4.2. $(or condition1[,condition2[,condition3...]]) 2.5.4.3. $(and condition1[,condition2[,condition3...]]) 2.5.5. Hàm foreach + Chức năng là lặp lại một vài đoạn text với những biến thể được kiểm soát.
  • 16. + Cú pháp của hàm là: $(foreach var,list,text) 2.5.6. Hàm file + Chức năng là cho phép makefile viết text lên file + Cú pháp: $(file op filename,text) + Toán tử opcó thể thay thế bằng >hay >> + text là nội dung và sẽ ghi lên file có tên filename 2.5.7. Hàm Call + Chức năng là tạo ra các hàm với những tham số mới + Cú pháp: $(call variable,param,param,...) + Tức ta có thể viết một biểu thức phức tạp biểu diễn giá trị của một biến, sau đó mở rộng ra với các giá trị biến khác nhau. + Ví dụ: reverse = $(2) $(1) foo = $(call reverse,a,b) + Khí đó : foo = b a 2.5.8. Hàm Value + Đây là cách khác để sử dụng giá trị của một biến + Cú pháp: $(value variable) 2.5.9. Hàm Origin + Chức năng dùng để tìm vị trí nơi mà biến được tạo giá trị + Cú pháp: $(origin variable) + Các giá trị trả về là: → ‘undefined’ : nếu biến chưa được định nghĩa → ‘default’: nếu biến có giá trị mặc định → ‘environment’: nếu như biến được thừa hưởng từ môi trường cung cấp để thực hiện. → ‘environment override’: nếu biến được thừa hưởng từ môi trường cung cấp để thực hiện và như là kết quả của tuỳ chọn -e → ‘file’: nếu như biến được định nghĩa trong makefile → ‘command line’ : nếu như biến được định nghĩa trong command line → ‘override’: nếu như biến được định nghĩa với một chỉ thị được thiết lập trong makefile → ‘automatic’: nếu biến là biến tự động được định nghĩa để thực hiện các công thức của mỗi quy tắc. 2.5.10. Hàm flavor + Dùng để chỉ ra một số thông tin của biến, gần giống với hàm origin + Cú pháp: $(flavor variable)
  • 17. + Các kết quả trả về: → undefined: nếu biến chưa được định nghĩa → recursive : nếu biến được mở rộng một cách đệ quy → simple : nếu là biến đơn giản.