2

我的项目结构如下:

/ subdir1 subdir2 subdir3 common_include

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

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

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

但是当我想通过键入:make distcheck 以创建:my-project-1.0.tar.gz 来发布项目时,存档已成功创建。

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

有什么帮助吗?

谢谢

4

2 回答 2

4

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

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

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

于 2013-03-17T11:26:43.717 回答
2

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

编辑:这是我的做法:

配置.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++ 编译器。

生成文件.am

AUTOMAKE_OPTIONS = 1.11 外国

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

我的项目 1.0.0/
我的项目 1.0.0/ltmain.sh
我的项目-1.0.0/configure.ac
我的项目-1.0.0/安装-sh
我的项目 1.0.0/缺失
我的项目-1.0.0/subdir2/
我的项目-1.0.0/subdir2/bar.cc
我的项目-1.0.0/subdir3/
我的项目-1.0.0/subdir3/baz.cc
我的项目 1.0.0/Makefile.in
我的项目-1.0.0/subdir1/
我的项目-1.0.0/subdir1/foo.cc
我的项目 1.0.0/common_include/
我的项目-1.0.0/common_include/bar.hpp
我的项目-1.0.0/common_include/foo.hpp
我的项目-1.0.0/config.sub
我的项目 1.0.0/配置
我的项目 1.0.0/config.guess
我的项目-1.0.0/aclocal.m4
我的项目 1.0.0/Makefile.am
我的项目 1.0.0/depcomp
于 2013-02-19T18:43:20.920 回答