既存のプロジェクトのビルドシステムを最初に理解し、後で拡張するために、autotools を学び始めています。現在、プロジェクトは出力としてプログラムをビルドします。Makefile.am
ビルド システムは、いくつかのサブディレクトリと、メンテナー モードで生成されたファイルなどで構成される非常に複雑です。オプションで、既存のビルド システムの多くを再利用して、同じソース コードの多くを使用してライブラリを作成できるようにしたいと考えています。
私が想像しているのは新しい make ターゲットで、configure を実行した後、実行make
してプログラムを作成したり、たとえばmake library
ライブラリをビルドしたりできます。これを行う正しい方法、または同様の効果を持つものは何ですか?
プレーンで実行するときにライブラリとプログラムの両方をビルドしたくありませんmake
(以前のようにプログラムのみ)。また、実行時にプログラムをビルドしたくありませんmake library
(ライブラリのみが必要です)。
誰かが簡単な例を提供できれば、たとえば 、および で構成されるプログラムmain.c
、foo.c
およびbar.c
および で構成されるライブラリなどfoo.c
、bar.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
これは今のところ機能しますが、ぎこちないようです。提供された回答をビルドシステムに実装する方法がわかりませんでした。