'make distclean'によって削除されたlibtool
質問
libtoolをプログラムのソースツリーにコピーして、プログラムとともに配布しました。しかし、「make distclean」を実行すると、生成された残りのファイルとともにlibtoolが削除されます。どうすればそれを防ぐことができますか?
Makefile.amに EXTRA_DIST = libtool
を配置しようとしましたが、機能しません。
基本的には、configure.acは次のようになります。
AC_PREREQ(2.53)
AC_INIT( [program], [0.16], [program] )
AC_CONFIG_SRCDIR([src/c/program.c])
AC_CONFIG_HEADER([config.h])
AC_CONFIG_AUX_DIR(build-aux)
AM_INIT_AUTOMAKE( [-Wall -Werror foreign] )
m4_include(ax_pkg_swig.m4)
# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
AC_ENABLE_SHARED
AC_PROG_SWIG
# Checks for libraries.
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T
# Checks for library functions.
AC_REPLACE_FNMATCH
AC_FUNC_MALLOC
AC_FUNC_STAT
AC_CHECK_FUNCS([regcomp strdup strtoull])
AC_CONFIG_FILES([
Makefile
src/c/Makefile
src/perl/Makefile
src/verilog/Makefile
])
AC_OUTPUT
解決
手作業でプログラムのディレクトリに libtool
をコピーすることは想定されていません。これを処理するブートストラップスクリプトで libtoolize
を実行します。ファイルを削除してはならないことをautomakeに通知するなど、単にlibtoolをコピーするだけではありません。サンプルのブートストラップスクリプトを次に示します。
#!/bin/sh
aclocal -I config &&
libtoolize --force --copy &&
autoheader &&
automake --add-missing --copy --foreign &&
autoconf &&
./configure -C "$@"
このスクリプトは伝統的に bootstrap
または autogen.sh
と呼ばれます。これらの名前は普遍的ではありませんが、ほぼそうです。ほんの数日前、たとえば bootstrap.sh
を使用してプロジェクトに出会いました。
大部分は、スクリプトの名前はファッションとスタイルの問題です。モダンなスタイルの一部は、スクリプトの最後で configure
を実行することから遠ざかるためです。 bootstrap
は新しい名前なので、最後に configure
を実行する可能性の低い名前のスクリプトです。 オートブックの第8章は、これも事実であることを意味していますが、私は'反例に遭遇しました。 (つまり、 configure
を呼び出さない autogen.sh
スクリプトを使用するプロジェクト、および bootstrap
スクリプトを使用するプロジェクト)
私の考えでは、最後に configure
ステップを含めるかどうかの問題は、プロジェクトのユースケースがどれほど一般的かによって決まります。プロジェクトのビルドツリーをブートストラップする必要があるほぼ全員がブートストラップスクリプトで定義された標準の configure
フラグを受け入れるか、1つまたは2つの単純なフラグを追加する場合は、 configure
を実行しても問題ありません自動的に。多くの人が大規模なカスタマイズを行う必要がある場合は、個別の手動ステップにすることをお勧めします。たとえば、多くのユーザーがプロジェクトをクロスコンパイルしている場合です。 configure
にこれを行うように依頼する方法はよく知られていますが、誰かがブートストラップスクリプトのコードを読んで、埋め込まれた configure
に渡されるオプションを取得する方法を理解する必要があります。コマンド。
ほぼ確実に、このスクリプトをプロジェクトのニーズに合わせてカスタマイズする必要があります。現状のままにする最も重要なことは、操作の順序です。 Autotoolsはそれに敏感です。コマンドを指定してフラグを変更する必要がある場合があります。たとえば、 aclocal
コマンドの -I config
はユニバーサルではありません。これらの一般的なステップを囲むか、場合によってはインターリーブすることもあります。
autoreconf
オプション、まだファンになっていません。その組み込みの前提が、どういうわけか私のプロジェクトのすべてで破綻することがわかりました。あなたのプロジェクトが沼地標準のGNUスタイルのプロジェクトである場合、それはあなたのために働くかもしれません。
ところで、 AC_PROG_LIBTOOL
マクロは廃止。代わりに LT_INIT
を使用する必要があります。
他のヒント
実際には、すべてのaclocalとlibtoolizeおよびautoheaderを呼び出す必要はありません...
電話するだけ
$ autoreconf -i
およびautoreconfは、aclocal、libtoolize(config.acにlibtoolマクロがある場合)、automake(configure.acにautomakeが含まれる場合)、およびautoconfを実行します。ソースツリーに追加する必要があるそれぞれのファイルはすべて、ltmain.sh.2
にコピーされます通常は冗長性(-v)を追加し、ファイルをコピーするだけでなく、それらをシンボリックリンクして、標準呼び出しを行います
$ autoreconf -vis
" libtool" " configure"によって生成されたファイルrunは、configureが実行されたシステムに固有であるため、「make distclean」で再度クリーンアップされます。