很多时候,我们的代码结构需要将源代码划分成多个子模块,每个模块应该可以单独编译和执行,而我们又希望有一个总的Makefile将他们串联起来,本文就是针对这一问题而来的。
方法1:
SUBDIRS = SUB_DIR_NAME_1 SUB_DIR_NAME_2
.PHONY: all
all:
@list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Clean in $$subdir";\
cd $$subdir && $(MAKE);\
done
.PHONY: clean
clean:
@list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Clean in $$subdir";\
cd $$subdir && $(MAKE) clean;\
done
方法2:
SUBDIRS = SUB_DIR_NAME_1 SUB_DIR_NAME_2
.PHONY: all
all:
@list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Clean in $$subdir";\
$(MAKE)-C $$subdir;\
done
.PHONY: clean
clean:
@echo Making clean
@list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Clean in $$subdir";\
$(MAKE)-C $$subdir clean;\
done
方法3:
SUBDIRS = SUB_DIR_NAME_1 SUB_DIR_NAME_2
.PHONY: all $(SUBDIRS)
all: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
SUB_DIR_NAME_2 : SUB_DIR_NAME_1
.PHONY: clean
clean:
@echo Making clean
@list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Clean in $$subdir";\
$(MAKE) -C $$subdir clean;\
done
注释:
1.
-C DIR
--directory=DIR
在读取Makefile之前,进入目录“DIR”,就是切换工作目录到“DIR”之后执行make。存在多个“-C”选项时,make的最终工作目录是第一个目录的相对路径。如:“make –C / -C etc”等价于“make –C /etc”。一般此选项被用在递归地make调用中。
--directory=DIR
在读取Makefile之前,进入目录“DIR”,就是切换工作目录到“DIR”之后执行make。存在多个“-C”选项时,make的最终工作目录是第一个目录的相对路径。如:“make –C / -C etc”等价于“make –C /etc”。一般此选项被用在递归地make调用中。
2.
在递归调用时,使用$(MAKE)而不是make:
1)
变量“MAKE”的值是“make”。如果其值为“/bin/make”那么上边规则的命令就为“cd subdir && /bin/make”。这样做的好处是:当我们使用一个其它版本的make程序时,可以保证最上层使用的make程序和其子目录下执行的make程序保持一致。
2)
变量“MAKE”的这个特点是:在规则的命令行中如果使用变量“MAKE”,标志“-t”、“-n”和“-q”在这个命令的执行中不起作用。尽管这些选项是告诉make不执行规则的命令行,但包含变量“MAKE”的命令行除外,它们会被正常执行。同时,执行make的命令行选项参数被通过一个变量“MAKEFLAGS”传递给子目录下的make程序。
1)
变量“MAKE”的值是“make”。如果其值为“/bin/make”那么上边规则的命令就为“cd subdir && /bin/make”。这样做的好处是:当我们使用一个其它版本的make程序时,可以保证最上层使用的make程序和其子目录下执行的make程序保持一致。
2)
变量“MAKE”的这个特点是:在规则的命令行中如果使用变量“MAKE”,标志“-t”、“-n”和“-q”在这个命令的执行中不起作用。尽管这些选项是告诉make不执行规则的命令行,但包含变量“MAKE”的命令行除外,它们会被正常执行。同时,执行make的命令行选项参数被通过一个变量“MAKEFLAGS”传递给子目录下的make程序。

本文介绍三种使用Makefile组织和编译子目录的方法。这些方法可以帮助开发者更有效地管理大型项目,确保各子模块能够独立编译且整体项目可以通过一个总Makefile文件进行统一编译。

被折叠的 条评论
为什么被折叠?



