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.2 Wildcards - 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 IPA uːˈ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.