Makefile 递归执行

在实际工程项目中,各个源文件通常存放在各个不同的目录中,make在编译工程项目时,会依次遍历各个不同的子目录,编译每个子目录下的源文件,这是如何做到的呢?很简单,使用下面的命令就可以了:

# make -C subdir1 subdir2 subdir3 ...

make会依次到subdir1、subdir2、subdir3子目录下去执行make程序。上面的make 命令就等价于:

# cd subdir1 && $(MAKE)
# cd subdir2 && $(MAKE)
# cd subdir3 && $(MAKE)

当然,在subdir1、subdir2、subdir3子目录下,也得有对应的Makefile文件,否则make就会运行报错。为了给大家演示下make是如何遍历各个子目录的,我们新建一个工程如下:

wit@pc:/home/makefile/demo# tree
.
├── makefile
├── subdir1
│   └── makefile
├── subdir2
│   └── makefile
└── subdir3
    └── makefile

3 directories, 4 files

这个项目有3个子目录,每个子目录下分别有对应的源文件和Makefile,为了简化,我们只添加了Makefile文件,每个Makefile文件的内容如下:

#subdir1/makefile:
all:
    echo "make in subdir1"

#subdir2/makefile:
all:
    echo "make in subdir2"

#subdir3/makefile:
all:
    echo "make in subdir3"

项目底层目录的Makefile文件内容如下:

.PHONY:all
all:
    @echo "make start"
    make -C subdir1
    make -C subdir2
    make -C subdir3
    @echo "make done"

在项目根目录下执行make命令,可以看到make的顺序如下:

wit@pc:/home/makefile/demo# make
make start
make -C subdir1
make[1]: Entering directory '/home/makefile/demo/subdir1'
echo "make in subdir1"
make in subdir1
make[1]: Leaving directory '/home/makefile/demo/subdir1'
make -C subdir2
make[1]: Entering directory '/home/makefile/demo/subdir2'
echo "make in subdir2"
make in subdir2
make[1]: Leaving directory '/home/makefile/demo/subdir2'
make -C subdir3
make[1]: Entering directory '/home/makefile/demo/subdir3'
echo "make in subdir3"
make in subdir3
make[1]: Leaving directory '/home/makefile/demo/subdir3'
make done

通过打印信息我们看到,make通过 -C subdir参数,会分别到各个子目录下去执行,解析各个子目录下的Makefile并运行,遍历完所有的子目录,make最后才会退出。

《Makefile工程实践》视频教程,一线开发工程师独家录制,网上首家讲解Makefile的实战课程。从零开始,教你一步一步编写一个工程项目的Makefile,支持使用第三方静态库、动态库,支持指定模块或目录编译生成静态库、动态库,赠送企业级的Makefile模板,学完即可拿来使用,投入项目开发实战,具备独立开展项目开发和管理的能力。详情请点击淘宝链接:Linux三剑客