Makefile引用與環境變數

chenwr2018發表於2019-03-04

一、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來檢視所有環境變數

image
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看起來更簡潔更容易閱讀。

相關文章