我正在使用automake进行VPATH构建。我现在也使用SWIG生成的源代码。我在Makefile.am
中有规则,如:
dist_noinst_DATA = whatever.swig
whatever.cpp: whatever.swig
swig -c++ -php $^
然后稍后使用该文件:
myprogram_SOURCES = ... whatever.cpp
$builddir == $srcdir
时效果很好。但是在进行VPATH构建时(例如mkdir build; cd build; ../configure; make
),我收到有关丢失whatever.cpp
的错误消息。
生成的源文件应该转到$builddir
还是$srcdir
? (我估计可能$builddir
。)
如何指定依赖关系和规则以将生成的文件放在正确的位置?
答案 0 :(得分:3)
您应该假设$srcdir
是只读的,因此您不得在那里写任何内容。
因此,您生成的源代码最终会显示在$(builddir)
。
默认情况下,autotool生成的Makefile只会在$srcdir
中查找源文件,因此您必须告诉它还要检查$builddir
。将以下内容添加到Makefile.am
应该会有所帮助:
VPATH = $(srcdir) $(builddir)
之后,您最终可能会遇到no rule to make target ...
错误,您应该可以通过更新源生成规则来解决此错误,如下所示:
$(builddir)/whatever.cpp: whatever.swig
# ...
您可能会注意到,在当前设置中,发布tarball(由make dist
创建)将包含whatever.cpp
文件作为源的一部分,因为您已将此文件添加到{{1 }}。
如果您不想这样(例如,因为它可能意味着构建过程将真正采用预生成的文件而不是再次生成它),您可能希望使用类似下面的内容。
它使用一个包装器源文件(myprogram_SOURCES
),它只包含生成的文件,然后使用whatever_includer.cpp
查找生成的文件。
Makefile.am:
-I$(builddir)
whatever_includer.cpp:
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
答案 1 :(得分:1)
通常,您希望保持$srcdir
只读,以便例如在CDROM上解压缩源代码时,您仍然可以从文件系统的其他部分运行/.../configure
。 / p>
但是,如果您使用SWIG为包装器库生成源代码,您可能还希望分发SWIG生成的代码,以便您的用户无需安装SWIG来编译代码。然后你确实可以选择:你可以决定SWIG生成的代码应该以{{1}}结束(它可以:$builddir
将在那里收集它并将其包含在tarball中),或者您可以决定在make dist
中输出SWIG生成的代码,因为从分布式软件包的角度来看它实际上是一个源代码。将其保留在$srcdir
中的一个优点是,当$srcdir
尝试从只读源目录构建程序包时,在尝试调用SWIG重新生成包装器源时,它将失败。如果你在make distcheck
中有你的包装器源,你可能不会注意到你有一些破坏的规则导致SWIG在用户的主机上运行;通过在$builddir
中生成,您可以确保用户不需要SWIG。
所以我的偏好是在$srcdir
中输出SWIG包装器源。 Python包装器的My setup如下所示:
$srcdir
请注意,我对所有目标使用EXTRA_DIST = spot.i
python_PYTHON = $(srcdir)/spot.py # _PYTHON is distributed by default
pyexec_LTLIBRARIES = _spot.la
MAINTAINERCLEANFILES = $(srcdir)/spot_wrap.cxx $(srcdir)/spot.py
_spot_la_SOURCES = $(srcdir)/spot_wrap.cxx $(srcdir)/spot_wrap.h
_spot_la_LDFLAGS = -avoid-version -module
_spot_la_LIBADD = $(top_builddir)/src/libspot.la
$(srcdir)/spot_wrap.cxx: $(srcdir)/spot.i
$(SWIG) -c++ -python -I$(srcdir) -I$(top_srcdir)/src $(srcdir)/spot.i
# Handle the multi-file output of SWIG.
$(srcdir)/spot.py: $(srcdir)/spot.i
$(MAKE) $(AM_MAKEFLAGS) spot_wrap.cxx
because of limitations of the VPATH
feature on various flavors of make
。我的设置是处理SWIG could be improved输出的多个文件,但由于这些规则不是由用户运行的,而且从来没有给我带来任何问题,我不打扰。