一、Makefile中的引用
一個makefile中引用另一個makefile,其寫法與C語言include 類似。 make 命令開始時,會搜尋 include 所包含的其它 Makefile,並把其內容安置在當前的位置。
使用隱晦規則來書寫makefile
include Makefile.hello
run: main.o hello.o test.o
gcc -o run main.o hello.o test.o
.PHONY: clean
clean:
-rm run *.o
複製程式碼
Makefile.hello
hello.o: hello.c
gcc -c hello.c
複製程式碼
執行結果:
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# make run
cc -c -o main.o main.c
gcc -c hello.c
cc -c -o test.o test.c
gcc -o run main.o hello.o test.o
複製程式碼
Makefile檔案可以使用其他命名來區分,如Makefile.hello,如果要單獨執行Makefile.hello,只需要make -f Makefile.hello 或者 make --file Makefile.hello
include 其他makefile可包含路徑,如果沒有路徑。
- 優先在當前目錄搜尋
- 其次如果使用make -I 路徑 或者 make --include-dir 路徑,會在引數指定的位置搜尋
- 最後預設路徑(/usr/local/bin或者/usr/include)中搜尋
如果找不到該檔案,報錯。
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# make run
Makefile:1: Makefile.hello: No such file or directory
make: *** No rule to make target `Makefile.hello'. Stop.
複製程式碼
如果打算無法找到Makefile.hello檔案也要進行執行下去,只需在include前加個減號
-include Makefile.hello
複製程式碼
make會繼續執行下去。
二、環境變數
書中提到:但是在這裡我還是建議不要使用這個環境變數,因為只要這個變數一被定義,那麼當你使用 make 時,所有的 Makefile 都會受到它的影響,這絕不是你想看到的。在這裡提這個事,只是為了告訴大家,也許有時候你的 Makefile 出現了怪事,那麼你可以看看當前環境中有沒有定義這個變數。
環境變數和自定義變數 -》類似於“全域性變數”和“區域性變數” 建立個環境變數CWR
export CWR=666
複製程式碼
通過env來檢視所有環境變數
Makefile中輸出該變數cwr:
@echo $(CWR)
複製程式碼
@ 作用關閉命令回顯 執行結果:
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# make cwr
666
複製程式碼
在Makefile中定義該變數
CWR = 233
cwr:
@echo $(CWR)
複製程式碼
執行結果:
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# make cwr
233
複製程式碼
系統環境變數值被覆蓋。 書中反覆強調:不推薦把許多的變數都定義在系統環境中,這樣,在我們執行不用的Makefile 時,擁有的是同一套系統變數,這可能會帶來更多的麻煩。
不過我看很多廠商在編譯系統映象前,都會先source 一下廠商寫的環境變數指令碼。估計也是為了讓每個模組共通的部分集中在環境變數中,使得模組的Makefile看起來更簡潔更容易閱讀。