【问题标题】:How to set arbitrary dependency on source file in automake, without a generated source如何在automake中设置对源文件的任意依赖,没有生成的源
【发布时间】:2012-03-13 05:35:23
【问题描述】:

我对包含生成文件的源文件的依赖顺序有疑问。例如,在一个名为 unit.cpp 的文件中,我有这个:

 #include "generated.hpp"

其中generated.hpp 是生成的文件,将在输出包含目录中生成。现在,这个文件是通过中间命令生成的,生成文件规则如下:

 .build-generated:
     cmd.sh ... > include/generated.hpp
     touch $@

unit.o 文件的构建因此需要首先调用.build-generated。如果我执行以下操作,我会混淆生成的 makefile:

 unit.cpp: .build-generated

因为 make 现在将假定 unit.cpp 是一个生成的文件,并忽略源目录中的那个(仅当 .build-generated 必须重新制作时)。我查看了详细的 make 输出,它说它忽略了 VPATH 中的那个。

在普通的 makefile 中,我可能会使 unit.o 依赖于另一个目标,但这似乎不是自动生成方式(因为它可能不可移植)。 实际上它甚至不起作用,因为目标可能是 .lo 文件

我怎样才能正确地告诉 automake 这种依赖关系?

【问题讨论】:

    标签: makefile automake


    【解决方案1】:

    根据 automake 手册,您将按以下方式指定:

    BUILT_SOURCES = generated.hpp
    

    【讨论】:

    • 我也看到了,但是只有在你运行 make all 或其他一些全局目标时它才会构建。我想建立在单个目标上,因为这是我们典型的开发过程(在做某事时只建立子目标)。
    【解决方案2】:

    如果你使用 autoconf 和 automake,你可以从你的头文件中依赖你的源文件:

    $srcdir/unit.cpp : $builddir/include/generated.hpp
    

    如果$builddir 不适合您(例如,您可以使用多个 Makefile.am 中包含的公共头文件),请使用$top_builddir。其他有用的 autoconf 变量可以在here找到。

    【讨论】:

    • 这个不行,是我先试过的。然而,这可能是一个缺陷。当依赖关系过时时,它无法找到 unit.cpp - 在详细模式下,它明确表示它忽略了找到的 VPATH。
    【解决方案3】:

    我认为正确的解决方案是让目标文件依赖于生成的标头:

    include/generated.hpp:
         cmd.sh ... > include/generated.hpp
         touch $@
    unit.o: include/generated.hpp
    

    如果使用 automake,类似

    $(prog_OBJECTS): include/generated.hpp
    

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 2012-12-06
      相关资源
      最近更新 更多