2013-02-19 39 views
2

我的項目的結構如下:製作distcheck不會複製所有來源

/ 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時,存檔已成功創建。

但它包含所有的subdirs而不是common_include目錄。所以最終用戶無法編譯..

任何幫助嗎?

謝謝

+0

我不相信'make distcheck'成功完成。它可能會創建檔案(第一階段),但如果它需要構建的頭文件沒有包含在tarball中,我認爲'make distcheck'實際上沒有錯誤地完成。如果是這樣,我會向autoconf人員報告一個錯誤。 – ldav1s 2013-02-19 18:40:11

回答

2

你需要在某個地方common_include添加的頭文件到你的源代碼。否則,他們將不會被包裝在make dist的壓縮包中。在這種情況下,make distcheck應該失敗。正如我的評論所述,我認爲make distcheck確實失敗。你應該檢查你的工作目錄中的證據。可能有一個目錄_build和一個目錄_inst,可能是一個目錄my-project-1.0不屬於你的目錄結構的一部分。

編輯:這就是我想要做的:

configure.ac

 
AC_PREREQ([2.62]) 
AC_INIT([my-project], [1.0.0], [[email protected]], [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 
+0

如何?例如../common_include/header.h不起作用......哪一個?所有的子程序都使用common_include。 – odysseasg 2013-02-21 13:05:57

4

這聽起來像你有Makefile.am文件的層次結構,一個在每個目錄中。一個簡單的修復這個問題會在你的整個項目的頂層編輯Makefile.am,並添加到它:

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

等等,列出所有的頭。 Automake使用EXTRA_DIST來命名應包含在發行版中的其他文件,即使它們沒有被Automake意識到的任何其他規則引用,也是用於解決此類問題的良好通用機制。