17
Tr ường ĐạiHc Bách Khoa Hà Ni Vi n ĐinTVi n Thông ======o0o====== BÁO CÁO TUN1 SDNG UBUNTU VÀ MAKEFILE Sinh viên: NGÔ TRUNG KIÊN 20111719 ĐTTT10-K56 Hà Ni, 7/2014

Cach su dung Ubuntu

  • Upload
    kien-ma

  • View
    203

  • Download
    6

Embed Size (px)

Citation preview

Page 1: Cach su dung Ubuntu

Trường Đại Học Bách Khoa Hà NộiViện Điện Tử Viễn Thông

======o0o======

BÁO CÁO TUẦN 1SỬ DỤNG UBUNTU VÀ

MAKEFILE

Sinh viên: NGÔ TRUNG KIÊN20111719

ĐTTT10-K56

Hà Nội, 7/2014

Page 2: Cach su dung Ubuntu

MỤC LỤCMỤC LỤC.................................................................................................................................. 11. Học cách sử dụng ubuntu......................................................................................................2

1.1 Ubuntu là gì?................................................................................................................21.2 Tập lệnh cơ bản........................................................................................................... 2

1.2.1 Lệnh liên quan đến hệ thống...........................................................................21.2.2 Lệnh thao tác tập tin........................................................................................ 21.2.3 Lệnh làm việc trên terminal............................................................................ 31.2.4 Lệnh quản lý hệ thống.....................................................................................3

2. Make file.................................................................................................................................42.1 Định nghĩa....................................................................................................................42.2 Quy tắc chung..............................................................................................................42.3 Tổng quan về make..................................................................................................... 4

2.3.1 Gọi make trên terminal....................................................................................42.3.2 Ví dụ cơ bản..................................................................................................... 52.3.3 Sử dụng biến môi trường.................................................................................62.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......................................................................82.4.1 Explicit rules:................................................................................................... 82.4.2 Wildcards - những kí tự đại diện.................................................................... 82.4.3 Phony targets( đích đến giả)............................................................................92.4.4 Empty targets( đích đến trống)....................................................................... 92.4.5 Variables and Automatic Variables(Biến và các biến tự động).................... 92.4.6 VPATH và vpath............................................................................................ 102.4.7 Quản lý thư viện.............................................................................................11

2.5 Hàm............................................................................................................................ 112.5.1 Cú pháp của hàm........................................................................................... 122.5.2 Những hàm thực hiện thao tác trên văn bản................................................122.5.3. Những hàm thao tác với tên file.................................................................. 132.5.4. Những hàm có điều kiện.............................................................................. 142.5.5. Hàm foreach..................................................................................................142.5.6. Hàm file.........................................................................................................152.5.7. Hàm Call....................................................................................................... 152.5.8. Hàm Value.....................................................................................................152.5.9. Hàm Origin....................................................................................................152.5.10. Hàm flavor.................................................................................................. 15

Page 3: Cach su dung Ubuntu

1. Học cách sử dụng ubuntu1.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 DebianGNU/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ínhmì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 chongườ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ự dochạ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ềukhoản của giấy phép GNU GPL. Ubuntu được tài trợ bởi Canonical Ltd (chủ sở hữulà một người Nam Phi Mark Shuttleworth). Thay vì bán Ubuntu, Canonical tạo radoanh 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àitrong 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 Ubuntukhác: Kubuntu và Xubuntu, vốn sử dụng KDE và Xfce như là môi trường desktopthay 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.

Page 4: Cach su dung Ubuntu

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.

Page 5: Cach su dung Ubuntu

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 file2.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 đơngiản makefile là 1 kịch bản build tức là khi Linux đọc file đó nó biết nó sẽ phải làmnhữ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 đầubằng dấu '.'.

prerequisites: là file hoặc các file đầu vào hoặc phụ thuộc để tạo ra target. targetthườ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 terminalmake

Chương trình sẽ tự động thực hiện make với file tên là makefile hay Makefiletrong 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ì

Page 6: Cach su dung Ubuntu

ta gõmake -f make_kien

2.3.2 Ví dụ cơ bảnTa xét 1 chương trình: main.cpp,hello.cpp,factorial.cpp,functions.h//functions.hvoid print_hello();int factorial(int n);

//hello.cppvoid print_hello()[

cout<<"Hello world!";}

//factorial.cppint 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:

//makefileall:

g++ -o main main.cpp hello.cpp factorial.cpp+ Makefile sử dụng các thành phần phụ thuộc

//makefile using dependenciesall: hello

hello: main.o factorial.o hello.og++ main.o factorial.o hello.o -o hello

main.o: main.cppg++ -c main.cpp

Page 7: Cach su dung Ubuntu

factorial.o: factorial.cppg++ -c factorial.cpp

hello.o: hello.cppg++ -c hello.cpp

#xoa di cac file rac .o trong qua trinh compilerclean:

rm -rf *o hello

2.3.3 Sử dụng biến môi trườngVí dụ với bài trênKhi 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 rootPhâ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

Page 8: Cach su dung Ubuntu

#đườ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 fileMAIN_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ữngfile .h include vào.

#compilerGXX = 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 ranhững cảnh báo về code chương trình giúp viết code tốt hơn.

#sourceSTUB = $(LIB_DIR)/ipc.cpp $(LIB_DIR)/person.cpp#chứa tên các file thành viên( phụ thuộc)

#objectOBJECT = ipc.o person.o#chứa tên các file object thành viên

#The Target#lệnhrun: 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 fileobject hoặc file executable cũ chẳng hạn

Page 9: Cach su dung Ubuntu

Một số lệnh với make:make gọi target đầu tiênmake <tên target> gọi target có tên được ghi ramake <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.hprerequisite2.h và prerequisite3.cpp→ ta có thể viết lại là:target1.o : prerequisite1.h prerequisite2.h prerequisite3.cpptarget2.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ếuchú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.

Page 10: Cach su dung Ubuntu

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ộttậ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 cungcấp một đích đến đặc biệt là .PHONYđể thông báo với make rằng đích đến ở đây khôngphải là một file thực sự.

+ Ví dụ:.PHONY: cleanclean:

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

makefilelà:→ 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

Page 11: Cach su dung Ubuntu

+ 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ùnglặ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 filecount_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

Page 12: Cach su dung Ubuntu

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 “,”

Page 13: Cach su dung Ubuntu

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.hfoo: $(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ịchfile 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

Page 14: Cach su dung Ubuntu

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 file2.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ệpkhô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

Page 15: Cach su dung Ubuntu

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ện2.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.

Page 16: Cach su dung Ubuntu

+ 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)

Page 17: Cach su dung Ubuntu

+ 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.