【问题标题】:Force gnu make to rebuild objects affected by compiler definition强制 gnu make 重建受编译器定义影响的对象
【发布时间】:2011-03-15 05:59:07
【问题描述】:

我有一个在命令行中接受选项的 makefile

make OPTION_1=1

基于该值,它将向对象子集添加额外的编译器定义。

ifeq ($(OPTION_1), 1)
CC_FLAGS += -DOPTION_1_ON
endif

定义中的更改会影响包含的头文件内容 - 存根或实现会暴露给目标文件。

如何让 make 重建受此选项更改“影响”的文件?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    我使用一个文件来记住这些选项的最后一个值,如下所示:

    .PHONY: force
    compiler_flags: force
        echo '$(CC_FLAGS)' | cmp -s - $@ || echo '$(CC_FLAGS)' > $@
    

    cmp || echo 位表示文件compiler_flags 仅在设置更改时才被触及,所以现在你可以写类似

    $(OBJECTS): compiler_flags
    

    只要编译器标志发生变化,就会导致$(OBJECTS) 的重建。每次运行 make 时都会执行 compiler_flags 的规则,但只有在实际修改了 compiler_flags 文件时才会触发 $(OBJECTS) 的重建。

    【讨论】:

    • 感谢您的示例。遗憾的是,如果没有临时文件,似乎无法做到这一点。
    • 已编辑以避免创建compiler_flags.tmp,使其看起来更整洁。不过,我怀疑这不是你的意思。没有办法创建 some 文件来记住设置,因为 make 没有其他方法可以跨多个调用保留状态。
    • 如果你的构建变得很大,这将不仅仅是一点点低效。它意味着一个 shell 调用和一个文件读取,即使是最新的构建。在这些情况下,在 filename. 中编码编译器标志
    • 您可以计算命令行的哈希摘要,并将其用作文件名的后缀。
    • @bobbogo 你能解释一下这怎么会变得低效?我相信每个make 都会执行一次规则,所以除非你有一个自动脚本来多次执行make,否则开销应该可以忽略不计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多