automake:为_PROGRAMS目标添加依赖项

时间:2014-04-26 18:32:00

标签: autotools automake vala

所以我目前对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

2 个答案:

答案 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}}执行的构建步骤,但缺少这个步骤。