2010-08-06 63 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中變量的說明。