web-dev-qa-db-ja.com

Autotools、Cmake、Sconsの違いは何ですか?

Autotools、Cmake、Sconsの違いは何ですか?

236
Islam Wazery

実際、Autotoolsの唯一の本当の「節約」は、すべてのGNUプロジェクトが主に使用していることです。

Autotoolsの問題:

  • 真のARCANE m4マクロ構文と、「互換性」などのテストのための冗長なツイストシェルスクリプトの組み合わせ.
  • あなたが注意を払っていない場合、あなたはwillクロスコンパイル能力を台無しにしますScratchbox/Scratchbox2を使用してサイドステップに移動highly Maemo/MeegoのAutotoolsビルド設定が壊れています。理由は、テストで静的なパスを修正した場合です。sysroot仕様を尊重せず、ホストシステムからデータを取得するため、クロスコンパイルのサポートが中断されます。クロスコンパイルのサポートを破ると、OpenEmbeddedのようなものに対してコードが使用できなくなり、ターゲットではなくクロスコンパイラでリリースをビルドしようとするディストリビューションにとって「楽しい」ものになります。
  • NOBODY現在使用されているほとんどすべてのプロダクションで使用されている、古くて壊れたコンパイラの問題について、膨大な量のテストを行いますこの日と年齢。 glibc、libstdc ++、またはGCCなどの何かを本当にancientバージョンのSolaris、AIX、またはたとえば、テストは時間の無駄であり、上記のような多くの潜在的な破損の原因となります。
  • Autotoolsのセットアップを取得してWindowsシステムで使用可能なコードをビルドするのは、非常につらい経験です。 (Windowsをほとんど使用していませんが、クロスプラットフォームコードを開発しているとしたら、それは深刻な懸念事項です。)
  • それが壊れたとき、あなたは過ごすだろう時間誰が書いたものを整理しようとして尾を追いかけますあなたのビルドを整理するためにスクリプトが間違っていました(実際、これは私がやろうとしていることです(または、むしろ、Autotoolsを完全にリッピングします-今月の残りの時間には混乱を整理するのに十分な時間があるとは思いません。 。)これを入力しているので、Apache ThriftにはBROKENのようなシステムがありますクロスコンパイルしません。)
  • 「通常の」ユーザーとは、実際にはNOTただ "./configure; make"-を行うことです。 、彼らはPPAのような誰か、または彼らの配布ベンダーから提供されたパッケージを引っ張ろうとしている。 「通常の」ユーザーは開発者ではなく、多くの場合tarballを取得していません。それはそこに当てはまるだろうと推定するための皆の一部の索です。 tarballの典型的なユーザーは物事をやっている開発者であるので、もしそれがあれば壊れていると非難されるでしょう。

これは機能します...ほとんどの場合... Autotoolsについて言えることはすべてです。これは、基本的なコアツールチェーンコードのGNUプロジェクトにのみ関係するいくつかの問題を解決するシステムです。 (編集(2014年5月24日):この種の懸念は潜在的にBADであることに注意する必要があります心配すること-Heartbleedは部分的にこの考え方に由来し、正しい最新のシステムでは、あなたはreally持っていないAutotoolsが修正するものの多くを扱っているビジネスGNUは、おそらくHeartbleedで何が起こったのかを考慮して、コードベースの大雑把な削除を行う必要があります)プロジェクトを行うためにそれを使用できます。 Linux以外、またはGNUツールチェーンが明らかに正しく機能している場所以外では動作しないと思われる小さなプロジェクトの場合。 「Linuxとうまく統合する」というステートメントは、quite太字のステートメントであり、かなりincorrect GNUツールと適切に統合され、ITがその目標に関して抱えている問題を解決します。

これは、ここでスレッドで説明した他のオプションに問題がないと言うことではありません。

SConsは、Make/GMake/etcに代わるものです。とても素敵に見えますが、すべてのものが考慮されます.

  • まだPOSIX専用のツールです。あなたはおそらくAutoToolsよりもこれを使ってMinGWにWindowsのものを簡単に構築させることができるかもしれませんが、それでもPOSIXのものを実行するために本当に連動しており、Python and使用するSCons。
  • Scratchbox2のようなものを使用していない限り、クロスコンパイルの実行に問題があります。
  • 確かに、彼ら自身の比較から、CMakeよりも遅くて不安定です。彼らは、SConsと比較してCMakeに対してネガティブ(POSIX側がmake/gmakeを必要とする...)を思い付きます。 (余談ですが、THAT他のソリューションよりもはるかに拡張性が必要な場合は、プロジェクトが複雑すぎる...)

このスレッドでCMakeに与えられた例は少し偽です。

しかしながら...

  • 新しい言語を学ぶ必要があります。
  • Make、SCons、またはAutotoolsに慣れている場合、直感に反するものがあります。
  • ビルドするシステムにCMakeをインストールする必要があります。
  • ビルド済みのバイナリがない場合は、堅牢なC++コンパイラが必要です。

