web-dev-qa-db-ja.com

configureスクリプトとMakefile.inについて混乱

現在、autoconf/automakeツールチェーンの使用方法を学んでいます。私はここでワークフローの一般的な理解をしているようです-基本的に、実行可能なconfigureファイルを生成するconfigure.acスクリプトがあります。次に、生成されたconfigureスクリプトをエンドユーザーが実行してMakefilesを生成し、プログラムをビルド/インストールできるようにします。

したがって、一般的なエンドユーザーのインストールは基本的に次のとおりです。

./configure
make
make install
make clean

さて、ここで私は混乱しています:

開発者として、自動生成された構成スクリプトが実行されず、エラーが発生することに気づきました。

config.status: error: cannot find input file: `somedir/Makefile.in' 

ConfigureスクリプトはgenerateMakefile.inと想定されているので、これは私を混乱させます。いくつかの答えを探し回って、これはautogen.shスクリプトで修正できることを発見しました。これは、基本的にautoconf環境の状態を「リセット」します。典型的なautogen.shスクリプトは次のようになります。

aclocal \
&& automake --add-missing \
&& autoconf

じゃ、いいよ。しかし、私が生涯にわたって無数のtarballをダウンロードしたエンドユーザーとして、私はneverautogen.shスクリプトを使用する必要がありました。私がしたことは、tarballを解凍して、通常のconfigure/make/make install/make cleanルーチンを実行することだけでした。

しかし、現在singautoconfである開発者は、autogen.shを最初に実行しない限り、configureは実際には実行されないようです。エンドユーザーがautogen.shを実行する必要はないはずだと思ったので、これは非常に混乱します。

では、なぜ最初にautogen.shを実行する必要があるのですか-configureスクリプトがMakefile.inを見つけるために?なぜconfigureスクリプトは単にそれを生成しないのですか?

27
Siler

Autotoolsユーティリティを本当に理解するには、それらがどこから来たかを覚えておく必要があります。それらは、(a)ソースコードリポジトリ(CVS、Gitなど)から作業し、ソースコードを含むtarファイルまたは同様のもの、およびそのtarファイルをダウンロードサイトに配置すること、および(b)ソースコードtarファイルを取得し、システムでそのソースコードをコンパイルし、結果のバイナリを使用するエンドユーザー。明らかに、グループ(a)の人々もコードをコンパイルし、結果のバイナリを使用しますが、グループ(b)の人々は、グループ(a)の人々が必要とする開発用のすべてのツールを持っていないか、必要としません。

したがって、ツールの使用はこの分割に向けられており、グループ(b)の人々はautoconf、automakeなどにアクセスできません。

Autoconfを使用する場合、通常は_configure.ac_ファイル(autoconfへの入力)をソース管理にチェックインしますが、autoconfの出力、configureスクリプトはチェックインしません(一部のプロジェクトはconfigureスクリプトをチェックインします。もちろん、あなたへ)。

Automakeを使用する場合、一般的に_Makefile.am_ファイル(automakeへの入力)をチェックインしますが、automake:_Makefile.in_の出力はチェックインしません。

configureスクリプトは基本的に、システムでパッケージが必要とする場合と必要としない場合のあるさまざまなオプション要素を探します。これらの要素はどこにあるかなどを示します。この情報が見つかったら、それを使用してさまざまな_XXX.in_ファイル(通常はのみではありませんが、_Makefile.in_)をXXXファイル(たとえば、Makefile)に変換します。

したがって、手順は一般的に次のようになります。_configure.ac_と_Makefile.am_を記述してチェックインします。ソースコード管理チェックアウトからプロジェクトをビルドするには、autoconfを実行して__configure.ac_からconfigureを生成します。 automakeを実行して、_Makefile.in_から_Makefile.am_を生成します。 _Makefile.in_からMakefileを生成するには、configureを実行します。 makeを実行して製品をビルドします。

ソースコードをリリースする場合(ソースコードをリリースするオープンソース製品を開発している場合)、autoconfとautomakeを実行してから、ソースコードをconfigureおよび_Makefile.in_ファイルにバンドルして、ソースコードリリースをビルドするには、makeとコンパイラーが必要で、autotoolsは必要ありません。

Autoconfとautomake(および使用する場合はlibtool)を実行する順序は難しい場合があるため、ソース管理からビルドされる開発者が使用するためにソース管理にチェックインされるautogen.shやautoreconfなどのスクリプトがありますが、これらはソースコードリリースのtarファイルなどからビルドする人には不要/使用されません。

Autoconfとautomakeはしばしば一緒に使用されますが、独自の_Makefile.in_を記述したい場合は、automakeなしでautoconfを使用できます。

38
MadScientist