简单的答案
你应该假设它$srcdir
是只读的,所以你不能在那里写任何东西。因此,您生成的源代码将以$(builddir)
.
默认情况下,自动工具生成的 Makefile 只会在 中查找源文件$srcdir
,因此您也必须告诉它进行检查$builddir
。将以下内容添加到您的Makefile.am
应该会有所帮助:
VPATH = $(srcdir) $(builddir)
之后,您可能会遇到no rule to make target ...
错误,您应该可以通过更新源生成规则来修复该错误,如下所示:
$(builddir)/whatever.cpp: whatever.swig
# ...
更好的解决方案
您可能会注意到,在您当前的设置中,发布 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
不管是什么includer.cpp:
#include "whatever.cpp"