146

私は C++ で新しいプロジェクトを開始することを検討しています - 最初は自分の時間に - 利用可能なビルド システムを調査しています。答えは「多く、そしてそれらはすべてひどい」であるように思われます.

これに特に必要な機能は次のとおりです。

  1. C++11 のサポート
  2. クロスプラットフォーム (Linux が主なターゲットですが、少なくとも Windows でもビルドできます)
  3. 適切な単体テストのサポート
  4. コードを分離するための複数のモジュールのサポート
  5. コード生成のサポート (asn1c または protobuf を使用 - まだ 100% 確実ではありません)
  6. メンテナンスが容易

これで、CMake と Autotools を使用して、そのうちの 1 ~ 4 つを簡単に実行できることがわかりました。おそらく、SCons と Waf、そして他のカップルとも。問題は、それらを使用してコード生成を正しく行う方法を考えたことがないことです。つまり、ビルド プロセスが最初に実行されるまで存在しないソース ファイルであるため、ビルド システムが実行可能コードに変換できる必要があるソース ファイルです。しかし、ビルドが開始されるまで実際にはわかりません...(特にASN1Cは、一緒に動作できる必要がある数十のヘッダーとソースファイルを生成し、実際に生成されるファイルのセットは、asnファイルの内容によって異なります)また、これらのどれも特に保守が容易ではないという事実 - CMake と Autotools には、それらが機能するために管理する必要がある独自のスクリプトの膨大なセットがあります。

それで、このようなものにはどのビルドシステムが推奨されますか? それとも、今のところ make ファイルとシェル スクリプトで行き詰まるのでしょうか?

4

8 に答える 8

129

「多くてひどい」の+1。

しかし、「最もリッチ」で「最もスケーラブル」なのはおそらくCMakeであり、これは Makefile ジェネレーターです (ネイティブの MSVC++ *.proj/も生成します*.sln)。奇妙な構文ですが、一度学習すると、さまざまなプラットフォーム用のビルドを適切に生成できるようになります。「新しく始めた」場合は、おそらくCMake. それはあなたのリストを処理する必要がありますが、あなたの「コード生成」は、あなたが何をしたいのかによって、ビルドシステムを超えて「独自の人生」を取ることができます. (下記参照。)

単純なプロジェクトの場合、QMakeジェネレーターは問題ありません (QMake を使用するために Qt ライブラリを使用する必要はありません)。しかし、あなたは「単純」を説明していません-コード生成と「余分なフェーズ」は、 (または)CMakeのような独自の拡張機能用の豊富な API を備えたものをおそらく必要とすることを意味します。SconsWaf

私たちは職場でSconsを使用しています。「防弾ビルド」を生成しますが、非常に遅いです。ほど強力なシステムは他にありませんScons。しかし、それは遅いです。これは Python で書かれており、「ワークスペース組織」 (モジュールの依存関係を指定するだけ) のインターフェイスを拡張しました。これはScons設計意図の一部です (この種の Python による拡張)。便利ですが、ビルドは遅いです。防弾ビルド (どの開発者ボックスでも最終リリースを作成できます) を取得できますが、遅いです。そして、それは遅いです。Sconsただし、 を使用する場合は遅いことを忘れないでください。そして、それは遅いです。

2000 年から 10 年経った今でも、空飛ぶ車がないことを考えると、気分が悪くなります。それらを手に入れるには、おそらくさらに100年か何か待たなければならないでしょう。そして、私たちはおそらく、まだくだらないビルドシステムで構築されている空飛ぶ車に乗って飛び回ることになるでしょう。

はい、それらはすべてひどいです。

【コード生成について】

Scons「フェーズ」で動作し、それらは「やや静的」です。ビルドの一部として生成されたコードをビルドできます (人々はいくつかの異なる方法でこれを行っています) が、これは「非常に Scons に似ていないもの」と説明されています。

