2016-07-07 4 views
0

Моя цель - сгенерировать файл (MyOut.elf) и, , если этот файл сгенерирован, сгенерируйте другие два файла (MyOut.s19 и size.txt), которые зависят от этот файл.make: .SECONDARY target breaks buld

Я совсем новичок в Makefiles, но я написал следующее:

.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 

Вместо этого, если я uncomment Последняя строка .SECONDARY:, цепь зависимостей кажется «сломанной», так как она останавливается после первой цели (MyOut.elf):

> del *.elf         

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

TARGET          

Тогда, если я бегу сделать снова, зависимые файлы MyOut.s19 и size.txt построены:

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

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

TARGET          

Итак, мои вопросы:

  • Почему это происходит?
  • Как я могу решить эту проблему? (Примечание: Я не могу удалить .SECONDARY директивы, так как это является частью Makefile автоматически генерируемым Eclipse)
+0

Когда вы удаляете '* .elf', что произойдет, если вы также удалите два других файла из предыдущего запуска? – 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 - промежуточный файл, то make может оставить достаточно достаточно одного. Он не будет беспокоить обновление b или конечную цель, если только некоторые предпосылки b не являются более новыми, чем эта цель, или есть какая-то другая причина для обновления этой цели.

Поэтому мои «промежуточные файлы» MyOut.s19 и size.txt не перестраиваются. Мое решение тогда работает, так как цель otherTargets никогда не генерирует выходной файл, поэтому он всегда нуждается в обновлении.