GNU Autotools

最終更新: 2024-05-14 21:47:22 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

GNU Autotools は、プロジェクトメタデータから移植可能なビルドインターフェイスを生成します。Autoconf はビルド環境を調査して configure を出力し、Automake は Makefile.am から移植可能な Makefile.in テンプレートを生成し、Libtool はプラットフォーム固有のライブラリリンクを抽象化します。生成ファイルはソースリリース向けに設計されており、メンテナーが編集するのは .ac、.am、m4 の入力ファイルです。

cMoankfeifgiulree..aamcamu4tomraeccroonsfcMoacMcnkoaofenkniffefgiifiulgigre.l.e.sehitnatus

入力ファイルと生成ファイル #

プロジェクトには通常、次の入力があります。

  • configure.ac は、パッケージメタデータ、プローブ、置換、出力ファイル、オプションのヘッダーを宣言する m4 プログラムです。
  • Makefile.am は、bin_PROGRAMS、lib_LTLIBRARIES、program_SOURCES などの Automake 変数を使ってビルドターゲットを記述します。
  • m4/ にはプロジェクトまたはサードパーティーの m4 マクロが入り、通常は aclocal によってインポートされます。
  • config.h.in は、設定マクロ用の autoheader テンプレートです。

メンテナーは autoreconf -fi を実行して必要なジェネレーターを呼び出します。このコマンドは aclocal、autoconf、ヘッダーが宣言されている場合は autoheader、Automake が使用されている場合は automake --add-missing を実行します。結果には、configure、aclocal.m4、Makefile.in、build-aux/ 以下のヘルパースクリプト、該当する場合は config.h.in が含まれます。

ユーザーは、生成された設定スクリプトをソースツリー外で実行します。

sh
mkdir build
cd build
../configure --prefix=/usr/local
make
make check
make install

スクリプトは config.status を書き込みます。config.status は選択された置換を記録し、すべてのプローブを繰り返さずに設定済みの出力を再生成できます。config.log はコンパイラーテストと診断を記録するため、設定に失敗した後に最初に確認するファイルです。

Autoconf #

autoconf は GNU m4 を通じて configure.ac を展開し、シェルの configure スクリプトを出力します。AC_PROG_CC などのマクロはコンパイラーを検出してテストし、AC_CHECK_HEADERS と AC_CHECK_FUNCS はインターフェイスをテストし、AC_SUBST はテンプレート置換用の変数をエクスポートします。AC_CONFIG_FILES は config.status が出力ファイルに変換するテンプレートを列挙し、AC_OUTPUT は設定宣言を完了します。

m4
AC_INIT([example], [1.0])
AC_CONFIG_SRCDIR([src/main.c])
AC_PROG_CC
AC_CHECK_HEADERS([sys/epoll.h])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

成功するプローブは、具体的なビルド上の問いに答える必要があります。クロスコンパイルでは、ビルドホストがターゲットバイナリを実行できないため、実行時プローブは安全ではありません。Autoconf は --build、--host、キャッシュ変数、AC_CACHE_CHECK を公開して、コンパイルテストと実行テストを区別できるようにします。

autoheader は設定マクロをスキャンし、config.h.in を出力します。configure は検出された各 #undef を適切な #define に置換するか、config.h で未定義のままにします。AC_CONFIG_HEADERS に複数の名前を列挙すれば複数のヘッダーをサポートできます。列挙された各ヘッダーには独自の .in テンプレートと設定済み出力があります。

Automake #

Automake は Makefile.am を移植可能な Makefile.in に変換し、configure はコンパイラーパス、インストールディレクトリ、機能の結果を最終的な Makefile に置換します。たとえば次のようになります。

makefile
bin_PROGRAMS = tool
tool_SOURCES = main.c parse.c parse.h
AM_CPPFLAGS = -I$(top_srcdir)/include

Automake は all、check、install、installcheck、clean、distclean、dist などの標準ターゲットを提供します。make distcheck は新しいツリーで配布アーカイブをビルドし、設定済みのテストスイートを実行し、インストールとアンインストールを検証し、distclean が生成ファイルを削除することを確認します。

Automake の primary は出力のクラスを定義します。PROGRAMS、LIBRARIES、LTLIBRARIES、HEADERS、SCRIPTS、DATA などがあり、bin_、lib_、include_、noinst_、check_ などのプレフィックスがインストールまたはビルドの動作を選択します。Automake は宣言されたソースのオブジェクト依存関係を導出します。一方、BUILT_SOURCES、EXTRA_DIST、dist_ 変数は、自動的な配布検出で見逃される生成前提条件とファイルを処理します。

aclocal は、AC_CONFIG_MACRO_DIRS で見つかるマクロを含め、configure.ac に必要なマクロを収集して aclocal.m4 を構築します。バージョン管理されたプロジェクトでは、エンドユーザーがすべての Autotools ジェネレーターではなくシェルと Make だけで済むよう、生成された configure と Makefile.in をリリースアーカイブに含めることが一般的です。

テンプレートと置換 #

.in ファイルには、リテラルテキストと AC_SUBST が作成する @VARIABLE@ 置換が含まれます。Automake が生成する Makefile.in ファイルもそれらの置換から Make 変数を定義するため、レシピでは $(VARIABLE) を使用できます。テンプレートは configure を通過するだけでシェル構文を実行するわけではありません。configure.ac ではシェル値を引用し、生成スクリプトで使用する値を検証してください。

Libtool #

Libtool は libtool を提供します。これは Automake の *_LTLIBRARIES ターゲットが使用する生成ラッパーです。libexample.la のような移植可能なライブラリ名を、共有オブジェクト、インポートライブラリ、静的アーカイブなどのプラットフォーム出力から分離します。libtoolize は、プロジェクトに必要なマクロとヘルパーファイルをインストールします。ライブラリのバージョン情報は、Libtool の current/age/revision インターフェイス規則に従って -version-info に指定します。リリース番号には代わりに -release を使用します。どちらの値もパッケージバージョンを直接コピーしたものではありません。

公開前に、メンテナーは autoreconf -fi、ソースツリー外での ../configure、make、make check、make distcheck を実行します。リリース利用者はアーカイブを展開し、./configure、Make、宣言されたビルドツールだけを必要とします。DESTDIR はパッケージ化のために make install をステージングできます。生成された configure --help、config.log、config.status --recheck、make -n は具体的な動作を明らかにします。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)