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三剑客