make是用來管理一個工程項目的工具 .
Makefile就是這個項目文件 .
1.Makefile 是由若干條規則組成的,每個規則的語法如下所示 :
#規則 targets: prerequisites command
#舉例 main.c func1.c hello: main.o func1.o gcc main.o func1.o -o hello main.o: main.c gcc -c main.c func1.o: func1.c gcc -c func1.c
2.makefile的時間戳
對於已經編譯過一次的工程,如果沒有對源文件進行修改,目標文件是不會重復編譯的,這樣編譯效率比較高.
也就是說,如果目標文件和依賴文件的時間戳是一樣的,就不會重新編譯,
如果目標文件的時間戳比依賴文件的時間戳舊,就會重新編譯.
3.偽目標
對於工程的清理, 需要寫一個clean功能,這種類似的功能, 不需要依賴文件,這種命令 稱作 偽目標.
#偽目標 # .PHONY: xxx .PHONY: clean clean: rm -rf *.o hello .PHONY: install
install: cp hello /usr/bin .PHONY: uninstall uninstall: rm /usr/bin/hello
4.makefile 的變量
1.用戶自定義變量 2.預定義變量 3.自動變量
#用戶自定義變量 --宏 OBJ = main.o func1.o ... hello : $(OBJ) gcc $(OBJ) -o hello #預定義變量 AR --> ar CC --> 編譯器 ARFLAGS --> 庫編譯選項 CFLAGS --> C編譯器選項 #舉例 CFLAGS = -g -c gcc $(CFLAGS) func.c #自動變量 $* --> 不包含擴展名的目標文件名稱 #main.o : main.c $* 表示main.o 中的main $< --> 表示第一個依賴文件的名稱 $? --> 所有時間戳比目標文件晚的依賴文件 $@ --> 目標文件的完成名稱 $^ --> 所有不重復的依賴文件 # hello : main.o func1.o # $(CC) $^ -o $@
5.makefile 條件判斷
#條件判斷不能用tab 打頭 hello: main.o func1.o ifeq ($(CC),gcc) gcc $^ -o $@ else $(CC) $^ -o $@ endif
6.Makefile的嵌套和引用
一個工程是由一層一層Makefile的嵌套組成的 .每個Makefile文件負責管理不同的部分,然后通過嵌套和引用,來管理整個工程的源碼 .
#包含 include proc/makefile #嵌套 subsystem: $(MAKE) -C subdir
7.makefile 管理命令
-C dir | 執行指定文件夾下面的makefile |
---|---|
-f file | 讀入當前文件夾下的file 為 Makefile |
-i | 忽略所有命令執行的錯誤 |
-I dir | 指定被包含(include)的Makefile 的路徑 |
-C 用於迭代, /-
|-Makefile |-srcA | |-xx.c | |-Makefile |
|-srcB |-xx.c |-Makefile #在根目錄下的Makefile $(MAKE) -C srcA $(MAKE) -C srcB
8.用偽目標生成多個文件
.PHONY: all all: tar1 tar2 tar3 tar1: tar1.o $(CC) $^ -o $@ tar2: tar2.o $(CC) $^ -o $@ tar3: tar3.o $(CC) $^ -o $@