1.makefile書寫規則:
規則包括兩個部分:依賴關係和生成目標的方法
makefile中第一條規則中的目標將被確立爲最終目標,其他的目標都是被這個目標所連帶出來的,如果第一條規則中的目標有很多個,那麼,第一個目標灰成爲最終目標。
main.o:main.c main.h
cc -g main.c //說明如何生成main.o這個文件
上面例子說明:main.o依賴於main.c和 main.h生產的目標。main.c和main.h是目標所依賴的源文件。
文件的依賴關係發生條件:1.main.o文件不存在
2.main.c和mian.h文件的日期要比main.o的文件日期要新。
規則告訴make兩件事,文件的依賴關係和如何成成目標文件
=========================================================================================================================
2.在規則中使用通配符:
make支持三個通配符:“*”,“?”,“[...]”
擴展知識:
wildcard:擴展通配符(通配符(wildcard)用來指定一組符合條件的文件名)
notdir:去除路徑
patsubst:替換通配符
--------------------------------------------------------------------------------------------------------------------------------------------------------------
例子:
在test目錄下,建立a.c和b.c兩個文件,在sud目錄下,建立sa.c和sb.c兩個文件。建立一個簡單的Makefile:
src = $(wildcard *.c ./sub/*.c) #將./下和./sub目錄下的所有的.c文件,全部展開
dir = $(notdir $(src)) #將./和./sub目錄下的.c文件去掉路徑名。
obj = $(patsubst %.c,%.o,$(dir))#將./和./sub目錄下的全部.c文件替換成.o文件
all:
@echo "src的打印結果是:$(src)"
@echo "dir的打印結果是:$(dir)"
@echo "obj的打印結果是:$(obj)"
@echo "××××××××打印完畢××××××××××"
打印結果:
src的打印結果是:a.cb.c ./sub/sa.c ./sub/sb.c
dir的打印結果是:a.cb.c sa.c sb.c
obj的打印結果是:a.ob.o sa.o sb.o
××××××××打印完畢××××××××××
用函數wildcard得到當前目錄下的所有c語言源程序文件名的方法 SRC=$(wildcard *.c)
如果還要要獲得子目錄sub下的文件,則可寫成:SRC=$(wild *c) $(wildcard ./sub/*.c )
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
正常情況下make會先打印每一條命令語句,然後再執行,這叫回聲。在語句前面加上"@",關閉回聲。就像上面幾句echo語句前加了@,所以沒有打印語句。
==========================================================================================================================
3.模式匹配符
Make命令允許對文件名進行類似於正則運算的匹配。主要用到的匹配符“%”。
---------------------------------------------------------------------------------------------------------------------------------------------------
例如:如果當前目錄下的有main.c和 foo.c兩個文件,現在要將他們編譯爲對應的對象文件。
%.o : %.c
相當於:
main.o : main.c
foo.o : foo.c
------------------------------------------------------------------------------------------------------------------------------------------------------
使用匹配符%,可以將大量同類型的文件,只用一條規則就完成構建
==========================================================================================================================
4.變量和賦值符
Makefile一共提供了四個賦值運算符:=、:=、?=、+=。
= :在執行時擴展,允許遞歸擴展
:= :在定義時擴展
?= :只有在該變量爲空時才設置值
+= :將值追加到變量的尾端
Makefile允許使用等號自定義變量。在調用時要用 $()括起來。在調用shell變量時美元符號前,再加一個美元符號,這是因爲Make命令會對美元符號轉義。
例如:
a= hello world
test:
@echo $(a)
@echo $$HOME
輸出結果:
hello world
/home/ubuntu
==========================================================================================================================
5.內置變量
Make命令提供一系列內置變量。$(CC)指向當前使用的編譯器,$(MAKE)指向當前使用的make工具
===========================================================================================
6.自動變量
1.$@ :指當前目標,Make命令當前構建的那個目標。
例如:
a.txt b.txt:
touch $@
運行結果:
在當前目錄下創建了a.txt 和b.txt兩個文件。
所以上面的相當於:
a.txt:
touch a.txt
b.txt:
touch b.txt
2.$< :指代第一個前置條件
例如:a: b c 那麼$<指代a
3.$^ : 指代所有的前置條件
例如:a: b c 那麼$<指代a b
4.$? :指代比目標更新的所有前置條件,之間以空格分隔.
例如:a: b c 如果b的時間比a的時間新。那麼$?指代b
5.$* :指代匹配符%匹配的部分
例如:%匹配a.txt中的a,那麼$*指代a
6.$(@D)和$(@F) : $(@D):指向$@的目錄
$(@F):指向$@的文件名
例如:$@指代 test/a.c 則:$(@D)指代test $(@F)指代a.c
7.$(>D)和$(>F) :$(>D):指向$>的目錄
$(>F):指向$>的文件名