0

既存のプロジェクトのビルドシステムを最初に理解し、後で拡張するために、autotools を学び始めています。現在、プロジェクトは出力としてプログラムをビルドします。Makefile.amビルド システムは、いくつかのサブディレクトリと、メンテナー モードで生成されたファイルなどで構成される非常に複雑です。オプションで、既存のビルド システムの多くを再利用して、同じソース コードの多くを使用してライブラリを作成できるようにしたいと考えています。

私が想像しているのは新しい make ターゲットで、configure を実行した後、実行makeしてプログラムを作成したり、たとえばmake libraryライブラリをビルドしたりできます。これを行う正しい方法、または同様の効果を持つものは何ですか?

プレーンで実行するときにライブラリとプログラムの両方をビルドしたくありませんmake(以前のようにプログラムのみ)。また、実行時にプログラムをビルドしたくありませんmake library(ライブラリのみが必要です)。

誰かが簡単な例を提供できれば、たとえば 、および で構成されるプログラムmain.cfoo.cおよびbar.cおよび で構成されるライブラリなどfoo.cbar.cそれも非常に役立ちます。

編集

明確にするために、私は当初、プログラムとライブラリを完全に個別に構築できると考えていました。ライブラリにはメイン プログラムのコードのサブセットのみが含まれており、この 2 つは別個のエンティティであると私は信じていました。しかし、事態はもっと複雑です。プログラム自体がビルドされ、いくつかのコードを出力するために使用され、それが 2 番目のステップでプログラムにコンパイルされます (と思います)。次の手順を実行することで、必要なものを効果的に取得できました。

最初に configure.ac に条件を追加します

dnl Adds LIBRARY conditional for --enable-foolib mode to
dnl build foo as a library
AC_ARG_ENABLE(foolib,
AS_HELP_STRING([--enable-foolib],
               [enable qucslib build, default: no]),
[case "${enableval}" in
             yes) foolib=true ;;
             no)  foolib=false ;;
             *)   AC_MSG_ERROR([bad value ${enableval} for --enable-foolib]) ;;
esac],
[foolib=false])

AM_CONDITIONAL(FOOLIB, test x"$foolib" = x"true")

次に、適切な Makefile.am で、次のようなことを行いました。

if FOOLIB
noinst_LIBRARIES = libbar.a libfoo.a
else
noinst_LIBRARIES = libbar.a
endif

bin_PROGRAMS = barprog

barprog_SOURCES = main.cpp src1.cpp src2.cpp etc.cpp

barprog_LDADD = libbar.a              \
    subdir1/libsubdir1.a                  \
    subdir2/libsubdir2.a          \
    etcdir/libetc.a 

... other stuff

if FOOLIB
libfoo_a_LIBADD = libbar.a            \
    subdir1/libsubdir1.a                  \
    subdir2/libsubdir2.a          \
    etcdir/libetc.a 

libfoo_a_SOURCES = src1.cpp src2.cpp etc.cpp
endif

それから私がライブラリを作りたいとき

configure --enable-foolib
make

これは今のところ機能しますが、ぎこちないようです。提供された回答をビルドシステムに実装する方法がわかりませんでした。

4

1 に答える 1

0

プログラムがライブラリに依存している場合、ライブラリをビルドしないとプログラムをビルドできません。個々のライブラリをビルドする機能は既にあります:configure && make libfoo.a正常に動作するはずです (またはmake libfoo.la)。という名前のターゲットが必要な場合libraryは、Makefile.am に以下を追加するだけです。

library:
        libfoo.a

(または、 が必要になる場合がありlibfoo.laます。基本的に、ライブラリがプライマリの下で指定されている場合は を使用しますがMakefile.am、プライマリの下で指定されている場合は を使用します。) これにより、Makefile.am を含む各ディレクトリにターゲットのみが作成されます。 . 複雑な再帰ビルドがある場合 (本当に単純化する必要がありますが、それは別の問題です)、次のようなものをトップレベルに配置して、ツリー全体のライブラリをビルドできます。LIBRARIESlibfoo.aLTLIBRARIESlibfoo.lalibraryMakefile.am

library:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) library

libraryこれは、上記のようにターゲットを subdir/Makefile.am に追加したことを前提としています。

$(am__cd)知識を深めるために、代わりにを使用することもできますがcd、厳密には必要ではありません。

于 2013-02-14T01:47:08.007 に答える