Makefile 如何在没有生成源的情况下,在automake中设置对源文件的任意依赖关系

Makefile 如何在没有生成源的情况下,在automake中设置对源文件的任意依赖关系,makefile,automake,Makefile,Automake,我对包含生成文件的源文件的depdency排序有问题。例如,在名为unit.cpp的文件中,我有: #include "generated.hpp" 其中,generated.hpp是一个生成的文件,将在输出include目录中生成。现在,该文件是通过中间命令生成的,带有makefile规则,如: .build-generated: cmd.sh ... > include/generated.hpp touch $@ 因此,构建unit.o文件需要首先调用.b

我对包含生成文件的源文件的depdency排序有问题。例如,在名为
unit.cpp
的文件中,我有:

 #include "generated.hpp"
其中,
generated.hpp
是一个生成的文件,将在输出include目录中生成。现在,该文件是通过中间命令生成的,带有makefile规则,如:

 .build-generated:
     cmd.sh ... > include/generated.hpp
     touch $@
因此,构建
unit.o
文件需要首先调用
.build generated
。如果执行以下操作,则会混淆生成的makefile:

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

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


如何正确地告诉automake有关此依赖关系的信息?

如果将autoconf与automake一起使用,则可以从标题依赖源文件:

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

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

根据automake手册,您需要根据以下内容指定它:

BUILT_SOURCES = generated.hpp

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

include/generated.hpp:
     cmd.sh ... > include/generated.hpp
     touch $@
unit.o: include/generated.hpp
在使用automake的情况下,类似

$(prog_OBJECTS): include/generated.hpp

这不管用,是我先试的。然而,这可能是一个缺陷。当依赖项过时时,它无法找到unit.cpp——在详细模式下,它明确表示忽略找到的VPATH。我也看到了这一点,但只有在运行
make all
或其他全局目标时,它才会生成。我想在单个目标的基础上构建,因为这是我们典型的开发过程(在进行某些工作时只构建子目标)。