浅显易懂 Makefile 入门 (09)— include 文件包含、MAKECMDGOALS
1. include文件包含
當 make 讀取到 include 關鍵字的時候,會暫停讀取當前的 Makefile,而是去讀 include 包含的文件,讀取結束后再繼讀取當前的 Makefile 文件。
include 使用的具體方式如下:
include <filenames>
filenames 是 shell 支持的文件名(可以使用通配符表示的文件)。
注意:
include關鍵字所在的行首可以包含一個或者是多個的空格(讀取的時候空格會被自動的忽略),但是不能使用Tab開始,否則會把include當作式命令來處理。
包含的多個文件之間要使用空格分隔開。使用include包含進來的Makefile文件中,如果存在函數或者是變量的引用,它們會在包含的Makefile中展開。
include 通常使用在以下的場合:
- 在一個工程文件中,每一個模塊都有一個獨立的
Makefile來描述它的重建規則。它們需要定義一組通用的變量定義或者是模式規則。通用的做法是將這些共同使用的變量或者模式規則定義在一個文件中,需要的時候用include包含這個文件。 - 當根據源文件自動產生依賴文件時,我們可以將自動產生的依賴關系保存在另一個文件中。然后在
Makefile中包含這個文件。
注意:如果使用
include包含文件的時候,指定的文件不是文件的絕對路徑或者是為當前文件下沒有這個文件,make會根據文件名會在以下幾個路徑中去找,
- 首先我們在執行
make命令的時候可以加入選項-I或--include-dir后面添加上指定的路徑,如果文件存在就會被使用; - 如果文件不存在將會在其他的幾個路徑中搜索:
usr/local/include和usr/include;
如果在上面的路徑沒有找到 include 指定的文件,make 將會提示一個文件沒有找到的警示提示,但是不會退出,而是繼續執行 Makefile 的后續的內容。
當完成讀取整個 Makefile 后,make 將試圖使用規則來創建通過 include 指定但不存在的文件。當不能創建的時候,文件將會保存退出。
使用時,通常用 -include 來代替 include 來忽略文件不存在或者是無法創建的錯誤提示,使用格式如下:
-include <filename>
使用方法和 include 的使用方法相同。
這兩種方式之間的區別:
include <filenames>,make在處理程序的時候,文件列表中的任意一個文件不存在的時候或者是沒有規則去創建這個文件的時候,make程序將會提示錯誤并保存退出;-include <filenames>,當包含的文件不存在或者是沒有規則去創建它的時候,make將會繼續執行程序,只有真正由于不能完成終極目標重建的時候我們的程序才會提示錯誤保存退出;
2. 使用示例
目錄結構如下:
wohu@ubuntu:~/cpp/func$ ls
common_variable demo.cpp demo.h Makefile
common_variable 內容如下:
a = 11
b = 22
c = 33
Makefile 內容如下:
include common_variable
all:echo $(a) $(b) $(c)
執行 make 之后
wohu@ubuntu:~/cpp/func$ make
echo 11 22 33
11 22 33
wohu@ubuntu:~/cpp/func$
3. MAKECMDGOALS
make 在執行時會設置一個特殊變量 – MAKECMDGOALS ,該變量記錄了命令行參數指定的終極目標列表,沒有通過參數指定終極目標時此變量為空。
ifeq ($(MAKECMDGOALS), aa cc)
obj = aa cc
else ifeq ($(MAKECMDGOALS), bb)
obj = bb
else
obj = other
endifaa:@echo $(obj)
bb:@echo $(obj)
cc:@echo $(obj)
other:@echo $(obj)
執行 make 結果
wohu@ubuntu:~/cpp/func$ make aa cc
aa cc
aa cc
wohu@ubuntu:~/cpp/func$ make aa
other
wohu@ubuntu:~/cpp/func$ make bb
bb
wohu@ubuntu:~/cpp/func$ make cc
other
wohu@ubuntu:~/cpp/func$
總結
以上是生活随笔為你收集整理的浅显易懂 Makefile 入门 (09)— include 文件包含、MAKECMDGOALS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国封装用胶膜行业运
- 下一篇: 浅显易懂 Makefile 入门 (10