【问题标题】:Subdirectories and Makefiles子目录和 Makefile
【发布时间】:2011-03-30 12:41:43
【问题描述】:

我认为这是一个已经被问过很多次但我找不到正确方法的问题。

我有以下结构:

project/
project/Makefile
project/code
project/code/*.cc
project/code/Makefile

当我在“项目/代码”目录中并调用“make project_code”时,我的代码正在正确编译。

当我在'project/'中时,我想这样做,就像我在'project/code'中一样调用“make project_code”。

makefile 'project/Makefile' 将包含其他规则(例如 'install')和一些编译规则,就像我在 'project/code' 中一样。为此,我请求您的帮助...谢谢。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    最简单的方法是:

    CODE_DIR = code
    
    .PHONY: project_code
    
    project_code:
           $(MAKE) -C $(CODE_DIR)
    

    .PHONY 规则表示project_code 不是需要构建的文件,-C 标志表示目录发生变化(相当于在调用make 之前运行cd code)。您可以使用相同的方法调用 code Makefile 中的其他目标。

    例如:

    clean:
           $(MAKE) -C $(CODE_DIR) clean
    

    【讨论】:

    • 谢谢,它有效!最后一件事:是否总是定义 $(MAKE) ?
    • $(MAKE) 是对您定义的变量的引用吗?还是那是始终存在的内置函数?
    • 它内置在 GNU Make 中,参见手册:gnu.org/software/make/manual/make.html#MAKE-Variable
    • 有没有办法抑制这个调用的输出? @$(MAKE) 没有按预期工作。
    • 如何为多个子目录做到这一点?当我尝试将另一个子目录目标附加到 PHONY 时,只运行第一个目标。
    【解决方案2】:

    尝试将此规则放在类似这样的项目/Makefile 中(对于 GNU make):

    .PHONY:项目代码 项目代码: cd 代码 && 制作

    【讨论】:

    • 这将不工作,因为默认情况下,在 GNU make 中,规则主体的每一行都在不同的 shell 中执行。因此, cd 会发生,但执行它的 shell 会立即退出;然后'make'将单独执行。事实上,我相信这会使 make 陷入无限递归循环。但是,如果您将代码更改为“cd code && make”,它将按预期工作。
    • 4 年后编辑以符合建议
    • @EmanueleCipolla 四年后竖起大拇指向精神致敬。
    • 到目前为止,我们已经快四年了,这再次证明make 是一款永恒的软件,正确的Makefile 写作应该是每个基本计算机技能课程的一部分。
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 2021-05-19
    • 2021-05-08
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多