浅显易懂 Makefile 入门 (10)— 嵌套执行 make、export 的使用
1. 嵌套執行 make
在一個大的工程文件中,不同的文件按照功能被劃分到不同的模塊中,每個模塊可能都會有自己的編譯順序和規則,如果在一個 Makefile 文件中描述所有模塊的編譯規則,就會很亂,執行時也會不方便,所以就需要在不同的模塊中分別對它們的規則進行描述,也就是每一個模塊都編寫一個 Makefile 文件,這樣不僅方便管理,而且可以迅速發現模塊中的問題。這樣我們只需要控制其他模塊中的 Makefile 就可以實現總體的控制,這就是 make 的嵌套執行。
如何來使用呢?舉例說明如下:
subsystem:cd subdir && $(MAKE)
這個例子可以這樣來理解,在當前目錄下有一個目錄文件 subdir 和一個 Makefile 文件,子目錄 subdir 文件下還有一個 Makefile 文件,這個文件是用來描述這個子目錄文件的編譯規則。
使用時只需要在最外層的目錄中執行 make 命令,當命令執行到上述的規則時,程序會進入到子目錄中執行 make。這就是嵌套執行 make,我們把最外層的 Makefile 稱為是總控 Makefile。
上述的規則也可以換成另外一種寫法:
subsystem$(MAKE) -C subdir
在 make 的嵌套執行中,我們需要了解一個變量 CURDIR,此變量代表 make 的工作目錄。當使用 make 的選項 -C 的時候,命令就會進入指定的目錄中,然后此變量就會被重新賦值。
總之,如果在 Makefile 中沒有對此變量進行顯式的賦值操作,那么它就表示 make 的工作目錄。我們也可以在 Makefile 中為這個變量賦一個新的值,當然重新賦值后這個變量將不再代表 make 的工作目錄。
2. export 的使用
使用 make 嵌套執行的時候,變量是否傳遞也是我們需要注意的。如果需要變量的傳遞,那么可以這樣來使用:
export <variable>
如果不需要那么可以這樣來寫:
unexport <variable>
<variable> 是變量的名字,不需要使用 $ 這個字符。如果所有的變量都需要傳遞,那么只需要使用 export 就可以,不需要添加變量的名字。
export VALUE1 := export.c <-- 用了 export, 此變量能夠傳遞到 ./other/Makefile 中
...
@cd ./other && make
...
export 語法格式如下:
export variable = value
export variable := value
export variable += value
Makefile 中還有兩個變量不管是不是使用關鍵字 export 聲明,它們總會傳遞到下層的 Makefile 中。這兩個變量分別是 SHELL 和 MAKEFLAGS,特別是 MAKEFLAGS 變量,包含了 make 的參數信息。
如果執行總控 Makefile 時,make 命令帶有參數或者在上層的 Makefile 中定義了這個變量,那么 MAKEFLAGS 變量的值將會是 make 命令傳遞的參數,并且會傳遞到下層的 Makefile 中,這是一個系統級別的環境變量。
make 命令中有幾個參數選項并不傳遞,它們是:-C、-f、-o、-h 和 -W。如果我們不想傳遞 MAKEFLAGS 變量的值,在 Makefile 中可以這樣來寫:
subsystem:cd subdir && $(MAKE) MAKEFLAGS=
3. 嵌套執行示例
目錄結構如下:
wohu@ubuntu:~/cpp/func$ tree
.
├── demo.cpp
├── demo.h
├── Makefile
└── subdir└── Makefile1 directory, 4 files
wohu@ubuntu:~/cpp/func$
當前目錄下的 Makefile 內容:
export GLOBAL_VAR = 123
SUBDIR = ./subdir all:echo "this is main Makefile"echo $(GLOBAL_VAR)cd $(SUBDIR) && $(MAKE)
subdir 目錄下的 Makefile 內容:
all:echo "this is subdir Makefile"echo "display GLOBAL_VAR" $(GLOBAL_VAR)
在當前目錄下執行 make 輸出結果
wohu@ubuntu:~/cpp/func$ make
echo "this is main Makefile"
this is main Makefile
echo 123
123
cd ./subdir && make
make[1]: Entering directory '/home/wohu/cpp/func/subdir'
echo "this is subdir Makefile"
this is subdir Makefile
echo "display GLOBAL_VAR" 123
display GLOBAL_VAR 123
make[1]: Leaving directory '/home/wohu/cpp/func/subdir'
wohu@ubuntu:~/cpp/func$
總結
以上是生活随笔為你收集整理的浅显易懂 Makefile 入门 (10)— 嵌套执行 make、export 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅显易懂 Makefile 入门 (09
- 下一篇: 2022-2028年中国聚碳酸亚丙酯(P