「いくつかのファイルを前処理してソースファイルを生成する」という単純なものであれば、大したことはありません (多くのオプションがあり、これがファイルの前処理のqmakeために書かれた理由です)。moc*.hpp/*.cpp

ただし、これを「重い方法」で行う場合は、独自のスクリプトを作成する必要があります。たとえば、データベースにクエリを実行し、「レイヤー」間のインターフェイスとして C++ クラスを生成するビルド スクリプトの一部を作成しました (従来の 3 層アプリケーション開発で)。同様に、IDL を使用してサーバー/クライアントのソース コードを生成し、バージョン情報を埋め込んで、複数のクライアント/サーバーを異なるバージョンで (同じ「クライアント」または「サーバー」に対して) 同時に実行できるようにしました。大量のソースコードが生成されます。それが「ビルドシステム」であると「ふりをする」こともできますが、実際には、「構成管理」の重要なインフラストラクチャであり、その一部が「ビルドシステム」です。たとえば、このシステムは「テイクダウン」と「

于 2012-08-18T22:21:07.013 に答える
15

私はこれらを見つけましたが、まだすべてを個人的に使用していません。

Ninja、スピードに重点を置いた小さなビルドシステム。Google は Make: linkの代わりに Ninja を使用して Android をビルドするようになりました。

Shakeは、強力で高速なビルド システムです。

Tup、高性能ビルド システム。アルゴリズムベースの設計。 タップの分析

すべてがクロスプラットフォームになり、Windows をサポートします。繰り返しになりますが、私はまだ自分でテストしていないので、残りの要件についてはまだわかりません. それらは商用開発で​​使用されており、CIGは Ninja を取り上げました。プロジェクト ジェネレーターで Ninja の使いやすさとスピードを気に入っています。最初の 2 つは、Scons、Ant などに似ています。

于 2014-12-15T18:08:48.447 に答える
10

Sconsは非常にフレンドリーで柔軟なシステムですが、Lothar、それは本当に遅いです。

しかし、Pythonで書かれたプログラムのパフォーマンスを向上させる方法があります。このJITの使用。既知のすべてのプロジェクトの中で、PyPyは非常に強力で、急速に成長し、意欲的なJIT支援のPython2.7実装です。PyPyとPython2.7の互換性は驚くべきものです。ただし、SconsはPyPy互換性ウィキでサポートされていないプロジェクトとして宣言されています。 一方、Wafは、Pythonベースのautotoolsの後継としてモデル化されており、PyPyインフラストラクチャによって完全にサポートされています。私のプロジェクトでは、PyPyへの移行でアセンブリの速度が5〜7倍になりました。PyPyからのパフォーマンスレポートを見ることができます

最新の比較的高速なビルドシステムには、Wafが適しています。

于 2013-02-17T23:44:09.277 に答える
10

Google ビルド システムは良い代替手段です: http://bazel.io/

于 2015-12-09T09:54:28.730 に答える
5

私は SCons を使用しており、このビルド システムに感銘を受けました。SCons は python と python 自体で拡張可能です。Python には必要なものがすべてあり、ロジックをコーディングするだけで、低レベルの機能はすべて SCons と Python で既に実装されており、クロスプラットフォームであるため、素晴らしいです。優れたプログラミング スキルがあれば、ビルド スクリプトは完璧で簡単に見えます。

Make、CMake、および同様のビルド システムは、マクロのゴミのように見えます。Waf は SCons アナログです。私は Waf を試していますが、SCons の方がフレンドリーなので、SCons にとどまりました。

群衆の意見では、SCons は遅すぎますが、プロジェクトの途中でビルド速度による make と SCons の違いは見られませんでした。代わりに、SCons は並列ビルドでうまく機能しましたが、make はそれで大きな問題を抱えています。

また、SCons を使用すると、構成、ビルド、展開、テンプレートから構成を生成し、テストを実行し、Python と SCons でコーディングできるその他のタスクをすべて 1 つにまとめて実行できます。それは非常に大きな利点です。

単純なプロジェクトの場合、CMake も適切な選択です。

于 2012-08-18T10:15:48.643 に答える
3

私のセントを追加するだけです:プリメイク

http://industriousone.com/premake

wiki にも専用の Web ページがあります。

于 2012-08-18T22:42:25.287 に答える