1

IDL(インターフェース記述言語)に慣れていない人のために、プラットフォーム(java、c、c ++など)で使用するためにデータ記述を抽象化します。私のプロジェクトには、Foo.idlから生成された依存関係Foo.c、Foo.h、FooHelper.c、およびFooHelper.hがあります。Foo.idlが変更されたときに任意のコマンドを実行し、ビルドプロセスにFoo.c、FooHelper.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、FooHelper.cはコンパイルプロセスに追加されないため、ビルドされることはなく、the_generate_commandによって生成されるだけです。

すべてのコード(idlを含む)は$ PROJECT_DIR/srcにあります。

4

1 に答える 1

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 $@; then \
        touch $@; \
    else \
## Recover from the removal of $@
        rm -rf $<; \
        $(MAKE) $(AM_MAKEFLAGS) $<; \
    fi

「生成」するための追加のルール、Foo.hおよびFooHelper.h並列ビルドが2回実行されないようにするための追加ルール。これは、並列ビルドで機能するAutomakeマニュアルで詳しく説明されているイディオムです。ここにはまだ少し脆弱性があります。ユーザーが(たとえば)削除して並列作成を開始すると、ルールの回復部分を複数回並列で実行する可能性があります。マニュアルに記載されているように、この競合は、ユーザーがビルドツリーを手動で切断した場合にのみ発生する可能性があり、それでも修正できないことはありません。FooHelper.cFoo.c$(THE_GENERATE_COMMAND)FooHelper.hFooHelper.c$(MAKE) $(AM_MAKEFLAGS) $<make clean; make

このBUILT_SOURCES行は、ビルドを試みる前Foo.cFoo.h、、、FooHelper.hおよびFooHelper.cがビルドされることを確認しmyprogramます(Automakeマニュアルのこのセクションmyprog_SOURCESを参照して、それらを追加するだけでは不十分な理由を確認してください)。変数は、ファイルが(参照)によってキャプチャされるEXTRA_DISTことを保証します。.idlmake dist

MAINTAINERCLEANFILES実行時に削除する追加フ​​ァイルを指定しますmake maintainer-clean; これは、 GNUMakefile標準に準拠するためです。Automakeマニュアルの変数の説明も参照してください。

于 2010-08-30T03:53:28.943 に答える