0

GNU Autotools を使用して C++ パッケージを作成しています。パッケージに同梱するために、いくつかの外部ライブラリを組み込んでいます。これらのライブラリを個別にインストールしたくないので、代わりに " 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

libbig.la のみが /usr/local/lib にインストールされ、small1.hpp と small2.hpp のみが /usr/local/include にインストールされることを目的としています。

mypkg/src/mybiglib/mysmalllib1 に入った後に戻ることを除いて、すべてが正常に機能します ( configuremake、 )。make checkmake distcheckNo rule to make target distclean

より正確には、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" が 2 回発生するのはなぜですか? エラーは、最初はうまくいき、2 回目は失敗したという事実から来ているようですか?

mypkg/src/big/small1/ 内の Makefile.am は次のとおりです。

AM_CXXFLAGS = -I$(top_srcdir)/src/big @AM_CXXFLAGS@
noinst_LTLIBRARIES = libsmall1.la
libirls_la_SOURCES = small1.cpp

mypkg/src/big/ 内の Makefile.am は次のとおりです。

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

mypkg/src/ 内の Makefile.am は次のとおりです。

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)

mypkg/ 内の Makefile.am は次のとおりです。

SUBDIRS = src/big/small1 src/big/small2 src/big src

私はどこに何かを忘れていますか?それとも、最後の Makefile.am の SUBDIRS に「small1/」と「small2/」を含めるべきではないのでしょうか?

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

4

1 に答える 1

1

この問題は、「mypkg/」内の Makefile.am の変数 SUBDIRS に「src/big/small1」と「src/big/small2」が既に含まれていることが原因でした。この問題を解決するには、変数からこれら 2 つを削除するだけで済みました。ファイル「mypkg/Makefile.am」は次のようになります。

SUBDIRS = src/big src

ユーザー @ldav1s は、どのような場合でも、プロジェクト全体で単一の非再帰的な Makefile.am を使用する方がよい可能性があることを示しています (詳細はこちら)。

于 2013-05-02T15:02:22.557 に答える