让distcheck不会复制所有来源

时间:2013-02-19 18:31:02

标签: gnu autotools autoconf automake libtool

我的项目结构如下:

/     subdir1     subdir2     subdir3     common_include

每个子目录为我的项目编译不同的二进制文件和库。 common_include包括我所有子目录中包含的.h(C ++标题)。

这些头文件不会添加到SOURCES属性中的每个Makefile.am中。 但是我将以下路径添加到CPPFLAGS属性

我使用GNU构建系统进行配置。一切正常。

但是当我想通过输入以下命令来释放项目时:make distcheck以创建:my-project-1.0.tar.gz,存档已成功创建。

但它包含所有子目录而不包含common_include目录。所以最终用户无法编译..

任何帮助?

谢谢

2 个答案:

答案 0 :(得分:4)

听起来你有Makefile.am个文件的层次结构,每个目录中有一个。解决此问题的一个简单方法是编辑整个项目顶层的Makefile.am并添加到其中:

EXTRA_DIST = common_include/header.h common_include/other-header.h # ...

依此类推,列出所有标题。 Automake使用EXTRA_DIST来命名应包含在发行版中的其他文件,即使它们没有被Automake知道的任何其他规则引用,并且是用于解决此类问题的良好通用机制。

答案 1 :(得分:2)

您需要将common_include中的头文件添加到您的SOURCES某处。否则,它们不会打包在make dist的tarball中。在这种情况下,make distcheck应该失败。正如我的评论所述,我认为make distcheck确实失败了。您应该在工作目录中查看这方面的证据。可能有一个目录_build和一个目录_inst,可能还有一个目录my-project-1.0,它们不属于您的目录结构。

编辑:我是这样做的:

<强> configure.ac

AC_PREREQ([2.62])
AC_INIT([my-project], [1.0.0], [my-project@example.com], [my-project])
AC_CONFIG_SRCDIR([subdir1/foo.cc])
LT_PREREQ([2.2.4])
AC_CANONICAL_SYSTEM

AM_INIT_AUTOMAKE
LT_INIT

AC_PROG_CXX
AC_PROG_MAKE_SET
AC_SUBST([LIBTOOL_DEPS])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

典型的样板材料。除了C ++编译器之外,没有什么可看的。

<强> Makefile.am

AUTOMAKE_OPTIONS = 1.11 foreign

bin_PROGRAMS = baz
lib_LTLIBRARIES=libfoo.la libbar.la

baz_SOURCES=$(top_srcdir)/subdir3/baz.cc \
$(top_srcdir)/common_include/bar.hpp \
$(top_srcdir)/common_include/foo.hpp
baz_CXXFLAGS=-I$(top_srcdir)/common_include
baz_LDADD=libfoo.la libbar.la

libfoo_la_CXXFLAGS=-I$(top_srcdir)/common_include
libfoo_la_SOURCES=$(top_srcdir)/subdir1/foo.cc \
$(top_srcdir)/common_include/foo.hpp

libbar_la_CXXFLAGS=-I$(top_srcdir)/common_include
libbar_la_SOURCES=$(top_srcdir)/subdir2/bar.cc \
$(top_srcdir)/common_include/bar.hpp

使用common_include中的标题创建了两个库和一个依赖于它们的程序。 为了打包东西,你真的只需要为某个对象引用一次头文件。我总是明确列出它们主要是为了记录它们。 autoconf系统非常智能,可以为标头构建正确的依赖关系。

如果你想知道,make distcheck确实有效:

我项目-1.0.0.tar.gz的

my-project-1.0.0/
my-project-1.0.0/ltmain.sh
my-project-1.0.0/configure.ac
my-project-1.0.0/install-sh
my-project-1.0.0/missing
my-project-1.0.0/subdir2/
my-project-1.0.0/subdir2/bar.cc
my-project-1.0.0/subdir3/
my-project-1.0.0/subdir3/baz.cc
my-project-1.0.0/Makefile.in
my-project-1.0.0/subdir1/
my-project-1.0.0/subdir1/foo.cc
my-project-1.0.0/common_include/
my-project-1.0.0/common_include/bar.hpp
my-project-1.0.0/common_include/foo.hpp
my-project-1.0.0/config.sub
my-project-1.0.0/configure
my-project-1.0.0/config.guess
my-project-1.0.0/aclocal.m4
my-project-1.0.0/Makefile.am
my-project-1.0.0/depcomp