代码之家  ›  专栏  ›  技术社区  ›  saramah

我可以有一个makefile来构建一个层次化的项目吗?

  •  0
  • saramah  · 技术社区  · 15 年前

    我的问题是:如果一个目录中有大量的文件,并且有很多子文件夹,我如何告诉make生成所有这些文件,而不必指定每个子文件夹作为路径的一部分?我怎样才能在根目录中只使用一个Makefile来实现呢?

    this 几乎可以回答我的问题,但它要求您指定所有文件名:\

    4 回复  |  直到 8 年前
        1
  •  1
  •   orip    15 年前

    我确信一个纯gmake解决方案是可能的,但是使用一个外部命令来修改makefile,或者生成一个外部的makefile(您可以 include

    大致如下:

    all: myprog
    
    find_sources:
        zsh -c 'for x in **/*.cpp; echo "myprog: ${x/.cpp/.o}" >> deps.mk'
    
    include deps.mk
    

    然后跑

    make find_sources && make
    

    注意:确切的zsh行可能需要一些转义才能在make文件中工作,例如$$而不是$。也可以用bash+find替换。

        2
  •  1
  •   dashesy    15 年前

    DIRS = relative/path1\
           relative/path2
    
    dd = absolute/path/to/subdirectories
    all:
    @$(foreach dir, $(DIRS), $(MAKE) -C $(dd)$(dir) build -f ../../Makefile ;)
    build:
         ... build here
    

    但也有一种更好的方法,它涉及虚假目标,它可以更好地显示进度和错误,并在一个文件夹出现问题时停止生成,而不是继续到其他目标:

    .PHONY: subdirs $(DIRS)
    
    subdirs: $(DIRS)
    
    $(DIRS):
        $(MAKE) -C $@ build -f ../../Makefile
    all : prepare subdirs
    ...
    build :
    ... build here
    

    同样,我在这里只使用一个Makefile,它应该适用于所有子项目。对于孙子文件夹中的每个子项目,使用根目录中的一个Makefile创建目标“build”。

        3
  •  0
  •   paquetp    15 年前

    我将首先使用通配符函数的组合: http://www.gnu.org/software/make/manual/make.html#Wildcard-Function

    http://www.gnu.org/software/make/manual/make.html#Selective-Search

    以及文件功能 http://www.gnu.org/software/make/manual/make.html#File-Name-Functions

    对于排除(即:Jonathan Leffler提到的备份),使用vpath之外的单独文件夹进行备份,并使用良好的隐式规则。

    您仍然需要定义要对哪些文件夹执行操作,但不需要定义其中的每个文件。

        4
  •  0
  •   Beta    15 年前

    要编译给定目录下的每个源文件,然后将它们全部链接起来,我建议使用简单的递归:要生成对象,请在此处编译所有源文件,将生成的对象(带有完整路径)添加到顶部源目录的列表中,在此处递归到所有目录中。要链接,请使用列表。