2010-08-06 2 views
1

Для тех, кто не знаком с IDL (языком описания интерфейса), он абстрагирует описание данных для использования на разных платформах (java, c, C++ и т. Д.). Мой проект имеет зависимости Foo.c, Foo.h, FooHelper.c и FooHelper.h, которые сгенерированы из Foo.idl. Как выполнить произвольную команду при изменении Foo.idl, но все еще включить Foo.c, FooHelper.c в процессе сборки?Создание объектов IDL с использованием automake/Makefile.am

Мои текущие попытки добавляют правило 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, FooHelper.c в процессе компиляции, поэтому они никогда не построили, только порождена the_generate_command!

Весь код (включая idl) находится в $ PROJECT_DIR/src.

ответ

2

Ответ 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 [email protected]; then \ 
     touch [email protected]; \ 
    else \ 
## Recover from the removal of [email protected] 
     rm -rf $<; \ 
     $(MAKE) $(AM_MAKEFLAGS) $<; \ 
    fi 

Дополнительные правила «генерировать» Foo.h, FooHelper.h и FooHelper.c от Foo.c гарантировать, что параллельно сборках не будет пытаться запустить $(THE_GENERATE_COMMAND) дважды. Это идиома, подробно описанная в the Automake manual, которая будет работать для параллельных сборок. Здесь все еще немного хрупкость: если пользователь удаляет (скажем) FooHelper.h и FooHelper.c и запускает параллельный make, он может несколько раз запускать часть восстановления $(MAKE) $(AM_MAKEFLAGS) $<. Как говорится в руководстве, эта гонка может произойти только в том случае, если пользователь вручную искажает дерево сборки, и даже тогда ничего не стоит make clean; make.

BUILT_SOURCES линия гарантирует, что Foo.c, Foo.h, FooHelper.h и FooHelper.c построены, прежде чем пытаться построить myprogram (см this section в руководстве Automake, чтобы понять, почему просто добавить их в myprog_SOURCES недостаточно). Переменная EXTRA_DIST гарантирует, что файл .idl будет снят make dist (reference).

MAINTAINERCLEANFILES указывает дополнительные файлы для удаления во время работы make maintainer-clean; это должно соответствовать GNU Makefile Standards. См. Также описание переменной в the Automake manual.