makefile
中包含五種內容:顯式規則,隱式規則,變數定義,指令(directive
)和注釋。
1.顯式規則――描述如何生成規則的目標,它列出了目標依賴的檔案,指定了產生或更新目標的命令。
2.隱式規則――描述如何生成基於檔名的一類檔案,說明目標可能依賴於和其檔名類似的檔案,指定了相應的命令。
3.指令――類似於編譯器的偽指令,包含:指示make
讀入另乙個makefile;
決定是否忽略makefile
中的一部分;
4.變數定義--定義乙個變數;
5.注釋――一行中『#』
開始是注釋,直到行末,除非遇到續行符號。在define
和命令中不能有注釋,其它情況下注釋可出現在任何地方。
makefile
的常見語法規則:
target ...
:dependencies...
(tab) command
(tab)...
target
一般為程式所生成的檔名。例如,是可執行檔名或目標檔名;乙個目標也可以是乙個將要執行的動作的名稱,見下例中的clean
。dependencies
就是作為輸入檔案,被用來生成目標檔案。乙個目標檔案可以由好幾個輸入檔案編譯而成。
command
就是make
所執行的動作,可以由好幾個命令組成,每個命令獨佔一行。注意,每個命令列開頭必須有乙個
tab鍵,千萬不要忘記。
通常,命令是用來編譯輸入檔案以生成目標檔案的。當然,命令也可以不需要任何依賴(dependencies)
。除了上述語法規則模組,乙個makefile
檔案可能還包含其他內容。 #
注釋行
\ 續行符
$makefile
中允許使用簡單的巨集指代原始檔及其相關編譯資訊,在linux
中也稱巨集為變數。在引用巨集時只需在變數前加$
符號。但值得注意的是,如果變數名的長度超過乙個字元,在引用時就必須加圓括號()。
下面都是有效的巨集引用:
$(cflags)
$2 $z
$(z)
其中最後兩個引用是完全一致的。
舉例:objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
,那麼在makefile
檔案中,可用$(objects)
代替上述八個.o
檔案。
$* 不包含副檔名的目標檔名稱。
$+所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。
$<
第乙個依賴檔案的名稱。
$?所有依賴檔案,以空格分開,這些依賴檔案的修改日期比目標檔案的建立日期晚。
$@目標的完整名稱。
$^所有的依賴檔案,以空格分開,不包含重複的依賴檔案。
$%如果目標是歸檔成員,則該變數表示目標的歸檔成員名。
@ 命令如果以"@"
起始,則@
符號禁止列印輸出它所在的命令列
### makefile
結束###
[ ]
[ expression ]
相當於test expression
。用於shell
的邏輯判斷。
要注意在[
的後面和]
符號的前面要有乙個空格。
expression
選項:
-r file
使用者可讀為真
-w file
使用者可寫為真
-x file
使用者可執行為真
-f file
檔案為正規檔案為真
-d file
檔案為目錄為真
-c file
檔案為字元特殊檔案為真
-b file
檔案為塊特殊檔案為真
-s file
檔案大小非0
時為真
-t file
當檔案描述符(
預設為1)
指定的裝置為終端時為真
條件測試:
-a 與
-o或 !
非exit 0
或exit 1
退出時的返回值主要用來判斷程式進行的如何:區別是人為的,你可以自己定義退出值的含義。但是一般用0
表示正常退出,>0
的表示各種含義的異常退出。
& &
使用& &
的一般形式為:命令1 &&
命令2
只有& &
左邊的命令(命令1
)返回真(
即返回0
,成功被執行),& &
右邊的命令(命令2
)才能夠被執行;換句話說,「如果這個命令執行成功& &
那麼執行這個命令」。
舉例:[ -f /bin/awk ] && exit 0
如果/bin/awk
檔案存在,則正常退出。
|| 使用||
的一般形式為:命令1 ||
命令2
如果||
左邊的命令(命令1
)未執行成功,那麼就執行||
右邊的命令(命令2
);或者換句話說,「如果這個命令執行失敗了||
那麼就執行這個命令」。
舉例:[ -f /bin/awk ] || exit 1
如果/bin/awk
檔案不存在,則異常退出。
| f1|f2
表示將f1
的輸出通過管道送至f2
作為輸入
f1|f2|f3
表示將f1
的輸出作為f2
的輸入,然後把f2
的結果(輸出)作為f3
的輸入,還可以繼續將f3
的輸出定向到某乙個檔案如: f1|f2|f3>/tmp /file. out
for 迴圈
for語句的結構如下:
for variable in arg1 arg2 … argn ;
do command
command …
done
舉例,如果要安裝多個程式,
可以通過乙個迴圈來完成:
programs=cp ls rm
install:
for p in $(programs); do \
$(install_program) $$p $(bindir)/`echo $$p | sed '$(transform)'`; \
done
uninstall:
for p in $(programs); do \
rm -f $(bindir)/`echo $$p | sed '$(transform)'`; \
done
說明: 1
、p表示從cp ls rm
其中的乙個,直到for
結束為止。 2
、p代表cp ls rm
中的乙個。 3
、$$p
,第二個$
表示p所代表的變數的值,在這裡是cp ls rm
中的乙個。前面的$
表示在這個變數的前面加上符號$。
xargs
通過緩衝方式並以前面命令列的輸出作為引數,呼叫隨後的命令。它可以使使用者對前面命令所匹配到的檔案執行幾乎所有的系統命令。
舉例:-find romfs -name cvs | xargs rm –rf
在romfs
目錄中查詢名字為cvs
的檔案,並刪除之。
if… …fi
條件判斷,其中fi
是用來判斷乙個if
邏輯結構結束的標誌。
if - then語句
格式: if command1
then
command2
command3
fi### (if
語句結束) ###
command4
每個程式或命令執行結束後都有乙個返回的狀態,使用者可以用shell
變數$?
獲得這一狀態。if
語句檢查前面命令執行的返回狀態,若該命令成功執行,那麼在then
和fi之間的命令都將被執行。在上面的命令序列中,command1
和command4
總要執行。若command1
成功執行,command2
和command3
也將執行。
makefile編寫規則
目標 要生成的目標檔案 依賴 目標檔案由哪些檔案生成 命令 通過執行該命令由依賴檔案生成目標 代表目標 代表全部依賴 第一依賴 第一變化的依賴 2020 8 3 wildcard可以進行檔案匹配 patsubst 內容的替換 makefile的變數 代表目標 代表全部依賴 第一依賴 第一變化的依賴 ...
Makefile檔案編寫 八 隱含規則
參考 makefile教程 makefile檔案編寫1天入門 makefile 的隱含規則,所謂的隱含規則就是不需要我們做出具體的操作,由系統自動完成。編寫 makefile 的時候,可以使用隱含規則來簡化makefile 檔案編寫。例項 test test.o gcc o test test.o ...
makefile編寫(一)基本規則
一 乙個簡單的例子 建立乙個malefile檔案如下 mian.o main.c a.h gcc c main.c 1.o 1.c a.h b.h gcc c 1.c 2.o 2.c b.h c.h gcc c 2.c 2 3 cc gcc 4 5 debug 6 cflags i.g wall a...