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


259

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


このトピックはScons wikiで既に議論されています。次のリンクにアクセスすることをお勧めします。1. scons.org/wiki/SconsVsOtherBuildTools Ubuntuフォーラムの非常によく似たディスカッションスレッドにアクセスしましたか?
バドラ

このPDFを確認できますwww-alt.gsi.de/documents/DOC-2007-Sep-17-1.pdf ; これには長所と短所があり、各ツールについての詳細もあります。
アダム

回答:


190

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

Autotoolsの問題:

  • 真のARCANE m4マクロ構文と「互換性」などのテストのための詳細なツイストシェルスクリプトの組み合わせ
  • 注意を払っていない場合は、クロスコンパイル機能台無しになります(NokiaがScratchbox / Scratchbox2を使用して、Maemo / Meegoの非常に壊れたAutotoolsビルド設定を回避するようにしたことは明らかです)。理由は、テストに固定された静的パスが含まれている場合、sysrootの仕様を尊重せず、ホストシステムからデータを取得するため、クロスコンパイルのサポートを無効にすることになります。クロスコンパイルのサポートを解除すると、OpenEmbeddedなどでコードが使用できなくなり、ターゲットではなくクロスコンパイラでリリースをビルドしようとするディストリビューションにとってコードが「楽しく」なります。
  • NOBODYが現在この時代のほとんどすべての製品で使用している古くて壊れたコンパイラの問題について、膨大な量のテストを実行します。Solaris、AIXなどの非常に古いバージョンでglibc、libstdc ++、GCCなどを構築していない限り、テストは時間の浪費であり、上記のような多くの多くの潜在的な破損の原因となります。
  • AutotoolsをセットアップしてWindowsシステムで使用可能なコードを作成するのは、かなり辛い経験です。(私はWindowsをほとんど使用していませんが、クロスプラットフォームのコードを開発しているとしたら深刻な問題です。)
  • それが壊れると、スクリプトを書いた人がビルドを整理するのに間違えたものを整理するために、HOURSが尻尾を追いかけて過ごすことになります(実際、これは私がやろうとしていることです(または、むしろ、 Autotoolsを完全にリッピングします。今月の残りの期間には、混乱を解消するのに十分な時間がないと思います...)これを入力しているので、今すぐ作業できます。ApacheThriftには、交差しない壊れたビルドシステムの1つがあります。-コンパイル。)
  • 「通常の」ユーザーは実際には単に「./configure; make」を実行することはできません。多くのことについて、PPAや配布ベンダーなど、誰かから提供されたパッケージをプルすることになります。「通常の」ユーザーは開発者ではなく、多くの場合tarballを取得していません。それがそこに当てはまるだろうと推定するための皆の側のそれは控えめです。tarballの一般的なユーザーは、物事をやっている開発者であるため、破損がある場合、その破損を非難することになります。

それは機能します...ほとんどの場合... Autotoolsについて言えることはそれだけです。これは、GNUプロジェクトにのみ関係するいくつかの問題を解決するシステムです...そのベースとなるコアツールチェーンコードについてです。(編集(2014年5月24日)):この種の懸念は心配する必要がある潜在的に悪いことであることに注意してください-Heartbleedはこの考え方から部分的に生じており、正しい最新のシステムでは、本当にAutotoolsが修正することの多くを扱うビジネスはありません。GNUはおそらく、Heartbleedで何が起こったかに照らして、コードベースを手際よく削除する必要があります)これを使用してプロジェクトを実行でき、Linux以外の場所では機能しないと思われる小さなプロジェクトでうまく機能する可能性がありますGNUツールチェーンは明らかに正しく機能しています。声明は「きれいのLinuxと統合」であることは非常に大胆な声明とはかなり間違いました。それは、GNU toolsuiteと合理的にうまく統合し、ITがその目標に持っている問題を解決します。

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

SConsはMake / GMake / etcの代替品です。見た目はとてもいいですが、すべてを考慮しましたが...

  • それでも、実際にはPOSIXのみのツールです。AutoToolsを使用するよりも、MinGWでこれを使用してWindowsを構築する方が簡単かもしれませんが、それでもPOSIXを実行するように調整されており使用するにはPython SConsをインストールする必要があります。
  • Scratchbox2のようなものを使用していない限り、クロスコンパイルの実行に問題があります。
  • 独自の比較から、CMakeよりも明らかに遅く、安定性が低いです。SConsと比較して、CMakeのネガティブな部分(POSIX側ではmake / gmakeをビルドする必要があります...)が出てきます。(余談として、あなたが必要としている場合ことを他のソリューションに比べて大幅に拡張性は、あなたのプロジェクトがあまりにも複雑だかどうかを自分自身に尋ねるべきです...)

このスレッドでのCMakeの例は少し偽物です。

しかしながら...

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

