процесс сборки, который генерирует заголовки в autotools

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

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

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

header.csv.h:
    python prebuild.py

# remainder for building objects and the file lib.a

Найдя эту ссылку для расширения правил по умолчанию, я добавил это к моему 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

Переделанный Makefiles по-прежнему не работал. Проверка сгенерированного 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 элементы, которые будут выполняться в процессе настройки? Как правильно справиться с подобным?


person Andrew Falanga    schedule 25.02.2015    source источник
comment
На самом деле все это не связано с автоинструментами ... но я приветствую вас за попытку преобразования. Я не такой храбрый.   -  person Ben Voigt    schedule 25.02.2015
comment
возможный дубликат зависимости заголовка в automake   -  person Ben Voigt    schedule 25.02.2015


Ответы (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

чтобы убедиться, что он перестраивается при изменении исходных данных или правил преобразования, а не при их изменении.

person Ben Voigt    schedule 25.02.2015
comment
Спасибо за четкий ответ. Я согласен с этой оценкой. В то время это казалось разумным. Теперь возникает вопрос, как мне переопределить правило, которое будет автоматически сгенерировано для этой единственной цели (я проверил, это всего лишь один файл * .cpp)? - person Andrew Falanga; 25.02.2015
comment
Вы не отменяете его, просто используйте оба правила. Из документации: Несколько правил для одной цели --- Один файл может быть целью нескольких правил. Все зависимости, упомянутые во всех правилах, объединяются в один список зависимостей для цели. Если цель старше любой зависимости от любого правила, команды выполняются. - person Ben Voigt; 25.02.2015
comment
Я не знаю, как с этим справиться. Я нашел правило, которое создает файл .o, которому нужен этот заголовок. Я помещаю что-то подобное в свой * Makefile.am: dir/object.o: header.csv.h. Однако это действительно переопределило правило, а это с расширяющегося сайта ... Таким образом, невозможно добавить новые зависимости ... без переопределения всего правила. Я использую не тот файл? Я думал, что этот объектный файл был предметом вашего предложения. - person Andrew Falanga; 25.02.2015
comment
@AndrewFalanga: Является ли автоматически сгенерированное правило шаблоном? В этом случае он не будет добавлен. Или, может быть, automake видит ваше правило, а не генерирует собственное? Изменится ли оно, если вы поместите свое правило в отдельный файл, а затем включите его из Makefile.am? - person Ben Voigt; 25.02.2015
comment
@AndrewFalanga: Ах, нашел ответ. И ваш вопрос фактически дублируется. - person Ben Voigt; 25.02.2015
comment
Да, не могу представить, что был первым. Как я уже упоминал, как новичок, я, вероятно, не знаю достаточно жаргона, чтобы найти ответ с помощью Google (мощный инструмент, но без правильных слов он бесполезен). Тем не менее, я буквально наткнулся на ответ. Эта переменная с моим правилом создания заголовка работает так, как мне нужно. - person Andrew Falanga; 25.02.2015
comment
@AndrewFalanga: Да, вопрос и ответ, я связал ваш вопрос с использованием этой переменной BUILT_SOURCES, а также описывает ограничения и обходные пути для его странного поведения. - person Ben Voigt; 25.02.2015