Automake,生成的源文件和VPATH构建

Cra*_*een 6 automake swig code-generation vpath

我正在使用automake进行VPATH构建.我现在也使用SWIG生成的源代码.我有规则Makefile.am:

dist_noinst_DATA = whatever.swig

whatever.cpp: whatever.swig
    swig -c++ -php $^
Run Code Online (Sandbox Code Playgroud)

然后该文件将在以后使用:

myprogram_SOURCES = ... whatever.cpp
Run Code Online (Sandbox Code Playgroud)

它工作正常$builddir == $srcdir.但是在进行VPATH构建(例如mkdir build; cd build; ../configure; make)时,我收到有关丢失的错误消息whatever.cpp.

生成的源文件应该转到$builddir还是$srcdir?(我估计可能$builddir.)

如何指定依赖项和规则以将生成的文件放在正确的位置?

uml*_*ute 3

简单回答

您应该假设它$srcdir是只读的,因此您不能在那里写入任何内容。因此,您生成的源代码最终将以$(builddir).

默认情况下,自动工具生成的 Makefile 只会在 中查找源文件$srcdir,因此您必须告诉它$builddir也进行检查。将以下内容添加到您的Makefile.am应该有所帮助:

VPATH = $(srcdir) $(builddir)
Run Code Online (Sandbox Code Playgroud)

之后,您可能会遇到错误no rule to make target ...,您应该能够通过更新源生成规则来修复该错误,如下所示:

$(builddir)/whatever.cpp: whatever.swig
        # ...
Run Code Online (Sandbox Code Playgroud)

更好的解决方案

您可能会注意到,在当前设置中,发布 tarball(由make dist)创建的版本将包含该whatever.cpp文件作为源的一部分,因为您已将此文件添加到myprogram_SOURCES. 如果您不希望这样做(例如,因为这可能意味着构建过程将真正采用预生成的文件而不是再次生成它),您可能需要使用类似以下内容的内容。它使用一个包装器源文件 ( whatever_includer.cpp),该文件仅包含生成的文件,然后用于-I$(builddir)查找生成的文件。

生成文件.am:

dist_noinst_DATA = whatever.swig

whatever.cpp: whatever.swig
    swig -c++ -php $^

whatever_includer.cpp: whatever.cpp

myprogram_SOURCES = ... whatever_includer.cpp
myprogram_CPPFLAGS = ... -I$(builddir)

clean-local::
    rm -f $(builddir)/whatever.cpp
Run Code Online (Sandbox Code Playgroud)

不管_includer.cpp:

#include "whatever.cpp"
Run Code Online (Sandbox Code Playgroud)