Makefile學習總結之規則的命令

2021-10-01 05:45:28 字數 1572 閱讀 4583

通常系統中可能存在多個不同的shell。但在make處理makefile過程中,如果沒有明確指定,那麼對所有規則中命令列的解析使用「/bin/sh」來完成;

命令回顯:make在執行命令列之前會把執行的命令列輸出到標準輸出裝置。

如果規則的命令列以字元「@」開始,則make在執行這個命令時就不會回顯這個將要被執行的命令。典型的用法是在使用「echo」命令輸出一些資訊時。

如:@echo 開始編譯***模組

執行時,將會得到「開始編譯 *** 模組…」這條輸出資訊。如果在命令列之前沒有

字元「@」,那麼,make 的輸出將是:

echo編譯***模組…

編譯***模組…

在乙個規則的命令中,命令列「cd」改變目錄不會對其後的命令的執行產生影響。就是說其後的命令執行的工作目錄不會是之前使用「cd」進入的那個目錄。如果要實現這個目的,就不能把「cd」和其後的命令放在兩行來書寫。而應該把這兩條名寫在一行上,用分號分隔。這樣它們才是乙個完整的shell命令列。

foo : bar/lose

cd bar;gobble lose > .

./foo

通過make命令列選項「-j」或者「-job」來告訴make在同一時刻可以允許多條命令同時被執行。

並行執行命令帶來的問題:

a) 多個同時執行的命令的輸出資訊將同時被輸出到終端。當出現錯誤時很難根據一大堆凌亂的資訊來區分是哪條命令執行錯誤;

b) 在同乙個時刻可能存在多個命令執行過程同時讀取標準輸入,但是對於標準輸入裝置來說,在同一時刻只能存在乙個程序訪問它。

「-l」選項告訴make限制當前執行的任務的數量(make所限制的只是它本身所需要占用的系統負載,而不能通過它去控制其它的任務所占用的系統負載)。

-l 2.5

make當系統平均負荷高於2.5時,不在啟動任何執行命令的子任務。不帶浮點數的」-l」選項用於取消前面「-l」給定的負荷限制;

需要將乙個在上層定義的變數傳遞給子make,應該在上層makefile中使用指示符「export」對此變數進行宣告

export variable…
當不希望將乙個變數傳遞給子make時,可以使用指示符「unexport」來宣告這個變數:

unexport variable…

9. 同時使用「define」定義的一組命令稱為乙個命令包。定義乙個命令包的語法以「define」開始,以「endef」結束,例如:

define run-yacc

yacc $(firstword $^)

mv y.tab.c $@

endef

「run-yacc」是這個命令包的名字。在「define」和「endef」之間的命令就是命令包的主體。需要說明的是:使用「define」定義的命令包中,命令體中變數和函式的引用不會展開。命令體中所有的內容包括「$」、「(」、「)」等都是變數「run-yacc」的定義。

10. 空命令:

target:;
空命令列可以防止make在執行時試圖為重建這個目標去查詢隱含命令(包括了使用隱含規則中的命令和「.default」)指定的命令。

Makefile學習之規則

1 ifeq debug true 2 cc gcc g 生成debug版本,才可以生成除錯資訊,對程式進行除錯,3else 4 cc gcc 5 endif 6.phony all clean 偽目標,讓編譯器無條件執行,每次都會執行 7 all test 這裡預設編譯test,hello是不編譯...

Makefile系列之規則

語法 targets prerequisites command command targets 目標,可以是空格分開的多個檔案,也可使用萬用字元 prerequitites 依賴,根據依賴更新後是否需要重建目標,將依賴分為兩種,用 進行分割,需要 不需要 把更新後不需要重建目標的依賴稱為 orde...

makefile學習筆記 書寫規則 規則舉例

20180413 makefile學習筆記 書寫規則 規則舉例 規則包含兩個部分,乙個是依賴關係,乙個是生成目標的方法。在makefile中,規則的順序是很重要的,因為,makefile中只應該有乙個最終目標,其他的目標都是被這個目標所連帶出來的,所以一定要讓make知道你的最終目標是什麼。一般來說...