実際、あなたの目標はここで何を選択するかを決定するべきです。

  • 有効な作業バイナリを生成するには、破損したツールチェーンのLOTに対処する必要がありますか?はいの場合、上記の欠点を認識してAutotoolsを検討することをお勧めします。 CMakeはこれの多くに対処できますが、Autotoolsが行うよりも心配することはありません。 SConsは拡張して心配することもできますが、すぐに使える答えではありません。
  • Windowsターゲットを心配する必要がありますか?もしそうなら、Autotoolsは文字通り実行不能になっているはずです。その場合、SConsが適切な場合とそうでない場合があります。もしそうなら、CMakeは確実な選択です。
  • クロスコンパイルについて心配する必要がありますか(ユニバーサルアプリ/ライブラリ、Google Protobufs、Apache Thriftなど。SHOULDこれに注意してください...)?その場合、Autotools might Windowsを心配する必要がない限り、あなたのために動作しますが、あなたは状況の変化に合わせて構成システムを維持するのに多くの時間を費やすことになります。 SConsは、Scratchbox2を使用している場合を除き、現時点ではほとんど使用できません。クロスコンパイルを実際に処理する必要はなく、その拡張性を使用して、同じように維持する必要があります。 Automakeを使用します。もしそうなら、サンドボックスからの漏れについての心配の多くなしでクロスコンパイルをサポートし、Scratchbox2のようなものと一緒に/なしで動作し、nicely OpenEmbeddedのようなもの。

多くのプロジェクトがqmakeやAutotoolsなどを捨て、CMakeに移行している理由があります。これまでのところ、CMakeベースのプロジェクトがクロスコンパイルの状況またはVisualStudioセットアップに落ちるか、プロジェクトがWindowsのみまたはOSXのみの部分を考慮していないため、少量のクリーンアップのみが必要であることを明確に期待できますコードベースに。私はSConsベースのプロジェクトからそれを本当に期待することはできません-そして、私は完全に1/3以上のAutotoolsプロジェクトが得られたことを期待します何かホストが1つまたはScratchbox2を1つだけ構築する場合を除いて、どのようなコンテキストでも構築できなくなるという誤り。

171
Svartalf

誰がツールを使用するかを重要に区別する必要があります。 Cmakeは、ソフトウェアをビルドするときにユーザーが使用する必要があるツールです。 autotoolsは、SuS準拠システムで利用可能な標準ツールのみを使用してソフトウェアを構築するために使用できる配布tarballを生成するために使用されます。つまり、autotoolsを使用してビルドされたtarballからソフトウェアをインストールする場合、autotoolsを使用していないです。一方、Cmakeを使用するソフトウェアをインストールする場合は、Cmakeを使用してareをインストールし、ソフトウェアをビルドする必要があります。

大多数のユーザーは、ボックスに自動ツールをインストールする必要はありません。歴史的に、多くの開発者が不正なtarballを配布して、ユーザーにautoconfを実行させてconfigureスクリプトを再生成させるため、多くの混乱が生じました。これはパッケージングエラーです。ほとんどの主要なLinuxディストリビューションは、デフォルトでそれらのいずれもインストールすべきではないときに、複数のバージョンのautotoolsをインストールするという事実により、さらに混乱が生じています。さらに混乱は、tarballをビルドするのではなく、バージョン管理システム(cvs、git、svnなど)を使用してソフトウェアを配布しようとする開発者によって引き起こされます。

63
William Pursell

GNUコーディング標準ではありません。

Autotoolsの現在の利点は、特にautomakeで使用する場合、Linuxディストリビューションの構築と非常にうまく統合できることです。

たとえば、cmakeでは、「-DCMAKE_CFLAGSまたは-DCMAKE_C_FLAGSが必要でしたか?」いいえ、どちらでもありません。「-DCMAKE_C_FLAGS_RELEASE」です。または-DCMAKE_C_FLAGS_DEBUG。混乱を招きます-autoconfでは、。/ configure CFLAGS = "-O0 -ggdb3"であり、それがあります。

ビルドインフラストラクチャとの統合では、sconsにはmake %{?_smp_mflags}を使用できないという問題があります。この場合、_smp_mflagsは、おおまかにシステム電源に拡張される(管理者が設定する)RPMマクロです。人々は、環境を通して-jNCPUSのようなものをここに置きます。 sconsが機能しないため、sconsを使用するパッケージは、ディストリビューションでビルドされたシリアルのみになります。

23
user502515

Autotoolsについて知っておくべき重要なことは、それらが一般的なビルドシステムではないことです-それらはGNUコーディング標準を実装し、それ以外は何もしません。すべてのGNU標準に従うパッケージを作成する場合、Autotoolsはこの仕事に最適なツールです。そうでない場合は、SconsまたはCMakeを使用する必要があります。 (たとえば、 この質問 を参照してください。)このよくある誤解は、Autotoolsのフラストレーションのほとんどが由来するところです。

17
ptomato

開発者の観点から見ると、cmakeは現在最も使いやすいですが、ユーザーの観点からすると、オートツールには1つの大きな利点があります

autotoolsは単一のファイル構成スクリプトを生成し、生成するすべてのファイルはディストリビューションに付属しています。 grep/sed/awk/viを使用すると、簡単に理解して修正できます。これを、/ usr/share/cmak */Modulesに多数のファイルが存在するCmakeと比較してください。このファイルは、ユーザーが管理者アクセス権を持たない限り修正できません。

そのため、何かがうまく機能しない場合、ビルドシステムを理解する必要なく、通常の方法で標準Unixツール(grep/sed/awk/viなど)を使用して簡単に「修正」できます。

何がおかしいのかを見つけるためにcmakeビルドディレクトリを掘り下げたことはありますか?上から下に読むことができる単純なシェルスクリプトと比較して、生成されたCmakeファイルを追跡して何が起こっているのかを見つけることは非常に困難です。また、CMakeを使用してFindFoo.cmakeファイルを調整するには、CMake言語の知識だけでなく、スーパーユーザー特権も必要になる場合があります。

6
arved