web-dev-qa-db-ja.com

独自のメイクファイルを作成できるのに、Autotoolsのようなビルドツールを使用するのはなぜですか?

最近、開発環境をWindowsからLinuxに切り替えました。これまでのところ、私はC++開発にVisualStudioのみを使用してきたので、 makeAutotools などの多くの概念は私にとって新しいものです。 GNU makefileのドキュメントを読んで、それについてほとんどアイデアを得ました。しかし、Autotoolsについては少し混乱しています。

私の知る限り、makefileはビルドプロセスを簡単にするために使用されます。

  1. Makefileを作成するためだけにAutotoolsのようなツールが必要なのはなぜですか? makefileの作成方法は誰もが知っているので、Autotoolsを実際に使用することはできません。
  2. 標準は何ですか?このようなツールを使用する必要がありますか、それとも手書きのメイクファイルだけで十分ですか?
50
Navaneeth K N

あなたはここで2つの別々であるが絡み合っていることについて話している:

  • Autotools
  • GNUコーディング標準

Autotools内には、いくつかのプロジェクトがあります。

  • Autoconf
  • オートメイク
  • Libtool

それぞれを個別に見てみましょう。

Autoconf

Autoconfは、既存のツリーを簡単にスキャンして依存関係を見つけ、ほぼすべての種類のシェルで実行される構成スクリプトを作成します。 configureスクリプトを使用すると、ユーザーはビルドの動作(つまり、--with-foo--without-foo--prefix--sysconfdirなど)を制御できるだけでなく、システムはプログラムをコンパイルできます。

Configureは、移植性の問題を回避するためにプログラムに含めることができるconfig.hファイル(テンプレートから)を生成します。たとえば、HAVE_LIBPTHREADが定義されていない場合は、代わりにフォークを使用してください。

私は個人的に多くのプロジェクトでAutoconfを使用しています。通常、慣れるまでには少し時間がかかります m4 。ただし、時間を節約できます。

Automakeを使用せずに、makefileにfindsを構成する値の一部を継承させることができます。

Automake

ビルドするプログラムと、それらをビルドするためにリンクする必要のあるオブジェクトを説明する短いテンプレートを提供することで、GNUコーディング標準に準拠するMakefileを自動的に作成できます。これには、依存関係の処理とすべてが含まれます。必要なGNUターゲットの。

これが簡単だと思う人もいます。私は自分のメイクファイルを書くことを好みます。

Libtool

Libtoolは、Unixライクなシステムでの共有ライブラリの構築とインストールを簡素化するための非常に優れたツールです。時々私はそれを使います。それ以外の場合(特に静的リンクオブジェクトを作成する場合)は、手作業で行います。

他のオプションもあります。StackOverflowの質問AutoconfとAutotoolsの代替?を参照してください。

ビルド自動化&GNUコーディング標準

つまり、コードを大衆にリリースする場合は、実際にはsome種類のポータブルビルド構成システムを使用する必要があります。何を使うかはあなた次第です。 GNUソフトウェアは、ほとんどすべてのものでビルドおよび実行されることが知られています。ただし、そのような(場合によっては非常に衒学的な)標準に準拠する必要はないかもしれません。

どちらかといえば、POSIXシステム用のソフトウェアを作成している場合は、Autoconfを試してみることをお勧めします。 AutotoolsがGNU標準と互換性のあるビルド環境の一部を生成するからといって、それらの標準に従わなければならないという意味ではありません(多くは従わないでください!):)他にもたくさんのオプションがあります。

編集

M4を恐れないでください:)常に Autoconfマクロアーカイブ があります。たくさんの例、またはチェックイン。自分で書くか、テストしたものを使用してください。 Autoconfは、 Automake と混同されることがよくあります。それらは2つの別々のものです。

77
Tim Post

まず第一に、Autotoolsは不透明なビルドシステムではなく、ティンカーティムがすでに指摘しているように、疎結合のツールチェーンです。 AutoconfとAutomakeについていくつか考えてみましょう。

