2014-09-25 3 views
1

В проекте у меня есть:Работа с Makefile, исходных генераторов и генерации зависимостей с НКУ

  • main.cpp
  • template.sth
  • гораздо

Для каждого .cpp файла Я генерирующего .o файл. Благодаря тому, что я мог бы написать простое правило для всех .o целей (упрощенной, немного версии немного pseudcode для большей ясности):

OBJS = #list of all .o files needed 

%.o: %.cpp 
    g++ -MM -MF %.d -MP -MT %.o %.cpp 
    g++ -c -o %.o %.cpp 

Тогда я включаю все существующие .d файлов, так что после каждого поколения я освежающие зависимости ,

Это сработало, если бы у меня не было template.sth. Этот файл содержит некоторый шаблон для генерации файлов h и cpp файлов.

Когда один файл, т.е. main.cpp включает в себя файл, созданный из template.sth (позволяет сказать gen.h):

  1. Инструкция генерации .d файл не работает, потому что gen.h отсутствует: fatal error: gen.h: No such file or directoryinclude "gen.h"
  2. Даже если эти инструкции будут работать, есть проблема с моим «рабочим процессом». До сих пор я мог создать файл .d для следующего make. Он работал, потому что для добавления новых зависимостей требуется изменить одну из текущих зависимостей. Поэтому после добавления одного .o происходит перестройка и создается новое .d. Теперь мне нужно обнаружить, что перед тем, как сделать .o, мне нужно сгенерировать gen.h от template.sth.

Есть ли способ сделать это автоматически? Проблема 1. может быть решена, если есть способ сообщить g++, что если отсутствует файл .h, он может просто добавить его в зависимости. После решения проблемы 1. Выполнение make несколько раз (я думаю, что дважды это всегда достаточно) в конечном итоге со встроенным проектом (первый make будет генерировать файлы зависимостей, затем второй make видит, что main.cpp зависит от gen.h, gen.h отсутствует и есть инструкция, как создайте gen.h, чтобы он создал gen.h перед зданием main.o).

Если это невозможно сделать как-нибудь автоматически, как его можно решить? Могу ли я написать в Makefile инструкциях, которые будут строить все сгенерированные файлы перед любыми другими или мне нужно вручную добавить этот сгенерированный файл в качестве зависимостей во всех инструкциях .o?

UPDATE:

После нескольких изменений, с -MG флагом g++ генерирует правильные файлы даже для gen.h. Теперь я могу создать свой проект с двумя командами make. Сначала создадим правильные файлы .d и сломаем, потому что gen.h отсутствует. У второго будет .d файлов, готовых, поэтому он будет генерировать gen.h перед зданием main.o, поэтому здание main.o будет успешным.

Есть ли способ сгенерировать файл .d, а затем использовать его, прежде чем генерировать .o?

ответ

0

Вам необходимо добавить зависимостей для сгенерированных файлов:

gen.h: template.sth 
     ...command to create gen.h from template.sth 

Если у вас есть много сгенерированных файлов, вы можете захотеть способ создания этих зависимостей автоматически, что будет зависеть от того, как вы их генерации.

Кроме того, вы хотите, чтобы генерировать .D файлы независимо от .o файлов и использовать -MG флаг при создании их игнорировать недостающие файлы:

%.d: %.cpp 
     g++ -MM -MF [email protected] -MP -MG $< 

-include $(OBJS:.o=.d) 

Таким образом, в первый раз вы запускаете сделать , он будет генерировать файлы .d с зависимостями, а затем перечитать их и пересчитать все зависимости, прежде чем пытаться построить что-нибудь еще.

+0

У меня есть это. Проблема в том, что в Makefile нет зависимости от main.o и gen.h. – Ari

+0

@Ari Правильно ли, что вы ищете автоматический способ добавления 'gen.h' в список зависимостей' main.o'? Обратите внимание, что объектные файлы зависят от всех заголовков, которые они включают, поэтому зависимости, такие как 'main.o → gen.h', должны быть в вашем файле Makefile.' Gen.h' был сгенерирован или нет. –

+0

@ MichaelGrünewald Да, так же, как я добавляю негенерированные зависимости. – Ari

Смежные вопросы