【问题标题】:Generating IDL entities using automake/Makefile.am使用 automake/Makefile.am 生成 IDL 实体
【发布时间】:2011-03-26 13:46:43
【问题描述】:

对于那些不熟悉 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。

【问题讨论】:

    标签: build-process makefile automake idl libtool


    【解决方案1】:

    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.c“生成”Foo.hFooHelper.hFooHelper.c 的附加规则确保并行构建不会尝试运行$(THE_GENERATE_COMMAND) 两次。这是the Automake manual 中详细介绍的一个习惯用法,适用于并行构建。这里还有一点脆弱性:如果用户删除(比如)FooHelper.hFooHelper.c 并启动并行生成,它可能会并行运行规则的$(MAKE) $(AM_MAKEFLAGS) $&lt; 恢复部分多次。正如手册所说,只有在用户手动破坏构建树的情况下才会发生这种竞争,即使这样,make clean; make 也无法解决问题。

    BUILT_SOURCES 行确保 Foo.cFoo.hFooHelper.hFooHelper.c 在尝试构建 myprogram 之前构建(请参阅 Automake 手册的 this section 以了解为什么只是将它们添加到myprog_SOURCES 不足)。 EXTRA_DIST 变量确保.idl 文件将被make dist (reference) 捕获。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多