所以我目前对autotools有这个奇怪的问题。我有一个目标A,我在bin_PROGRAMS中列出(它是我的主要目标)。我将我的应用程序拆分为主文件,只包含主要功能(目标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:我得到了#34;工作"跟随黑客攻击:
project.vapi: libproject.la
touch project.vala
之前的问题是libproject.la没有重建,因为它的源文件都没有改变(我猜)。
但是,只要有人使用-j2
,这种方法就会停止,所以我想知道真正的答案。
所以使用ldav1s'帮助,它工作,但以下src/Makefile.am
表明,当使用上面的长make命令时,valac规则执行4次(其中1就足够了):
AM_CPPFLAGS = $(PROJ_CFLAGS) AUTOMAKE_OPTIONS = subdir-objects
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
答案 0 :(得分:3)
根据手册的这一页:
EXTRA_a_DEPENDENCIES = foo.txt
或在您的情况下EXTRA_project_exec_DEPENDENCIES = project.vapi
,应该做您想做的事。
答案 1 :(得分:2)
没有任何关于foo.txt
make
如何foo.txt : b.la
touch $@
的说法。
类似的东西:
a
可能会让你超越这个,但它可能也不适合你的构建。
我不明白为什么foo.txt
应该依赖# Split compilation to get dependency processing correct for project.vapi
project.vapi project.c project.h : project.vala
$(VALAC) $< --vapi=project.vapi -C -H project.h $(VALAFLAGS) @PROJ_VALA_FLAGS@
# Compile generated project.c and project.h
libproject_la_LIBADD = @PROJ_LIBS@
nodist_libproject_la_SOURCES = project.c project.h
project_exec_SOURCES = main.vala
project_exec_LDADD = libproject.la @PROJ_LIBS@
project_exec_VALAFLAGS = project.vapi @PROJ_VALA_FLAGS@
# main.vala depends on project.vapi
main.vala : project.vapi
CLEANFILES += $(nodist_libproject_la_SOURCES) project.vapi
。
编辑:好的,现在很多更好的上下文。谢谢。这可能有效:
project.vapi
这种方式foo.txt
(AKA make
)有{{1}}执行的构建步骤,但缺少这个步骤。