実際、あなたの目標は、ここで何を選択するかを決定する必要があります。

  • あなたが対処する必要がありますかLOTな作業バイナリを生成するために壊れたツールチェーンの?はいの場合は、上記で述べた欠点を認識しながら、Autotoolsを検討することをお勧めします。CMakeはこれの多くに対処できますが、Autotoolsほど心配する必要はありません。SConsはそれを心配するように拡張できますが、すぐに使える答えではありません。
  • Windowsターゲットについて心配する必要がありますか?もしそうなら、Autotoolsは文字通り実行されていないはずです。もしそうなら、SConsは良い選択かもしれませんし、そうでないかもしれません。もしそうなら、CMakeは確かな選択です。
  • あなたはクロスコンパイルを心配する必要は(ユニバーサルアプリは/ライブラリは、などGoogleのProtobufs、Apacheのスリフト、のようなものがありますかべきである ...これを気にしますか)?もしそうなら、Autotools Windowsについて心配する必要がない限り、あなたのために働きますが、物事があなたに変化するとき、あなたはあなたの設定システムを維持するために多くの時間を費やすことになります。SConsは、Scratchbox2を使用している場合を除いて、現時点ではほとんど問題ありません。実際にはクロスコンパイルに対応しておらず、その拡張性を使用して、次のように維持する必要があります。 Automakeを使用します。もしそうなら、サンドボックスからのリークの心配がなくクロスコンパイルをサポートし、Scratchbox2のようなものの有無にかかわらず動作し、OpenEmbeddedのようなものとうまく統合するため、CMakeを検討することをお勧めします。

多くの、多くのプロジェクトがqmakeやAutotoolsなどを捨て、CMakeに移行しているのには理由があります。これまでのところ、プロジェクトがWindowsのみまたはOSXのみの部分を考慮していないため、CMakeベースのプロジェクトがクロスコンパイル状況またはVisualStudioセットアップにドロップするか、少量のクリーンアップが必要になることを期待できます。コードベースに。私は実際にプロジェクト-ベースSConsはの外を期待することはできませんし、私は完全に得ているために1 /第3回以上Autotool群のプロジェクトを期待SOMETHING排除は、それが1つまたはScratchbox2の1を構築するホスト以外の任意の文脈上で右構築することを間違って。


12
ハートブリードに言及するセクションは、このイライラした怒りを損なう。OpenSSLは、壊れたmallocを検出するためにコンフィギュレータータイプのパッケージを使用せずに、システムライブラリを再実装し、より早く欠陥を検出するライブラリを作成したプラットフォーム開発者を打ち負かすという問題がありました。ポートプログラムへの一つの理由は、彼らはあなたがevcenあなたにしている作りに気付いていないそれらのほとんどの仮定にあまり依存しているとして、彼らはより高品質になっている
Rob11311

9
それはそれをまったく損なうものではないということです。Autotoolsを使用すると、そのようなことの代償を心配しています。これらの再実装は、まさにその考えの拡張です。そのまま次のレベルへ。あなたはその背景からそれを見る必要があります...その時点でそれはまったくそれを損なうことはありません。あなたはあなたの推論で根本的な原因に触れなかった-何が起こったのか。私はそれをShellshockや他のいくつかのようなものと一緒にそれにもたらした正確な思考を指しています。壊れている場合は、修正する必要があります。できない場合は、なぜそれを続けるのか尋ねる必要があります。
Svartalf 2014年

5
autotoolsとsconsに問題があることは間違いありませんが、この答えはCMakeの短所(私のビルドシステムの推奨、ビルドシステムの非常に悲しい状態のために)を指摘するのに不十分です。基本的に、CMakeは一貫性のないフラクタルであり、ほとんどのことを処理するコアの抽象化ではなく、個々のエッジケースの組み込みサポートを備えています。それは間違いなくプログラミングのダクトテープと保釈ワイヤーです。私は何か間違ったことをしていると確信していますが、CMakeLists.txtごとに1つのVSプロジェクトが許容できる場合を除いて、VisualStudioはサポートされません(私はVSユーザーではありませんが、Winfriendsはそれが悪いと言っています)。
weberc2

5
他の嫌われているプログラミングツールとは異なり、「CMake、良い部分」(おそらくパンフレットやブログの投稿)と呼ばれる本を作成するのに十分な資料はなく、PHPよりも悪いデザインのフラクタルに近いものです。
weberc2

2
@JAB VSユーザーから、これは慣用的ではないと言われています。実際、CMakeは私たちのプロジェクトのビルドシステムとして置き換えられました。というのは、上記の「慣用的な」VSプロジェクトファイルの作成方法を誰も理解できなかったためです。
weberc2

73

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

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


5
確かに、VCSを使用してソフトウェアを配布するのは良くないように聞こえますが。チェックアウトまたはクローンの内容がtarballの内容と同じである場合、tarballを推奨するのはなぜですか?
d -_- b 2013

5
@Toor私はあなたの質問を理解していません。私が取り組んでいるプロジェクトはすべて、VCSチェックアウトとは異なるtarballを生成します。2つを区別することは、信頼できる配布に役立ちます。
William Pursell 2013年

