【发布时间】:2013-02-18 19:43:05
【问题描述】:
我有以下 Makefile.am,它应该从 foo.h(通过 Python 脚本)创建 foo.hdb 和 foo.cdb:
TESTS = check_foo
check_PROGRAMS = check_foo
check_foo_SOURCES = check_foo.c $(top_builddir)/src/isti.h \
foo.cdb foo.h foo.hdb
check_foo_CFLAGS = @CHECK_CFLAGS@ $(all_includes) -I../../clib/src/
check_foo_LDADD = $(top_builddir)/src/libcorm.la @CHECK_LIBS@ -lsqlite3
%.hdb %.cdb: %.h
PYTHONPATH=$(top_builddir)/cgen/src python $(top_builddir)/cgen/src/isti/cgen/run.py $<
clean-local:
rm -f *.hdb *.cdb
然而,虽然make foo.hdb 和make foo.cdb 工作(调用Python 代码并从foo.h 生成foo.hdb 和foo.cdb 文件),make clean check(或两个单独)不能(缺少@ 987654333@ - 没有这样的文件) - 不调用模式规则从 foo.h 生成 foo.hdb。
换句话说:没有为 check_foo_SOURCES 中列出的文件调用模式规则。
我怎样才能做到这一点?其余的 autotools 基础设施工作正常。通过查看 Makefile,我怀疑问题在于 autotools 如何扩展检查源。
这一切都在使用 Gnu make 的 Linux 上。这里是the Makefile。
[略微更新以反映来自 MadScientist 的帮助]。
稍后更新
以下 Makefile(只是 make,而不是 autotools)工作正常,因此问题似乎与 autotools 和检查支持有关。
all: check_foo
CFLAGS=-I../../clib/src
LDFLAGS=-L../../clib/src/.libs
check_foo: check_foo.c foo.h corm_foo.h corm_foo.c
gcc $(CFLAGS) $(LDFLAGS) $^ -o $@ -lcorm -lsqlite3
corm_%.h corm_%.c: %.h
PYTHONPATH=../../cgen/src python ../../cgen/src/isti/cgen/run.py $<
clean:
rm -f corm_*.h corm_*.c
rm -f *.o
(请注意,我已从 xxx.hdb 切换到 corm_xxx.h 等,因此文件扩展名保持正常)。
更多详情
因为好像和CHECK宏有关,所以这里是configure.ac:
AC_INIT([corm], [0.1], [a.cooke@isti.com])
AC_CONFIG_MACRO_DIR([m4])
PKG_CHECK_MODULES([CHECK], [check >= 0.9.4])
AM_INIT_AUTOMAKE([-Wall foreign -Werror])
AC_PROG_CC_C99
AM_PROG_CC_C_O
LT_INIT
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile clib/Makefile clib/src/Makefile clib/tests/Makefile clib/docs/Makefile cgen/Makefile cgen/docs/Makefile example/Makefile example/src/Makefile])
AC_CHECK_PROGS([DOXYGEN], [doxygen], AC_MSG_WARN([Doxygen not found - continuing without Doxygen support]))
AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"])
AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([clib/docs/Doxyfile cgen/docs/Doxyfile])])
解决方案
好的,总结下面的各种事情,有两个重要问题(一旦我修复了文件扩展名 - 请参阅“普通”makefile 和 fceller 的答案),其中任何一个都足以让事情正常工作:
(处理)头文件很复杂。由于自动依赖,以编程方式生成的头文件会破坏事物。解决方法是使用BUILT_SOURCES
但是(处理).c 文件并不复杂。因此,将 corm_foo.c 放在 check_foo.c 前面会触发该文件的生成。因为这也会生成 corm_foo.h,所以一切正常(因为 check_foo.c 现在可以包含 corm_foo.h)。
此外,fceller 对整洁的 makefile 有一些很好的一般观点,并解释了为什么“普通”makefile 可以工作。
【问题讨论】:
-
你的
Makefile是什么?如果问题太大,您能否将其添加到粘贴箱中 -
嗨 - 我已将它(pastebin 链接)添加到问题中,谢谢。
-
find . -name foo.hdb输出什么? -
make foo.hdb创建 foo.hdb,但它被make clean check中的clean删除(请参阅 clean-local 目标)。所以,如果我在make clean之后执行find,它什么也不会显示。也许我误解了你的问题,但我认为你走错了路(上面的 Makefile.am 位于没有子目录的目录中)。 -
你试过加
BUILT_SOURCES = foo.hdb吗?
标签: c makefile autotools check-framework