Создание сущностей IDL с помощью Automake / Makefile.am
-
26-09-2019 - |
Вопрос
Для тех, кто не знаком с IDL (языком описания интерфейса), оно тезисы Описание данных для использования через платформы (Java, C, C ++ и др.). У моего проекта есть зависимости foo.c, foo.h, fooheelper.c и fooheelper.h, которые генерируются из foo.idl. Как мне запустить произвольную команду, когда Foo.idl меняется, но все равно включает Foo.c, fooheelper.c, в процессе сборки?
Мои текущие попытки добавить правило к makefile.am - надежда заключается в том, что правило скопировано на сгенерированное makefile.
Я пытался:
Foo.idl : Foo.idl
${the_generate_command}
А затем добавил foo.idl в my_program_sources, но он не работает the_generate_command при строительстве.
У меня был успех, создающий от IDL с
Foo.c Foo.h FooHelper.h FooHelper.c : Foo.idl
${the_generate_command}
Но это не добавит foo.c, fooheelper.c к процессу компиляции, поэтому они никогда не построены, просто сгенерированы The_generate_command!
Весь код (включая IDL) находится в $ project_dir / src.
Решение
Ответ RQ практически правильный, но не пропускает пару тонкостей. Попробуй это:
bin_PROGRAMS = myprogram
myprogram_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c $(OTHER_SOURCES)
BUILT_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c
EXTRA_DIST = Foo.idl
MAINTAINERCLEANFILES = Foo.c Foo.h FooHelper.h FooHelper.c
Foo.c: Foo.idl
$(THE_GENERATE_COMMAND)
Foo.h FooHelper.h FooHelper.c: Foo.c
@if test -f $@; then \
touch $@; \
else \
## Recover from the removal of $@
rm -rf $<; \
$(MAKE) $(AM_MAKEFLAGS) $<; \
fi
Дополнительные правила для «генерации» Foo.h
, FooHelper.h
и FooHelper.c
от Foo.c
Убедитесь, что параллельные сборки не будут пытаться работать $(THE_GENERATE_COMMAND)
дважды. Это идиома подробно в Руководство по автоматике который будет работать на параллельные сборки. Здесь еще немного хрупкость: если пользователь удаляет (скажем) FooHelper.h
и FooHelper.c
и начинает параллельно сделать, это может запустить $(MAKE) $(AM_MAKEFLAGS) $<
Извлечение части правила несколько раз параллельно. По словам руководства, эта гонка может произойти, если пользователь вручную изумивает дерево сборки, и даже тогда это ничего не make clean; make
не может исправить.
То BUILT_SOURCES
линия гарантирует что Foo.c
, Foo.h
, FooHelper.h
и FooHelper.c
построены, прежде чем пытаться построить myprogram
(видеть эта секция руководства Automake, чтобы увидеть, почему просто добавлять их в myprog_SOURCES
недостаточно). То EXTRA_DIST
Переменная гарантирует, что .idl
Файл будет захвачен make dist
(Справка).
MAINTAINERCLEANFILES
Указывает дополнительные файлы для удаления при запуске make maintainer-clean
; Это необходимо соблюдать Стандарты Makefile GNU. Отказ Смотрите также описание переменной в Руководство по автоматике.