【发布时间】:2014-04-26 18:31:59
【问题描述】:
所以我目前在使用 autotools 时遇到了这个奇怪的问题。我有一个在 bin_PROGRAMS 中列出的目标 A(这是我的主要目标)。我已经将我的应用程序拆分为一个主文件,其中只有主函数(目标 A)和其他所有内容,这些文件被构建到目标 A 然后使用的 .la 文件中(以及单元测试,但这些并不有趣)案例)。
现在有趣的部分:在编译目标 B(.la 文件)时,生成了另一个文件,比如 foo.txt(不是源文件,所以我不能只在 a_SOURCES 中列出它)。现在我想告诉 automake 目标 A 依赖于 foo.txt。这样做的“正常”方法是a: foo.txt,但如果我这样做,automake 会告诉我用a$(EXEEXT) 替换它,但这并不重要,因为两个版本都不起作用。在这种情况下,结果是 A 永远不会被编译。
所以,我现在的状态是这样的:
bin_PROGRAMS = a
b_la_SOURCES = bar.h bar.c
foo.txt: b.la
a_SOURCES: main.c
a_LDADD: b.la
#won't work:
a$(EXEEXT): foo.txt
我有点迷失在这里,所以任何帮助将不胜感激。
编辑: 上面的代码本身并不是一个示例,但这是我刚刚编写的具有相同行为的最小测试用例中的 src/Makefile.am:
# We need a .vapi and .h file from the generated .la
libproject_la_LIBADD = @PROJ_LIBS@
libproject_la_SOURCES = project.vala
# Generates both project.vapi and project.h
libproject_la_VALAFLAGS = --vapi=project.vapi --header project.h @PROJ_VALA_FLAGS@
#THIS
project.vapi: libproject.la
project_exec_SOURCES = main.vala
project_exec_LDADD = libproject.la @PROJ_LIBS@
#THIS
project_exec$(EXEEXT): project.vapi
#project_exec 'depends' on project.vapi
project_exec_VALAFLAGS = project.vapi @PROJ_VALA_FLAGS@
CLEANFILES = *.c *.h libproject.la project_exec
我实际上是通过执行make clean && ./autogen.sh && make && rm src/project.vapi && echo "//foo" >> src/main.vala && make 来测试它。
EDIT2:我通过以下 hack 让它“工作”:
project.vapi: libproject.la
touch project.vala
之前的问题是 libproject.la 没有被重建,因为它的源文件都没有改变(我猜)。
但是一旦有人使用-j2,这种方法就会刹车,所以我想知道这个问题的真实答案。
因此,在 ldav1s 的帮助下,它可以工作,但以下 src/Makefile.am 显示,当使用上述 long make 命令时,valac 规则会执行 4 次(其中 1 次就足够了):
AM_CPPFLAGS = $(PROJ_CFLAGS) AUTOMAKE_OPTIONS = 子目录对象
bin_PROGRAMS = project_exec
noinst_LTLIBRARIES = libproject.la
dir_sources = project.vala
dir_c = $(dir_sources:.vala=.c)
sub_sources = sub/dep.vala sub/dep2.vala
sub_c = $(sub_sources:.vala=.c)
all_files = $(dir_sources) $(sub_sources)
all_c = $(dir_c) $(sub_c)
project.vapi project_header.h $(all_c): $(all_files)
$(VALAC) -C -H project_header.h --vapi=project.vapi $^ @PROJ_VALA_FLAGS@
libproject_la_LIBADD = @PROJ_LIBS@
nodist_libproject_la_SOURCES = $(all_c)
# project_exec setup {{{
project_exec_SOURCES = main.vala
project_exec_LDADD = libproject.la @PROJ_LIBS@
project_exec_VALAFLAGS = project.vapi @PROJ_VALA_FLAGS@
main.vala: project.vapi
# }}}
CLEANFILES = *.c project.vapi project_exec *.o *.lo
【问题讨论】: