2015-02-25 3 views
0

Я портирую домашнюю заготовку makefile в комплект автотетов. У меня возникла проблема, для которой я еще не нашел подходящего ответа. Возможно, я просто не использую правильные условия в своих поисках. Будучи полным неофитом для аутотипов, я, вероятно, просто не знаю достаточно жаргона.процесс сборки, который генерирует заголовки в autotools

Проблема: наш процесс сборки имеет зависимость от файла заголовка, который создается из файла csv. (.. Я не знаю, почему это, что это такое) В нашей старой системе, мы сделали что-то вроде этого:

.PHONY: all 
all : header.csv.h $(objects) 

header.csv.h: 
    python prebuild.py 

# remainder for building objects and the file lib.a 

Находить эту ссылку extend default rules, я добавил это мой Makefile.am

noninst_LIBRARIES = libstuff.a 

# .. Additional CXXFLAGS and CPPFLAGS, and listing the sources 

all-local: header.csv.h 

header.csv.h: 
    python prebuild.py 

Переделан Makefile s еще не работал. Проверка сгенерированного Makefile для этой части библиотеки показали следующее:

# lots of stuff preceeding 
all: all-am 
all-am: Makefile $(LIBRARIES) all-local 

all-local: header.csv.h 
# the rest as above 

Прямо там в all-am: проблема. Зависимости $(LIBRARIES) перечислены первыми и поэтому строятся сначала. Дальнейшее чтение расширенной ссылки выше показывает, что это следует ожидать: нет способа гарантировать порядок. Это достаточно просто, чтобы «исправить»: переместите all-local в начало $(LIBRARIES). Однако это только фиксирует его один раз. Я должен гарантировать, что это всегда строится в первую очередь.

Могу ли я добавить вещи к сценарию configure, который будет выполнен во время процесса настройки? Каков правильный способ справиться с чем-то подобным?

+0

Ничего из этого не связано с autotools ... но я приветствую вас за попытку преобразования. Я не такой храбрый. –

+0

Возможный дубликат [Зависимость заголовка в automake] (http://stackoverflow.com/questions/1779984/header-dependency-in-automake) –

ответ

1

Вы не должны писать правила, которые зависят от того, какие вещи перечислены в Makefile. Там нет причин, чтобы это правило на все (я понимаю, что это прямой перевод вашего старого Makefile - который также был неправ):

all-local: header.csv.h 

потому header.csv.h не строить продукт, который должен появиться в конце процесс изготовления. Вместо этого вам нужно

somesourcefile.o : header.csv.h 

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

Когда вы правильно определяете зависимости, make будет вычислять граф зависимостей и строить вещи в правильном порядке.

Кроме того, это правило

header.csv.h: 
    python prebuild.py 

почти наверняка будет

header.csv.h : header.csv prebuild.py 
    python prebuild.py 

, чтобы убедиться, что он получает перестроен когда либо исходные данные или правила перевода меняются, и не тогда, когда они этого не делают ,

+0

Благодарим вас за четкий ответ. Я согласен с этой оценкой.В то время это казалось разумным. Вопрос в том, как мне переопределить правило, которое будет автоматически сгенерировано для этой одной цели (я проверял, это всего лишь один файл .cpp)? –

+0

Вы не переопределяете его, просто используйте оба правила. Из документации: «Несколько правил для одной цели --- Один файл может быть объектом нескольких правил. Все зависимости, упомянутые во всех правилах, объединены в один список зависимостей для цели. Если цель старше чем любая зависимость от любого правила, команды выполняются ». –

+0

Я в затруднительном положении, а затем как справиться с этим. Я нашел правило, которое создает файл * .o, нуждающийся в этом заголовке. Я помещаю что-то вроде этого в свой * Makefile.am *: 'dir/object.o: header.csv.h'. Однако это ** ** переопределило правило, и это, начиная с расширяющегося сайта, «... Таким образом, невозможно добавить новые зависимости ... без переопределения всего правила». Я использую неправильный файл? Я думал, что этот объектный файл был предметом вашего предложения. –