【问题标题】:make: .SECONDARY target breaks buldmake: .SECONDARY 目标打破灯泡
【发布时间】:2016-07-07 20:38:32
【问题描述】:

我的目标是生成一个文件 (MyOut.elf),如果生成了此文件,则生成其他两个依赖于该文件的文件(MyOut.s19 和 size.txt) .

我是 makefile 的新手,但我写了以下内容:

.DEFAULT_GOAL := full

full: MyOut.elf MyOut.s19 size.txt
    @echo TARGET

# Tool invocations
MyOut.s19: MyOut.elf
    @echo 'Building S19 : $@'
    @echo 'MyOut.s19: MyOut.elf' > MyOut.s19
    @echo 'Finished building target: $@'
    @echo ' '

size.txt: MyOut.elf
    @echo 'Building section size summary : $@'
    @echo 'size.txt: MyOut.elf' > size.txt
    @echo 'Finished building target: $@'
    @echo ' '


all: MyOut.elf

MyOut.elf:
    @echo 'Building ELF: $@'
    @echo 'MyOut.elf' > MyOut.elf
    @echo 'Finished building target: $@'
    @echo ' '

.PHONY: full
#.SECONDARY:

现在,如果我运行 make,一切都会按预期运行:

> make
Building ELF: MyOut.elf
Finished building target: MyOut.elf

Building S19 : MyOut.s19
Finished building target: MyOut.s19

Building section size summary : size.txt
Finished building target: size.txt

TARGET

相反,如果我取消注释最后一行 .SECONDARY:,则依赖链似乎“断开”,因为它在第一个目标 (MyOut.elf) 之后停止:

> del *.elf                                

> make                                     
Building ELF: MyOut.elf                    
Finished building target: MyOut.elf        

TARGET                                     

然后,如果我再次运行 make,将构建依赖文件 MyOut.s19size.txt

> make                                     
Building S19 : MyOut.s19                   
Finished building target: MyOut.s19        

Building section size summary : size.txt   
Finished building target: size.txt         

TARGET                                     

所以,我的问题是:

  • 为什么会这样?
  • 如何解决这个问题? (注意:我无法删除 .SECONDARY 指令,因为这是 Eclipse 自动生成的 makefile 的一部分)

【问题讨论】:

  • 当你删除 *.elf 时,如果你也从之前的 make run 中删除了另外两个文件会发生什么?
  • @Kusalananda:如果我删除所有输出文件,所有三个都将正确重建。
  • ...如果你取消注释.SECONDARY:,删除elf文件并运行make,所有的都重建了吗?
  • @Kusalananda:是的,如第一个示例中所述。问题是(正如我提到的)我无法删除 .SECONDARY,因为这是一个自动生成的 makefile
  • 这对我来说看起来不对。我建议您在 bug-make@gnu.org 邮件列表中将其作为可能的错误提出。

标签: makefile gnu-make target


【解决方案1】:

我找到了解决方案:我在目标 full 的先决条件中添加了一个新的“虚拟”目标 otherTargets

full: MyOut.elf otherTargets
otherTargets: MyOut.s19 size.txt

现在,当我运行 make 时,我得到了

Building ELF: MyOut.elf
Finished building target: MyOut.elf

Building section size summary : size.txt
Finished building target: size.txt

Building S19 : MyOut.s19
Finished building target: MyOut.s19

如果我第二次运行它,我会得到

make: Nothing to be done for `full'.

尽管如此,如果我删除 .elf 文件,“依赖”文件会正确重建。

我找到的这个解释与GNU make documentation有关:

如果一个普通文件 b 不存在,并且 make 考虑一个依赖于 b 的目标,它总是创建 b 然后从 b 更新目标。但是如果 b 是一个中间文件,那么 make 就可以不用管它了。它不会打扰更新 b 或最终目标,除非 b 的某些先决条件比该目标更新或有其他原因更新该目标。

因此,我的“中间文件”MyOut.s19size.txt 没有重建。 我的解决方案正在运行,因为目标 otherTargets 永远不会生成输出文件,因此它总是需要更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多