Нет правила делать цель distclean при использовании библиотеки удобства libtool

Я пишу пакет C ++ с помощью GNU Autotools. Я включаю в пакет несколько внешних библиотек. Поскольку я не хочу устанавливать каждую из этих библиотек отдельно, я вместо этого использую "удобная библиотека libtool ". Иерархия каталогов выглядит примерно так:

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.

Почему "Making 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 /" в ПОДКАТАЛОГИ последнего файла Makefile.am?

ps: automake v1.13.1; autoconf v2.69; libtool v2.4.2


person tflutre    schedule 01.05.2013    source источник
comment
Что в остальном Makefile.am во всех каталогах? Каталог small1 кажется очищенным чем-то над ним (хотя и не тем, что в big).   -  person ldav1s    schedule 01.05.2013
comment
Настоящая проблема не в том, что он очищается дважды (rm -f не заботится, есть ли файл / каталог или нет), но нет правила для очистки в small1 Makefile.am.   -  person ldav1s    schedule 01.05.2013
comment
@ ldav1s Я добавил Makefile.am в mypkg / src / и mypkg /. Может проблема исходит от SUBDIRS?   -  person tflutre    schedule 01.05.2013
comment
@ ldav1s Действительно, ошибка исчезает, когда я удаляю src / big / small1 и src / big / small2 из переменной SUBDIRS в mypkg / Makefile.am. Мне ответить на свой вопрос сейчас или удалить его?   -  person tflutre    schedule 01.05.2013
comment
ты должен ответить на него. Подобные странные проблемы - вот почему я стараюсь избегать рекурсивных make-файлов.   -  person ldav1s    schedule 02.05.2013


Ответы (1)


Проблема была связана с тем, что Makefile.am в «mypkg /» уже содержал «src / big / small1» и «src / big / small2» в своей переменной SUBDIRS. Чтобы решить проблему, мне нужно было только удалить эти два из переменной. Теперь файл mypkg / Makefile.am выглядит так:

SUBDIRS = src/big src

Пользователь @ ldav1s указывает, что в любом случае может быть лучше использовать один нерекурсивный файл Makefile.am для всего проекта (подробнее здесь).

person tflutre    schedule 02.05.2013