2016-07-07 92 views
0

我的目标是生成一个文件(MyOut.elf)和,如果这个文件生成,生成其他两个文件(MyOut.s19和size.txt)依赖于该文件。make:.SECONDARY目标打破buld

我在makefile文件相当多的新手,但我写了下面:

.DEFAULT_GOAL := full 

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

# Tool invocations 
MyOut.s19: MyOut.elf 
    @echo 'Building S19 : [email protected]' 
    @echo 'MyOut.s19: MyOut.elf' > MyOut.s19 
    @echo 'Finished building target: [email protected]' 
    @echo ' ' 

size.txt: MyOut.elf 
    @echo 'Building section size summary : [email protected]' 
    @echo 'size.txt: MyOut.elf' > size.txt 
    @echo 'Finished building target: [email protected]' 
    @echo ' ' 


all: MyOut.elf 

MyOut.elf: 
    @echo 'Building ELF: [email protected]' 
    @echo 'MyOut.elf' > MyOut.elf 
    @echo 'Finished building target: [email protected]' 
    @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将自动生成的生成文件的一部分)
+0

当您删除'* .elf'时,如果您还从前一个make run中删除了另外两个文件,会发生什么? – Kusalananda

+0

@Kusalananda:如果我删除所有的输出文件,所有三个都正确重建。 – Nova

+0

...如果你取消注释'.SECONDARY:',删除'elf'文件并运行make,全部都被重建? – Kusalananda

回答

0

我找到了解决这样的:我加入一个新的“伪”目标otherTargets到的先决条件目标full的:

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不存在,并认为依赖于B的目标,这必然造成B,然后更新目标从b。但是如果b是一个中间文件,那么make可以单独保留足够好。它不会打扰更新b或最终目标,除非b的某些先决条件比目标更新或者有更新目标的其他原因。

因此,我的“中间文件”MyOut.s19size.txt不会重建。 我的解决方案然后工作,因为目标otherTargets从不生成输出文件,因此它总是需要更新。