Autoconfは、あらゆる種類のプラットフォームで機能するはずの機能チェックに基づいて構成スクリプトを作成する構成システムです。その存在の15年間の間に、多くのシステム知識がその m4 マクロデータベースに入りました。一方で、Autotoolsがまだ他のものに置き換えられていない主な理由は後者だと思います。一方、ターゲットプラットフォームがより異種でLinuxの場合、Autoconfははるかに重要でした。 [〜#〜] aix [〜#〜]HP-UX =、 SunOS 、...、および多種多様な異なるプロセッサアーキテクチャをサポートする必要がありました。最近のLinuxディストリビューションとIntel互換プロセッサのみをサポートしたいのであれば、その意味はよくわかりません。

Automakeは、GNU Makeの抽象化レイヤーであり、より単純なテンプレートからMakefileジェネレーターとして機能します。最終的には多くのプロジェクトがAutomakeの抽象化を取り除き、Makefileを手動で作成するように戻しました。これは、Makefileを制御できなくなり、Makefileを難読化するすべての既定のビルドターゲットが必要ない場合があるためです。

次にalternatives(そして、要件に基づいてAutotoolsの代替案を強くお勧めします):

CMakeの最も注目すべき成果は、 [〜#〜] kde [〜#〜]のAutoToolsを置き換えることです。 。 m4の特異性なしに、Autoconfのような機能が必要な場合は、おそらくこれが最も近いものです。 Windowsのサポートを提供し、大規模なプロジェクトに適用できることが証明されています。私のCMakeの強みは、それがまだMakefileジェネレーター(少なくともLinuxでは)であり、すべての永続的な問題(Makefileのデバッグ、タイムスタンプ署名、暗黙の依存関係の順序など)があることです。

SConsはPythonで記述されたMake置換です。 Pythonスクリプトをビルド制御ファイルとして使用して非常に高度な手法を可能にします。残念ながら、その構成システムはAutoconfと同等ではありません。特定の要件への適応が必要な場合、SConsは社内開発によく使用されます。規則に従うよりも重要です。

Autotoolsを使い続けたい場合は、Recursive Make Thought Harmfulを読んで、独自のGNU = Autoconfを介して構成されたMakefile。

31
Pankrat

ここですでに提供されている答えは良いですが、標準のC/C++プロジェクトに似たものがある場合は、独自のmakefileを作成するようにアドバイスしないことを強くお勧めします。 automakeによって生成された標準準拠のmakefileは、よく知られた名前で多くの有用なターゲットを提供し、これらすべてのターゲットを手作業で提供するのは面倒でエラーが発生しやすいため、手書きのmakefileの代わりにautotoolsが必要です。

まず、Makefileを手作業で作成することは、最初は素晴らしいアイデアのように思えますが、ほとんどの人は、すべてのルールを超えて作成し、インストールし、おそらくクリーンにする必要はありません。 automakeは、dist、distcheck、clean、distclean、uninstall、およびこれらすべての小さなヘルパーを生成します。これらの追加のターゲットは、最終的にソフトウェアをインストールするシステム管理者にとって大きな恩恵です。

第二に、これらすべてのターゲットをポータブルで柔軟な方法で提供すると、エラーが発生しやすくなります。最近、Windowsターゲットに対して多くのクロスコンパイルを実行しましたが、autotoolsのパフォーマンスは非常に優れていました。ほとんどの手書きファイルとは対照的に、コンパイルするのはお尻の痛みでした。念のために言っておきますが、手作業で優れたMakefileを作成することは可能です。しかし、自分自身を過大評価しないでください。さまざまなシステムに関する多くの経験と知識が必要です。automakeは、箱から出してすぐに優れたMakefileを作成します。

編集:そして「代替」を使用するように誘惑されないでください。 CMakeとその友達は、設定と友達とのインターフェース互換性がないため、デプロイヤーにとって恐ろしいものです。中途半端なシステム管理者や開発者なら誰でも、クロスコンパイルのような素晴らしいことや、頭からプレフィックスを設定したり、configureスクリプトを使った簡単な--helpを使ったりすることができます。しかし、BJamでそのようなことをしなければならないとき、あなたは1、3時間を費やすのが気になります。誤解しないでください。BJamはおそらく内部的には優れたシステムですが、BJamを使用するプロジェクトはほとんどなく、ドキュメントもほとんどなく、不完全であるため、使用するのは面倒です。 autoconfとautomakeは、確立された知識の点でここで大きなリードを持っています。

ですから、私はこの質問に対するこのアドバイスに少し遅れていますが、あなた自身に賛成してくださいautotoolsとautomakeを使用してください。構文は少し奇妙かもしれませんが、99%よりもはるかに優れています開発者の多くは自分で行います。

19
thiton

小さなプロジェクトの場合、または1つのプラットフォームでのみ実行される大きなプロジェクトの場合でも、手書きのメイクファイルが最適です。

Autotoolsが本当に優れているのは、さまざまなオプションを必要とするさまざまなプラットフォーム用にコンパイルするときです。 Autotoolsはしばしば典型的な背後にある頭脳です

。/構成、設定

make

インストールする

linuxライブラリおよびアプリケーションのコンパイルおよびインストール手順。

そうは言っても、私はautotoolsが苦痛だと感じており、より良いシステムを探していました。最近bjamを使っていますが、欠点もあります。あなたのために働くものを見つけて頑張ってください。

10
Dan Hook

ユーザーが使用するUNIXを知っていますか?それとも、Linuxのどのディストリビューションですか?彼らがソフトウェアをどこにインストールしたいか知っていますか?彼らが持っているツール、彼らがコンパイルしたいアーキテクチャ、彼らが持っているCPUの数、どれだけのRAMそしてディスクが彼らに利用できるかもしれないか)を知っていますか?

* nixの世界はクロスプラットフォームのランドスケープであり、ビルドおよびインストールツールはそれに対処する必要があります。


念のために言っておきますが、auto *ツールは以前のエポックからのものであり、それらについて多くの正当な苦情がありますが、それらをより現代的な代替手段に置き換えるいくつかのプロジェクトは、多くの勢いをつけるのに苦労しています。

* nixの世界では、そのようなことがたくさんあります。

6
dmckee

Makefileは異なるプラットフォーム間で同じように機能することが保証されていないため、Autotoolsが必要です。 Makefileを手書きし、それが自分のマシンで機能する場合、それが私のマシンでは機能しない可能性が高くなります。

6
Zifre

Autotoolsは災害です。

生成された_./configure_スクリプトは、過去20年ほどUnixシステムに存在しなかった機能をチェックします。これを行うには、膨大な時間がかかります。

_./configure_の実行には何年もかかります。最近のサーバーCPUは数十のコアを持つことができ、サーバーごとにそのようなCPUが複数ある場合がありますが、_./configure_はシングルスレッドです。ムーアの法則がまだ十分に残っているため、CPUコアの数は時間の関数として大幅に増加します。したがって、_./configure_にかかる時間はほぼ一定に保たれますが、ムーアの法則により、並列ビルド時間は2年ごとに2分の1に短縮されます。または実際には、改善されたハードウェアを利用してソフトウェアの複雑さが増すため、_./configure_にかかる時間はさらに長くなる可能性があります。

プロジェクトにファイルを1つだけ追加するという単なる行為では、automakeautoconf、および_./configure_を実行する必要がありますが、これには時間がかかります。ファイルが変更され、すべてが再コンパイルされます。したがって、ファイルを1つだけ追加すると、_make -j${CPUCOUNT}_がすべてを再コンパイルします。

そして_make -j${CPUCOUNT}_について。生成されたビルドシステムは再帰的なものです。 再帰的なmakeは長い間有害であると考えられてきました

次に、コンパイルされたソフトウェアをインストールすると、それが機能しないことがわかります。 (証明が必要ですか?クローン protobuf Githubからのリポジトリ、commit _9f80df026933901883da1d556b38292e14836612_をチェックアウトし、DebianまたはUbuntuシステムにインストールして、プレスト:_protoc: error while loading shared libraries: libprotoc.so.15: cannot open shared object file: No such file or directory_-_/usr/local/lib_ではなく_/usr/lib_;回避策は、makeと入力する前に_export LD_RUN_PATH=/usr/local/lib_を実行することです。

理論では、autotoolsを使用することで、Linux、FreeBSD、NetBSD、OpenBSD、DragonflyBSD、およびその他のオペレーティングシステムでコンパイルできるソフトウェアパッケージを作成できます。事実?ソースからパッケージをビルドするすべての非Linuxシステムには、autotoolsのバグを回避するための多数のパッチファイルがリポジトリにあります。たとえば、を見てください。 FreeBSD _/usr/ports_:パッチがいっぱいです。したがって、プロジェクトごとにautotoolsビルドシステム用の小さなパッチを作成するよりも、プロジェクトごとに非autotoolsビルドシステム用の小さなパッチを作成する方が簡単でした。あるいは、標準のmakeはautotoolsよりもはるかに使いやすいので、おそらくもっと簡単です。

事実、標準のmakeに基づいて独自のビルドシステムを作成する場合(「再帰的に有害と見なされる」ペーパーの推奨事項に従って、包括的で再帰的ではないものにする)、物事ははるかにうまく機能します。 。また、プロジェクトが10〜100 C言語ファイルの非常に小さなプロジェクトであり、CPUごとに数十のコアと複数のCPUがある場合、ビルド時間は1桁、おそらく2桁も短縮されます。また、autotoolsの_m4_の混乱を処理する代わりに、カスタム自動コード生成ツールを標準のmakeに基づくカスタムビルドシステムとインターフェースする方がはるかに簡単です。標準のmakeでは、少なくともMakefileにシェルコマンドを入力できます。

だから、あなたの質問に答えるために:なぜautotoolsを使うのですか?回答:そうする理由はありません。 Autotoolsは、商用Unixが廃止されて以来廃止されています。また、マルチコアCPUの登場により、autotoolsはさらに時代遅れになりました。なぜプログラマーがまだそれを認識していないのかは謎です。ビルドシステムでは標準のmakeを喜んで使用します。ありがとうございます。はい、C言語ヘッダーを含めるための依存関係ファイルを生成するにはある程度の作業が必要ですが、autotoolsと戦う必要がないため、作業量が節約されます。

2
juhist

私はこれに答える専門家だとは思いませんが、それでも私の経験と少し類似しています。

ある程度までは、アセンブリ言語ではなくC言語(高級言語)で埋め込みコードを書く必要がある理由と似ているからです。どちらも同じ目的を解決しますが、後者はより長く、退屈で、時間がかかり、エラーが発生しやすくなります(プロセッサのISA)をよく知っている場合を除きます)。Automakeツールと書き込みの場合も同様です。 Makefile.amとconfigure.acの記述は、個々のプロジェクトMakefileの記述よりも非常に簡単です。

0
tapeesh