我的项目结构如下:
/ subdir1 subdir2 subdir3 common_include
每个子目录为我的项目编译不同的二进制文件和库。 common_include包括我所有子目录中包含的.h(C ++标题)。
这些头文件不会添加到SOURCES属性中的每个Makefile.am中。 但是我将以下路径添加到CPPFLAGS属性
我使用GNU构建系统进行配置。一切正常。
但是当我想通过输入以下命令来释放项目时:make distcheck以创建:my-project-1.0.tar.gz,存档已成功创建。
但它包含所有子目录而不包含common_include目录。所以最终用户无法编译..
任何帮助?
谢谢
答案 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