浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行
1. shell 相關
1.1 默認 shell
Makefile 所使用的命令是由 shell 命令行組成,他們是一條一條執行的。
多個命令之間要使用分號隔開,Makefile 中的任何命令都要以 tab 鍵開始。
多個命令行之間可以有空行和注釋行,在執行規則時空行會被自動忽略。
通常系統中可能存在不同的 shell 。但是 make 處理 Makefile 過程時,如果沒有明確的指定,那么對所有規則中的命令行的解析使用 bin/sh 來完成。
如:
all:echo $(SHELL)
執行 make 之后結果
wohu@ubuntu:~/cpp/func$ make
echo /bin/sh
/bin/sh
wohu@ubuntu:~/cpp/func$
1.2 執行 shell
語法:
$(shell <shell command>)
它的作用就是執行一個 shell 命令, 并將 shell 命令的結果作為函數的返回.
作用和 <shell command> 一樣, ` 是反引號
all:echo $(shell pwd)
執行 make 結果:
wohu@ubuntu:~/cpp/func$ make
echo /home/wohu/cpp/func
/home/wohu/cpp/func
wohu@ubuntu:~/cpp/func$
2. 命令回顯
通常 make 在執行命令行之前會把要是執行的命令行輸出到標準輸出設備。我們稱之為 “回顯”,如果規則的命令行以字符 @ 開始,則 make 在執行的時候就不會顯示這個將要被執行的命令。
示例:
all:@echo $(SHELL)
執行 make 之后結果
wohu@ubuntu:~/cpp/func$ make
/bin/sh
wohu@ubuntu:~/cpp/func$
在執行命令之前沒有字符 @,那么 make 的輸出將是 /bin/sh 。
Makefile 中書寫 shell 命令時可以加 2 種前綴 @ 和 -, 或者不用前綴。3 種格式的 shell 命令區別如下:
- 不用前綴:輸出執行的命令以及命令執行的結果, 出錯的話停止執行
- 前綴
@: 只輸出命令執行的結果, 出錯的話停止執行 - 前綴
-: 命令執行有錯的話, 忽略錯誤, 繼續執行
3. make 的參數
-n或者是--just-print,執行時只顯示所要執行的命令,但不會真正的執行這個命令,其中包括了使用的@字符開始的命令,通常用于檢查編寫的Makefile內容;-s或者是--slient則是禁止所有的執行命令的顯示,就好像所有的命令行都使用@開始一樣;
4. 命令的執行
當規則中的目標需要被重建的時候,此規則所定義的命令將會被執行,如果是多行的命令,那么每一行命令將是在一個獨立的子 shell 進程中被執行。
因此,多命令行之間的執行命令時是相互獨立的,相互之間不存在交互。
在 Makefile 中書寫在同一行中的多個命令屬于一個完整的 shell 命令行,書寫在獨立行的一條命令是一個獨立的 shell 命令行。
因此:在一個規則的命令中命令行
cd改變目錄不會對其后面的命令的執行產生影響。就是說之后的命令執行的工作目錄不會是之前使用cd進入的那個目錄。如果達到這個目的,就不能把cd和其后面的命令放在兩行來書寫。而應該把這兩個命令放在一行上用分號隔開。這樣才是一個完整的shell命令行。
all:cd /home/wohu/cpp/func;\pwd ; \ls
執行 make 結果
wohu@ubuntu:~/cpp/func$ make
cd /home/wohu/cpp/func;\
pwd ; \
ls
/home/wohu/cpp/func
demo.cpp demo.h Makefile
wohu@ubuntu:~/cpp/func$
如果想把一個完整的 shell 命令行書寫在多行上,需要使用反斜杠 \ 來對處于多行的命令進行連接,表示他們是一個完整的 shell 命令行。
5. 并發執行命令
GNU make 支持同時執行多條命令。通常情況下,同一時刻只有一個命令在執行,下一個命令只有在當前命令結束之后才能夠開始執行。不過可以通過 make 命令行選項 -j 或者 --jobs 來告訴 make 在同一時刻可以允許多條命令同時執行。
如果選項 -j 之后存在一個整數,其含義是告訴 make 在同一時刻可以允許同時執行的命令行的數目。這個數字被稱為 job slots。當 -j 選項中沒有出現數字的時候,使用默認的 job solts,值為 1,表示 make 將串行的執行規則的命令(同一時刻只能由一條命令被執行)。
并行執行命令所帶來的問題是顯而易見的:
- 多個同時執行的命令的輸出信息將同時被輸出到終端。當出現錯誤時很難根據一大堆凌亂的信息來區分那條命令執行錯誤;
- 在同一時刻可能會存在多個命令執行的進程同時讀取到標準輸入,但是對于標準輸入設備來說,在同一時刻只能存在一個進程訪問它。就是說在某個時間點,
make只能保證此刻正在執行的進程中的一個進程讀取標準輸入流。而其他的進程鍵的標準輸入流將設置為無效。因此在此一時刻多個執行命令的進程中只有一個進程獲得標準輸入,而其他的需要讀取標準輸入流的進程由于輸入流無效而導致致命的錯誤。
總結
以上是生活随笔為你收集整理的浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国pu管行业市场深
- 下一篇: 2022-2028年中国封装用胶膜行业运