13
多くのプロジェクトでVCSを使用して最新のリリースを入手するように求めているのは事実ですが、これは開発者にのみ適しています。残念ながら、多くのユーザーはリリースtarballとVCSの違いを理解できていません。VCSからビルドしようとすると、より多くの依存関係が発生します。利用者は、必要があるかもしれませんasciidocか、help2manまたはdoxygen、重要なのは、正しいautotoolの組み合わせをか。これはautotoolsの大きなマーケティング上の問題でした。ユーザーは、tarballとVCSの違いを理解していないため、autoconfをインストールする必要があると誤解しています。
William Pursell 2013年

3
プロジェクトがCmakeの出力、プロジェクトファイル、および一般的なプラットフォーム用のMakefileを配布できないのはなぜですか。例:Win、Linux、MacOSX?lex / yaccツールの場合と同じように見えますが、ツールを使用せずにプラットフォームでビルドできるように、生成されたCコードを含めます
Rob11311

3
この議論で述べられている点は正しいと思いますが、この議論にはその点が欠けていると思います。ユーザーは他のすべてのものをインストールする必要があり、cmakeをインストールする必要があるかどうかは大きな問題ではありません。ライブラリー、コンパイラー・ツール・チェーン、およびソフトウェアのビルドに必要なその他のツールについてもっと心配します。
lanoxx 2014年

24

それは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を使用するパッケージは、ディストリビューションでシリアルにビルドされるだけです。


8
+1、そしてこれが本当なら世界はより良い場所になるでしょう。悲しいこと./configure CFLAGS=-O0に、makefile内のCFLAGSを上書きし、代わりにユーザーがを実行する必要があるパッケージで 失敗することがよくあります./configure --enable-debug。(例tmux)。
William Pursell 14

2
Autotoolsと同じくらい混乱することはなく、Williamが正しく指摘しているように、makefileに不適切にフレーム化されたCFLAGS = "<foo>"が含まれているため、すべてが地獄に倒されています。簡単に言うと、これは「古いのこぎり」のアイテムのもう1つです。また、CMakeの例は...もう一度... RELEASEまたはDEBUGを指​​定していない場合は、最初に行うことができます。不合格。
Svartalf

17

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


11
GNU標準は、のAutomakeで無効にできAUTOMAKE_OPTIONS = -foreignますMakefile.am。(または-foreignあなたのautogen.sh。ほとんどの人がこれを使っていると思います。)
ディートリッヒエップ

9
はい、しかしそれはAutomakeがREADMEファイルが必要であるかどうかのような表面的なGNUルールを実施するかどうかを制御するだけです。installcheckandのようなルールでGNUスタイルのtarballを構築するという基本的な前提は変わりませんdistclean。Autotoolsを使用しているときにそのような動作を変更しようとすると、時間を浪費しているだけです。
ptomato

1
それらは(理論的には)すべてのソフトウェアパッケージをまったく同じ方法で構築およびインストールすることを可能にします。
ptomato 2017

理論的には、BROKENコンパイラとOSを他のツールより適切に処理し、@ ptomatoのような表面的なルールを適用して、そこで強調表示することができます。あなたは、現代を使用している場合にツール(例については、GCCや打ち鳴らすを...言う)現代本当に、グーフィーLinuxまたは現在*のBSDを言う何もオペレーティングシステム、あなたはしていないNEED「ルール」があるが。彼らは実際には、あなたのためにはるかに多くの仕事をし、正直にクロスコンパイルのために助けにはなりません。最近のすべての使用法のほぼ半分は、組み込みLinuxおよび* BSD用です。なぜあなたはそこであなたを助けることができないものに行くのですか?
Svartalf

コメントでそれを認めているように見えるので、なぜあなたが回答を反対票を投じたのかわかりません...?
ptomato

9

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

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

したがって、何かがうまくいかない場合は、ビルドシステムを理解しなくても、標準のUnixツール(grep / sed / awk / viなど)を大ハンマーで使用することで、簡単に「修正」できます。

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


7
Autotoolsの問題は、CMakeと比較して「簡単に修正できる」とは思いません...
sleske

7
autotoolsは(CMakeのように)複雑なシステムであるためです。Autotoolsが「簡単に修正できる」と考える場合(これを考える理由があるかもしれません)、問題を簡単に修正できる方法で答えを説明するのが良いでしょう。
sleske

5
autotoolsは単一のファイル構成スクリプトを生成し、それを生成するためのすべてのファイルはディストリビューションに付属しています。grep / sed / awk / viを使用すると、簡単に理解して修正できます。これを、多くのファイルが/ usr / share / cmak * / ModulesにあるCmakeと比較してください。このファイルは、管理者のアクセス権がない限り、ユーザーが修正することはできません。cmakeビルドディレクトリを調べて、何が問題なのかを見つけたことがありますか?上から下に読むことができ、簡単なシェルスクリプトと比較すると、生成されたcmakeのは、何が起こっているのを確認するために以下のファイルをすることは極めて困難である
arved

2
はい、それは感覚につながります、ありがとう。私はあなたの答えにそれを追加する自由をとりました。元に戻してください:-)。
sleske 2017年

1
cmakeのローカルバージョンはいつでも使用できます。システムレベルでインストールされているものを使用する理由はありません。クロスプラットフォームの作業をしている人にとっては、それは完全に正常です。それは確かにほとんどの場合cmakeを使用する方法です。
James Moore
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.