Makefile 递归传递变量

当make依次遍历到各个子目录下解析新的Makefile时,项目顶层目录的主Makefile定义的一些变量,是如何传递到子目录的Makefile文件中的呢?我们还是以上面的Makefile为例,在项目顶层目录的Makefile中,定义了一个变量:WEB=zhaixue.cc

.PHONY:all

WEB = zhaixue.cc

all:
    @echo "make start"
    @echo "WEB = $(WEB)"
    make -C subdir1
    make -C subdir2
    make -C subdir3
    @echo "make done"

然后在各个子目录的Makefile下面分别打印这个WEB变量的值:

#subdir1/makefile:
all:
    @echo "make in subdir1"
    @echo "sundir1:WEB = $(WEB)"

在工程项目的顶层目录执行make命令,可以看到WEB变量在各个子目录下的打印值:

wit@pc:/home/makefile/demo# make
make start
WEB = zhaixue.cc
make -C subdir1
make[1]: Entering directory '/home/makefile/demo/subdir1'
make in subdir1
sundir1:WEB = 
make[1]: Leaving directory '/home/makefile/demo/subdir1'
make -C subdir2
make[1]: Entering directory '/home/makefile/demo/subdir2'
make in subdir2
sundir2: WEB = 
make[1]: Leaving directory '/home/makefile/demo/subdir2'
make -C subdir3
make[1]: Entering directory '/home/makefile/demo/subdir3'
make in subdir3
sundir3: WEB = 
make[1]: Leaving directory '/home/makefile/demo/subdir3'
make done

通过打印值我们可以看到:除了在顶层目录的Makefile中WEB变量的值是zhaixue.cc,在其他三个子目录中WEB变量的值都是为空,这说明底层目录Makefile中的变量并没有传递到各个子目录中。

修改顶层目录的主Makefile,讲变量WEB使用export声明为环境变量:

.PHONY:all

export WEB = zhaixue.cc

all:
    @echo "make start"
    @echo "WEB = $(WEB)"
    make -C subdir1
    make -C subdir2
    make -C subdir3
    @echo "make done"

再次运行make命令,通过各个子目录下的打印值可以看到:在主Makefile通过export声明的变量WEB已经正确地传递到各个子目录的Makefile中。

wit@pc:/home/makefile/demo# make
make start
WEB = zhaixue.cc
make -C subdir1
make[1]: Entering directory '/home/makefile/demo/subdir1'
make in subdir1
sundir1:WEB = zhaixue.cc
make[1]: Leaving directory '/home/makefile/demo/subdir1'
make -C subdir2
make[1]: Entering directory '/home/makefile/demo/subdir2'
make in subdir2
sundir2: WEB = zhaixue.cc
make[1]: Leaving directory '/home/makefile/demo/subdir2'
make -C subdir3
make[1]: Entering directory '/home/makefile/demo/subdir3'
make in subdir3
sundir3: WEB = zhaixue.cc
make[1]: Leaving directory '/home/makefile/demo/subdir3'
make done
《Makefile工程实践》视频教程,一线开发工程师独家录制,网上首家讲解Makefile的实战课程。从零开始,教你一步一步编写一个工程项目的Makefile,支持使用第三方静态库、动态库,支持指定模块或目录编译生成静态库、动态库,赠送企业级的Makefile模板,学完即可拿来使用,投入项目开发实战,具备独立开展项目开发和管理的能力。详情请点击淘宝链接:Linux三剑客