【发布时间】:2012-07-08 14:43:20
【问题描述】:
几天前,我在堆栈溢出中发布了一个关于如何编写分层 make 的答案(http://stackoverflow.com/questions/1498213/make-hierarchical-make-file)。答案已被删除,因此我认为它完全错误或偏离主题(或两者兼而有之)。
我想知道如何编写分层 Makefile。这是一个在子目录中调用多个 Makefile 的 Makefile。我假设目录结构如下:
- project
|--module1
|--Makefile
|--...
|--module2
|--Makefile
|--module2.1
|--module2.2
|--...
|--module3
|--Makefile
|--...
|--etc
我还假设项目成员只同意最小的 makefile 目标集,例如:all(默认)、clean、install 等。因此,包括 make 标志在内的以下命令将传播到模块:
cd project
make clean
make -k
make install
#etc
以下项目 Makefile 有什么问题:
PACKAGES = \
module1 \
module2 \
emodule3
VIRTUAL_PACKAGES = $(addsuffix /.virtual.Makefile,${PACKAGES})
TARGETS=clean install all
.PHONY: $(TARGETS)
default: all
FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS))
$(TARGETS): $(VIRTUAL_PACKAGES)
$(VIRTUAL_PACKAGES):
$(MAKE) $(FLAGS) -C $(@D) $(MAKECMDGOALS)
是的,Makefile 中的 $VIRTUAL_PACKAGES 看起来很奇怪。混合 for 循环的替代方法要短一些,但我不确定它是否更好(因为我需要依赖 bash): 包 = \ 模块1\ 模块2\ emodule3
TARGETS=clean install all
.PHONY: $(TARGETS)
default: all
FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS))
$(TARGETS):
for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p $@ || break; done
谢谢!
【问题讨论】:
-
对
FLAGS的分配有效吗?您使用的是哪个版本的 Make? -
可能对你有用也可能没用,但对于管理复杂的项目,我发现 cmake 更容易。拥有 CMakeLists.txt 的层次结构真的很容易。 Makefile 会自动生成。
-
@Beta: 1) 是的,
FLAGS分配有效...为什么? 2) Makefile 版本为 3.81。