2010-08-06 65 views
1

对于那些不熟悉IDL(接口描述语言)的人来说,它抽象了跨平台(java,c,C++等)使用的数据描述。我的项目有从Foo.idl生成的依赖项Foo.c,Foo.h,FooHelper.c和FooHelper.h。如何在Foo.idl更改时运行任意命令,但在构建过程中仍包含Foo.c,FooHelper.c?使用automake/Makefile.am生成IDL实体

我当前的尝试将一条规则添加到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中。

回答

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

附加规则“生成” Foo.h,从Foo.cFooHelper.hFooHelper.c确保并行编译不会尝试运行$(THE_GENERATE_COMMAND)两次。这是一个在the Automake manual中详细说明的成语,它可以用于并行构建。这里仍然有点脆弱:如果用户删除(比如说)FooHelper.hFooHelper.c并开始并行make,它可能并行地多次运行规则的$(MAKE) $(AM_MAKEFLAGS) $<恢复部分。正如手册所说,只有在用户手动切割构建树时,才会发生这种竞争,即使如此,它也不是无法修复的make clean; make

BUILT_SOURCES线确保Foo.cFoo.hFooHelper.hFooHelper.c正在努力建设myprogram前建成(见的Automake手册this section明白为什么只是把它们添加到myprog_SOURCES不足)。变量EXTRA_DIST确保.idl文件将被make distreference)捕获。

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