web-dev-qa-db-ja.com

現在最高のビルドシステムは何ですか

数年前、私はMakeではないビルドシステムの使用を検討しましたが、CMakeやSConsなどのツールはかなり原始的なものでした。状況が改善したかどうかを知りたいのですが。したがって、次の基準の下で、現在最も優れたビルドツールは何ですか。

  • プラットフォームに依存しない:Windows、Linux、Macで動作するはずです
  • 言語にとらわれない:C/C++やその他の静的言語の構築など、一般的なものに対する組み込みサポートが必要です。完全なautotoolsスイートをサポートする必要はないと思います。
  • 拡張可能:restructuredText、latex、カスタムフォーマットなどからファイルを生成するためのルールを記述できる必要があります。ルールを記述する必要のある言語は本当に気にしませんが、DSLではなく実際の言語を使用します。
  • 手作業でXMLを作成することは避けたいと思います。たとえば、antには必要だと思います。
  • 自由に利用可能(できればオープンソース)

「最高」という用語は少し主観的ですが、上記の基準によって回答を客観的に評価できると思います。

43
Paul Biggar

私は最終的に premake に投票します。それは古い兄弟ほど強力ではありませんが、主な利点は不合理な単純さと使いやすさです。マルチコンパイラ、マルチプラットフォームコードを簡単に作成し、Visual Studioソリューション、XCodeプロジェクト、Makefileなどをネイティブに生成します。追加の作業は必要ありません。

24

もちろん、それはあなたの優先順位が何であるかに依存します。使いやすさを第一に考えている場合は、ファイルシステムにフックして言語に依存しない方法で依存関係を自動的に追跡する新しいビルドシステムが少なくとも2つあります。

1つはtupです。

http://gittup.org/tup/

もう1つは加工します。

http://code.google.com/p/fabricate/

最もパフォーマンスが高く、移植性があり、成熟しているように見える(そして私が実際に使用した)ものはtupです。それを書いた人は、すべてがgitサブモジュールであり、すべて(カーネルを含む)がtupでビルドされているおもちゃのLinuxディストリビューションさえも維持しています。カーネルのビルドシステムについて読んだことから、これはかなりの成果です。

また、Tupは古いターゲットやその他の残骸をクリーンアップし、.gitignoreファイルを自動的に維持できます。その結果、ターゲットのレイアウトと名前を試すのは簡単になり、すべてを再ビルドせずにgitリビジョン間を自信を持ってジャンプできます。 Cで書かれています。

Haskellを知っていて、非常に高度なユースケースで何かを探しているなら、shakeをチェックしてください:

http://community.haskell.org/~ndm/shake/

更新:私は試していませんが、この新しい「buildsome」ツールもファイルシステムにフックされており、tupに触発されたため、関連しています。

https://github.com/ElastiLotem/buildsome

14
Andrew Wagner

したがって、質問に記載されている基準だけで判断すると、最適と思われるビルドシステムはおそらく waf -純粋なPythonであり、C++や他の言語のサポートを提供します。 DSL。


しかし、私の個人的な経験から、私はC++プロジェクトにはCMakeを好みます。 (私はCMake、SCons、wafを試してみて、おおよその順序でそれらを気に入った)。 CMakeは一般的なソリューションですが、C++のサポートが組み込まれているため、実際にC++を実行しているときの一般的なソリューションよりも優れています。

CMakeのC++のビルドモデルは宣言型で命令型ではないため、私にとっては使いやすくなっています。 CMake言語の構文は素晴らしいものではありませんが、奇妙な構文を使用した宣言型ビルドは、Pythonの命令型ビルドに勝っています。 3つのうち、CMakeはプリコンパイル済みヘッダーなどの「高度な」ものを最もよくサポートしているようです。プリコンパイル済みヘッダーを設定すると、再構築時間が約70%短縮されました。

CMakeの他のプラスには、まともなドキュメントとかなりのコミュニティが含まれます。多くのオープンソースライブラリには、ツリー内またはCMakeコミュニティによって提供されるCMakeビルドファイルがあります。 CMakeをすでに使用している主要なプロジェクトがいくつかあり(OGREが頭に浮かびます)、BoostやLLVMなどの他の主要なプロジェクトがCMakeに移行中です。

ビルドシステムを試してみたときに私が見つけた問題の一部は、OS XでNPAPIプラグインをビルドしようとしていたことであり、XCodeがそうするために必要なフラグの正確な組み合わせを提供するようにセットアップされているビルドシステムはほとんどないことがわかりました。 CMakeは、XCodeが複雑で動くターゲットであることを認識し、生成されたXCodeプロジェクト(およびVisual Studioだと思います)にコマンドを手動で設定するためのフックを提供します。これは、私にとっては非常に賢い方法です。

ライブラリを構築するのか、アプリケーションを構築するのかによって、最適な構築システムが決まる場合もあります。 Boostは、「デバッグ」や「リリース」よりも複雑なビルドタイプを管理するための最も包括的なサポートを提供することもあるため、Jamベースのシステムをまだ使用しています。ほとんどのBoostライブラリには5つまたは6つの異なるバージョンがあり、特にWindowsでは、CRTの異なるバージョンにリンクする互換性のあるライブラリが必要になると予想されます。

私はWindows上のCMakeには何の問題もありませんでしたが、もちろんあなたの走行距離は異なる場合があります。ビルドの依存関係を設定するためのまともなGUIがありますが、再ビルドに使用するのは不格好です。幸いなことに、コマンドラインクライアントもあります。これまでに決めたのは、objdirからCMakeを呼び出す薄いラッパーMakefileを用意することです。 CMakeはobjdirにMakefileを生成し、元のMakefileはそれらを使用してビルドを行います。これにより、ソースディレクトリから誤ってCMakeを呼び出して、リポジトリが乱雑になるのを防ぐことができます。 MinGWと組み合わせると、この「CMakeサンドイッチ」は、非常に一貫したクロスプラットフォームのビルドエクスペリエンスを提供します。

14
Ben Karel

CMake

CMakeは、オペレーティングシステムでコンパイラに依存しない方法でビルドプロセスを管理する拡張可能なオープンソースシステムです。

6
Ben S

Gradle は、上記のすべての基準に一致するようです。

これは、MavenとAntの組み合わせを最大限に活用したビルドシステムです。私にとって、それは最高です。

2
Vincent Cantin

Seleniumプロジェクトは Rake に移行します。これは、最良の理由ではなく、他のすべてのビルドツールよりもわずかに優れて複数の言語を処理し、クロスプラットフォーム(Rubyで開発)であるためです。

すべてのビルドツールには問題があり、人々はそれらと共存することを学びます。 JVMで実行されるものは、アプリの構築に非常に適している傾向があるため、 AntMaven (私はその恐ろしいことを知っています)、 Ivy 、- レーキ

1
AutomatedTester