Сделать так, чтобы distcheck не копировал все исходники

Мой проект структурирован следующим образом:

/ subdir1 subdir2 subdir3 common_include

Каждый подкаталог компилирует разные двоичные файлы и библиотеки для моего проекта. common_include включает .h (заголовки C++), включенные во все мои подкаталоги.

Эти файлы заголовков НЕ добавляются в каждый Makefile.am в атрибуте SOURCES. Но я добавляю следующий путь -I../common_include к атрибуту CPPFLAGS

Я использую систему сборки GNU для настройки. Все работает.

Но когда я хочу выпустить проект, набрав: make distcheck, чтобы создать: my-project-1.0.tar.gz, архив успешно создается.

Но он содержит все подкаталоги, а не каталог common_include. Таким образом, конечный пользователь не может скомпилировать.

Любая помощь ?

Спасибо


person odysseasg    schedule 19.02.2013    source источник
comment
Я не верю, что make distcheck успешно завершается. Он может сделать архив (самый первый этап), но я не думаю, что make distcheck на самом деле завершится без ошибок, если файлы заголовков, которые ему нужно построить, не включены в tarball. Если это произойдет, я сообщу об ошибке людям из autoconf.   -  person ldav1s    schedule 19.02.2013


Ответы (2)


Похоже, у вас есть иерархия файлов Makefile.am, по одному в каждом каталоге. Одним из простых решений этой проблемы было бы отредактировать Makefile.am на верхнем уровне всего вашего проекта и добавить к нему:

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

и так далее, перечисляя все заголовки. EXTRA_DIST используется Automake для именования других файлов, которые должны быть включены в дистрибутив, даже если на них не ссылается никакое другое правило, известное Automake, и это хороший общий механизм для решения проблем такого рода.

person rra    schedule 17.03.2013

Вам нужно где-то добавить файлы заголовков в 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
person ldav1s    schedule 19.02.2013
comment
Как ? Например ../common_include/header.h не работает... А какой? Все подкаталоги используют common_include. - person odysseasg; 21.02.2013