Я пишу C ++ пакет с помощью GNU Autotools. Я включаю несколько внешних библиотек для доставки с пакетом. Поскольку я не хочу устанавливать каждую из этих библиотек отдельно, я вместо этого использую «удобная библиотека libtoolMsgstr «Иерархия каталогов выглядит примерно так:
mypkg/
configure.ac
Makefile.am
src/
Makefile.am
myprogram.cpp
big/
Makefile.am
small1/
Makefile.am
small1.hpp
small1.cpp
small2/
Makefile.am
small2.hpp
small2.cpp
с целью, чтобы в / usr / local / lib была установлена только libbig.la, а в / usr / local / include были установлены только small1.hpp и small2.hpp.
Все хорошо работает (configure
, make
, make check
), Кроме make distcheck
который возвращается No rule to make target distclean
после входа внутрь mypkg / src / mybiglib / mysmalllib1.
Точнее, вот вывод команды make distcheck:
make[1]: Entering directory `~/mypkg/mypkg-1.3/_build'
Making distclean in src/big/small1
make[2]: Entering directory `~/mypkg/mypkg-1.3/_build/src/big/small1'
rm -rf .libs _libs
test -z "libsmall1.la" || rm -f libsmall1.la
rm -f ./so_locations
rm -f *.o
rm -f *.lo
rm -f *.tab.c
test -z "" || rm -f
test . = "../../../../src/big/small1" || test -z "" || rm -f
rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
rm -rf ./.deps
rm -f Makefile
make[2]: Leaving directory `~/mypkg/mypkg-1.3/_build/src/big/small1'
Making distclean in src/big/small2
make[2]: Entering directory `~/mypkg/mypkg-1.3/_build/src/big/small2'
... # similar as for small1 above
make[2]: Leaving directory `~/mypkg/mypkg-1.3/_build/src/big/small2'
Making distclean in src/big
make[2]: Entering directory `~/mypkg/mypkg-1.3/_build/src/big'
Making distclean in small1
make[3]: Entering directory `~/mypkg/mypkg-1.3/_build/src/big/small1'
make[3]: *** No rule to make target `distclean'. Stop.
Почему «Создание distclean in small1» происходит дважды? Ошибка, кажется, происходит из-за того, что она работала хорошо в первый раз, и, таким образом, дает сбой второй раз?
Вот файл Makefile.am внутри mypkg / src / big / small1 /:
AM_CXXFLAGS = -I$(top_srcdir)/src/big @AM_CXXFLAGS@
noinst_LTLIBRARIES = libsmall1.la
libirls_la_SOURCES = small1.cpp
Вот файл Makefile.am внутри mypkg / src / big /:
SUBDIRS = small1 small2
lib_LTLIBRARIES = libbig.la
libeqtlbma_la_SOURCES = small1/small1.hpp \
small2/small2.hpp
nodist_EXTRA_libbig_la_SOURCES = dummy.cxx
libeqtlbma_la_LIBADD = small1/small1.la small2/small2.la
Вот файл Makefile.am внутри mypkg / src /:
AM_CXXFLAGS = -I$(top_srcdir)/src/big -fopenmp @AM_CXXFLAGS@
bin_PROGRAMS = myprogram
myprogram_SOURCES = myprogram.cpp
myprogram_CPPFLAGS = -fopenmp
myprogram_LDFLAGS = -fopenmp
myprogram_LDADD = $(top_builddir)/src/big/libbig.la $(AM_LDFLAGS)
Вот файл Makefile.am внутри mypkg /:
SUBDIRS = src/big/small1 src/big/small2 src/big src
Где я что-то забыл? Или, может быть, я не должен включать «small1 /» и «small2 /» в SUBDIRS последнего Makefile.am?
PS: Automake v1.13.1; autoconf v2.69; libtool v2.4.2
Проблема была связана с тем, что Makefile.am в «mypkg /» уже содержал «src / big / small1» и «src / big / small2» в своей переменной SUBDIRS. Чтобы решить проблему, мне нужно было только удалить эти два из переменной. Файл «mypkg / Makefile.am» теперь выглядит так:
SUBDIRS = src/big src
User @ ldav1s указывает, что в любом случае может быть лучше использовать один нерекурсивный Makefile.am для всего проекта (более подробно Вот).
Других решений пока нет …