Вопрос

Для тех, кто не знаком с 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. Отказ Смотрите также описание переменной в Руководство по автоматике.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top