autotools - automake:添加对 _PROGRAMS 目标的依赖关系

标签 autotools automake vala

所以我目前在使用自动工具时遇到了这个奇怪的问题。我在 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/

相关文章:

linux - Autotools - 设置库路径

python - pypokereval 库配置脚本失败,错误代码为 "No python development environments found"

oop - 不支持链接到 'Gtk.Box.new'

python - 修复 Genie 中的 for 循环

git - 如何防止 autotools 自动重新生成配置脚本?

c - 如何使用 Autotools 生成的 Makefile 在 Vim 中编译单个 C 文件

c++ - 不理解-c -o的Unix C++编译器

linux - _SCRIPTS primary 中指定的 Shell 脚本未显示在 dist tarball 中

c - autotools Makefile 是否自动将包含的头文件视为依赖项?

Vala:在构造函数中调用父类(super class)创建方法