使用automake / Makefile.am生成IDL实体

时间:2010-08-06 21:42:29

标签: build-process makefile automake idl libtool

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

1 个答案:

答案 0 :(得分: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.hFooHelper.cFoo.c的其他规则可确保并行版本不会尝试运行$(THE_GENERATE_COMMAND)两次。这是the Automake manual中详述的习惯用法,适用于并行构建。这里仍然有一点脆弱性:如果用户删除(例如)FooHelper.hFooHelper.c并启动并行make,它可以并行多次运行规则的$(MAKE) $(AM_MAKEFLAGS) $<恢复部分。正如手册所说,只有当用户手动毁坏构建树时才会发生这种竞争,即使这样,make clean; make也无法修复。

BUILT_SOURCES行确保在尝试构建Foo.c之前构建Foo.hFooHelper.hFooHelper.cmyprogram(请参阅{{ 3)} Automake手册,了解为什么只将它们添加到myprog_SOURCES是不够的。 EXTRA_DIST变量可确保.idlthis section)捕获make dist文件。

MAINTAINERCLEANFILES指定在运行make maintainer-clean时要删除的其他文件;这是为了遵守reference。另请参阅GNU Makefile Standards中变量的说明。