【问题标题】:Calling makefile in a subdirectory在子目录中调用 makefile
【发布时间】:2016-10-15 23:09:29
【问题描述】:

我有一个源代码文件夹结构如下

src
 |-tests
 |-abc

我在src 中有一个makefile,它有一个名为tests 的目标。 tests 有自己的makefile,用于将源代码编译成二进制文件。(多个目标)。所有这些都由测试目录中的 Makefile 管理。

我的src make 文件有以下目标。

all: main tests

main: $(DEPENDENCY IN SRC and ABC)
   command

tests: ??
     make -C tests

我可以在主 Makefile 中为测试目标指定什么依赖关系。我不希望这个 Makefile 知道测试文件夹中的源文件。

【问题讨论】:

    标签: makefile dependencies gnu-make


    【解决方案1】:
    all: main tests
    
    main: $(DEPENDENCY IN SRC and ABC)
       command
    
    tests:
         $(MAKE) -C tests
    

    这将无条件地在其私有子目录上调用 make of tests。请注意,使用特殊的 $(MAKE) 变量有助于传播命令行参数并减少开销。

    【讨论】:

      【解决方案2】:

      只需将目标声明为PHONY,这意味着make 不会检查任何生成的文件。相反,它只是始终执行规则,让对make 的辅助调用来决定需要构建什么。

      想一想:如果您有一个附加文件src/tests,会发生什么? make 会注意到该文件已经存在,并且由于没有指明先决条件,它将决定不制作该文件。防止您的规则 tests 被执行。

      all: main tests
      
      main: $(DEPENDENCY IN SRC and ABC)
          # Recipes (That is the word to describe commands in a make rule)
      
      .PHONY: tests
      
      tests:
           $(MAKE) -C tests
      

      还添加了 Alex 的答案:使用 $(MAKE) 是一个好习惯。并允许您的 makefile 独立于 make 程序的名称工作。想象一下,您有一个名为 xyz-make 的程序的发行版。

      【讨论】:

        【解决方案3】:

        我不希望这个 Makefile 知道测试文件夹中的源文件。

        也许,但您可能需要重新考虑。 Peter Miller 的 Recursive Make Considered Harmful 有力地证明了一个 Makefile 就是您所需要或想要的全部。很久以前,它改变了我的想法。

        【讨论】:

        • 对死链接投反对票
        猜你喜欢
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多