所以我目前在使用自动工具时遇到了这个奇怪的问题。我在 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:我通过以下技巧让它“工作”:
project.vapi: libproject.la
touch project.vala
之前的问题是 libproject.la 没有重建,因为它的源文件没有改变(我猜)。
但一旦有人使用 -j2
,这种方法就会停止,所以我想知道这个问题的真实答案。
因此,在 ldav1s 的帮助下,它可以工作,但以下 src/Makefile.am
显示,当使用上面的长 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
最佳答案
根据手册的这一页:
EXTRA_a_DEPENDENCIES = foo.txt
或者在您的情况下EXTRA_project_exec_DEPENDENCIES = project.vapi
,应该执行您想要的操作。
关于autotools - automake:添加对 _PROGRAMS 目标的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23314957/