Makefile與Shell的問題
Makefile與Shell的問題
大概只要知道Makefile的人,都知道Makefile可以呼叫Shell指令碼。但是在實際使用時,並不那麼簡單,一些模稜兩可的地方可能會讓你抓狂。你若不信,可以先看幾個例子,想象一下這些這些例子會列印什麼內容,記下你想象的結果,然後在計算機上執行這些例子,對照看一下。
示例一: |
if [ "$(BUILD)" = "debug" ]; then echo "build debug"; else echo "build release"; fi all: echo "done" |
示例二: |
all: @CC=arm-linux-gcc @echo $(CC) |
示例三: |
CC=arm-linux-gcc all: @echo $(CC) |
示例四: |
SUBDIR=src example all: @for subdir in $(SUBDIR); / do/ echo "building " $(subdir); / done |
說明:
1. Shell指令碼在target裡才有效,其它地方都被忽略掉了。所以示例一中,”build debug”之類的字串根本列印不出來。示例一的正確寫法是:
示例一: |
all: if [ "$(BUILD)" = "debug" ]; then echo "build debug"; else echo "build release"; fi echo "done" |
2. make把每一行Shell指令碼當作一個獨立的單元,它們在單獨的程式中執行。示例二中,兩行Shell指令碼在兩個莫不相干的程式裡執行,第一個程式把CC設定為arm-linux-gcc,第二個程式是不知道的,所以列印的結果自然不是arm-linux-gcc了。示例二的正確寫法是:
示例二: |
all: @CC=arm-linux-gcc; echo $(CC) |
或者: |
all: @CC=arm-linux-gcc; / echo $(CC) |
3. make在呼叫Shell之前先進行預處理,即展開所有Makefile的變數和函式。這些變數和函式都以$開頭。示例三中,Shell拿的指令碼實際上是echo arm-linux-gcc,所以列印結果正確。
4. make預處理時,所有以$開頭的,它都不會放過。要想引用Shell自己的變數,應該以$$開頭。另外要注意,Shell自己的變數是不需要括號的。示例四的正確寫法是:
示例四: |
SUBDIR=src example all: @for subdir in $(SUBDIR); / do/ echo "building " $$subdir; / done |
相關文章
- cmake Makefile面試問題面試
- 編寫VCS執行使用的makefile遇到的問題
- Shell變數的作用域問題變數
- shell 變數賦值問題變數賦值
- shell 中的 set -e 導致的退出問題
- [20230310]nc reverse bash shell問題.txt
- [20231109]bash shell快捷鍵alt+number的問題.txt
- [20231029]使用cygwin調式bash shell引出的問題.txt
- [20231102]除錯bash shell指令碼遇到的問題.txt除錯指令碼
- [20210107]編寫bash shell指令碼遇到的問題.txt指令碼
- 靜態連結動態連結的連結順序問題和makefile示例
- Shell 解決Redis Slow Log去重問題Redis
- 執行 shell 指令碼 \r 問題解決指令碼
- Makefile引用與環境變數變數
- 【Makefile】5-Makefile變數的基礎變數
- Linux Shell 指令碼的 10 個有用的“面試問題和解答”Linux指令碼面試
- Linux Shell指令碼的10個有用的“面試問題和解答”Linux指令碼面試
- Shell 一行程式碼搞定大問題行程
- makefile--變數與函式的綜合示例變數函式
- makefile--函式定義與呼叫函式
- Makefile
- shell指令碼放到crontab裡就執行不成功的問題指令碼
- GNU工程管理器make與Makefile教程
- NSError ** 與 throws 的三個問題Error
- PHP 與 JS 的編碼問題PHPJS
- 解決訪問 GitHub 與 clone 很慢的問題Github
- 解決訪問Github與clone很慢的問題Github
- SDK與問題排查
- Gradle 技巧與問題Gradle
- makefile =和:=的區別
- 主題 1 The Shell
- shell練習題
- Makefile學習之路(2) — Makefile的變數和萬用字元變數字元
- makefile--if條件判斷語句的語法與使用
- 『忘了再學』Shell基礎 — 2、Shell的作用與分類
- socket的半包,粘包與分包的問題
- 探索Redis與MySQL的雙寫問題RedisMySql
- @AllArgsConstructor與@Value共用的問題解決Struct