对于那些不熟悉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。
中答案 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.h
,FooHelper.c
和Foo.c
的其他规则可确保并行版本不会尝试运行$(THE_GENERATE_COMMAND)
两次。这是the Automake manual中详述的习惯用法,适用于并行构建。这里仍然有一点脆弱性:如果用户删除(例如)FooHelper.h
和FooHelper.c
并启动并行make,它可以并行多次运行规则的$(MAKE) $(AM_MAKEFLAGS) $<
恢复部分。正如手册所说,只有当用户手动毁坏构建树时才会发生这种竞争,即使这样,make clean; make
也无法修复。
BUILT_SOURCES
行确保在尝试构建Foo.c
之前构建Foo.h
,FooHelper.h
,FooHelper.c
和myprogram
(请参阅{{ 3)} Automake手册,了解为什么只将它们添加到myprog_SOURCES
是不够的。 EXTRA_DIST
变量可确保.idl
(this section)捕获make dist
文件。
MAINTAINERCLEANFILES
指定在运行make maintainer-clean
时要删除的其他文件;这是为了遵守reference。另请参阅GNU Makefile Standards中变量的说明。