Bash 如何编写简单的分层Makefile?

Bash 如何编写简单的分层Makefile?,bash,build,makefile,Bash,Build,Makefile,几天前,我在stack overflow上发布了一个关于如何编写分层make的答案(http://stackoverflow.com/questions/1498213/make-hierarchical-make-file). 答案被删除了,因此我认为它是完全错误的或离题的(或两者兼而有之) 我想知道如何编写分层Makefile。这是一个调用子目录中多个Makefile的Makefile。我假设目录结构如下: - project |--module1 |--Makefile

几天前,我在stack overflow上发布了一个关于如何编写分层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
以下项目生成文件有什么问题:

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_包看起来很奇怪。混合for循环的替代方法有点短,但我不确定它是否更好(因为我需要依赖bash): 包裹=\ 模块1\ 模块2\ 图3

TARGETS=clean install all

.PHONY: $(TARGETS)
default: all

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS))

$(TARGETS): 
    for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p $@ || break; done
谢谢

这里有“龙”。这是可以做到的,但其影响可能很微妙

谷歌,“递归使被认为是有害的”。您将得到非常好(简单)的插图,确切地说明您想要什么(例如,分层制作),以及陷阱/问题的良好解释。一些“回应”将讨论可能的“最佳实践”,以及缓解问题的方法。然后,您可以决定提出的问题是否对您的应用程序具有吸引力

原稿:

其他一些链接:


标志的分配有效吗?您使用的是哪个版本的Make?一个非递归解决方案:可能对您有用,也可能不有用,但对于管理复杂的项目,我发现cmake方法更简单。建立CMakeLists.txt的层次结构非常容易。Makefiles将自动生成。@Beta:1)是的,
标志
赋值有效…为什么?2) Makefile版本是3.81。