【问题标题】:automake: Add dependency to _PROGRAMS targetautomake:将依赖项添加到 _PROGRAMS 目标
【发布时间】: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

【问题讨论】:

    标签: autotools automake vala


    【解决方案1】:

    根据手册的这一页:

    EXTRA_a_DEPENDENCIES = foo.txt
    

    或者在你的情况下EXTRA_project_exec_DEPENDENCIES = project.vapi,应该做你想做的事。

    【讨论】:

      【解决方案2】:

      没有任何说明 foo.txt 如何在您的 example 中变为 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)有一个构建步骤供make执行,这是缺少的。

      【讨论】:

      • 好吧,只要构建 b 就会生成 foo.txt(正如我所说)。 a 依赖于 foo.txt,因为我在命令行参数中将它传递给编译器(但这不重要吗?)。
      • 哈,这似乎可行(即使是并行构建!)。我修改了您的示例以使用我项目中的所有文件 - 现在看起来 valac 命令对当前目录中的所有文件执行一次,然后对每个子目录中的每个文件再次执行一次(例如,它对所有文件执行 20 次src/util/ 中的 20 个文件(所以 ./util))。有没有办法防止这种情况发生?
      • 我通过为每个子目录创建不同的 Makefile.am 来解决上一个问题。现在不太重要的问题是:我需要列出每个项目文件两次(一次在其子目录中,一次在 src 目录中,因为 .vapi 文件)并且有时会经常执行 valac(尤其是使用 -jX )。
      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多