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.hFooHelper.h确保并行构建不会尝试运行两次。这是Automake 手册中详述的一个习惯用法,适用于并行构建。这里仍然有一点脆弱性:如果用户删除(比如说)并启动并行 make,它可能会并行运行规则的恢复部分多次。正如手册所说,只有当用户手动破坏构建树时,才会发生这种竞争,即便如此,也没有什么是无法修复的。FooHelper.cFoo.c$(THE_GENERATE_COMMAND)FooHelper.hFooHelper.c$(MAKE) $(AM_MAKEFLAGS) $<make clean; make

该行BUILT_SOURCES确保在尝试构建之前构建Foo.cFoo.h和(请参阅Automake 手册的这一部分以了解为什么仅将它们添加到是不够的)。该变量确保文件将被( reference ) 捕获。FooHelper.hFooHelper.cmyprogrammyprog_SOURCESEXTRA_DIST.idlmake dist

MAINTAINERCLEANFILES指定运行时要删除的附加文件make maintainer-clean;这是为了遵守GNU Makefile 标准。另请参阅Automake 手册中的变量描述。

于 2010-08-30T03:53:28.943 回答