Генерация IDL-сущностей с помощью automake / Makefile.am - PullRequest
1 голос
/ 07 августа 2010

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

Мои текущие попытки добавить правило в Makefile.am - надеждаявляется то, что правило копируется в сгенерированный Makefile.

Я попытался:

Foo.idl : Foo.idl
 ${the_generate_command}

, а затем добавил Foo.idl в my_program_SOURCES, но он не запускает команду_generate_command при сборке.1008 *

Я успешно произвел генерацию из IDL с

Foo.c Foo.h FooHelper.h FooHelper.c : Foo.idl
 ${the_generate_command}

Но это не добавит Foo.c, FooHelper.c в процесс компиляции, поэтому они никогда не собираются, просто генерируютсяby_generate_command!

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

1 Ответ

2 голосов
/ 30 августа 2010

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) дважды. Это идиома, подробно описанная в руководстве Automake , которое будет работать для параллельных сборок. Здесь все еще есть небольшая уязвимость: если пользователь удаляет (скажем) 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 ( reference ).

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

...