web-dev-qa-db-ja.com

C ++でビルドスクリプトを記述することは意味がありますか?

CMakeを使用してプロジェクトのIDE/makefileを生成していますが、カスタムの「スクリプト」を呼び出して、コンパイルしたファイルを操作したり、コードを生成したりする必要があります。

以前のプロジェクトではPython=を使用しており、問題はありませんでしたが、今取り組んでいる2つの非常に大きなプロジェクトで多くの依存関係を管理するのに深刻な問題を抱えているので、あらゆる場所で依存関係を最小限に抑えます。

誰かが私にビルドスクリプトを書くためにC++を使用することを勧めました。プロジェクトのテーマ自体はすでにC++を使用しているため、次のようないくつかの利点があります。

  • プロジェクト全体をビルドするには、C++コンパイラとCMakeのみが必要で、それ以外は必要ありません(他のすべての依存関係はCまたはC++です)。
  • C++の型安全性(最新のC++を使用する場合)により、すべてが「正しく」取得されやすくなります。
  • それは私がよりよく知っている言語でもあるので、いくつかの良いPythonコード;
  • 実行速度の潜在的な向上(ただし、それが実際に認識できるとは思わない);

ただし、いくつかの欠点があると思います。まだ試していないため、実際の影響はわかりません。

  • コードを書くのに時間がかかるかもしれません(私はC++で効率よくすばやく動作するものを書くことができるので確信が持てないので、このシステムではおそらくそれほど長くは書けません)(コンパイル時間は長くないはずです)この場合は問題になります);
  • 入力として読み取るすべてのテキストファイルがUTF-8であると想定する必要があります。実行時にC++で簡単にチェックできるかどうか、言語がチェックしないかどうかはわかりません。
  • c ++のライブラリは、スクリプト言語よりも管理が困難です。

私には経験と見通しが欠けているので、長所と短所が足りないのかもしれません。だから問題は:これにC++を使用することは理にかなっていますか?報告する経験があり、重要かもしれない長所と短所を知っていますか?

15
Klaim

Pythonを使用するだけです。

私はC++で開発し、Pythonでビルドスクリプトを実行しています。C++でビルドスクリプトを実行するのは面倒です。

  • Pythonは、辞書、リスト、リストの辞書のネストされた辞書などを操作することを簡単にします(たとえば、私のスクリプトの1つは、すべてのツール、ツールのバージョン、およびツールのバージョンのパスのマルチレベル階層を使用します。 )C++はテンプレートとカスタムクラスで同じことを実行できますが、はるかに冗長です(これにより、より多くのコード行に変換され、一般に生産性が低下します)。
  • Pythonは、XMLおよびJSON処理、 subprocess 、および os.walk のような高レベルのライブラリとルーチンを提供します。繰り返しになりますが、C++でもこれを行うことができますが、ライブラリの検索、それらのAPIの学習、呼び出しの正しいアセンブル(多くの場合、低レベル)などの作業ははるかに多くなります。
  • ビルドスクリプトは、付加価値のないアクティビティです(リーンから用語を借りるため)。可能な限り高水準の言語を使用し、できるだけ早くそれらを完成させ、ユーザーにメリットをもたらす仕事に戻るのが良いでしょう。
  • 私の経験では、ビルドスクリプトは予期しない方法で成長する傾向があります。最初はC++のタスクが単純に見えても、急いで複雑になる可能性があります。新しい要件が出てきたとき、C++で行うよりも、Pythonスクリプトでの処理に取り組む方がはるかに簡単です(新しいライブラリAPIを見つけたり読んだりする必要があるかもしれませんが、等。)。

C++にリストする利点について:

  • 単一の依存関係(Python)を追加しても、ビルドが大幅に複雑になることはありません。たとえば、ほとんどのLinuxインストールではすでに標準になっています。 Pythonの「バッテリー付属」ライブラリーのおかげで、ビルドスクリプトが依存するC++ライブラリーよりも管理が容易になる場合があります。
  • C++が提供する型の安全性は、小さなスクリプトではなく、大規模なプロジェクトに最も役立ちます。
  • PythonはC++を非常によく補完し(高レベルと低レベル、動的に型付けされたものと静的に型付けされたものなど)、後でC++と統合することもできます(SWIGとBoost.Pythonのおかげです)。 C++プログラマにとって学ぶ価値があります。
  • あなたが言ったように、実行速度は問題ではないはずです。
24
Josh Kelley

これはケース固有の質問だと思います。ビルドスクリプトにC++を使用することが理にかなっているかどうかにかかわらず、正解はないと主張します。それを理解する唯一の方法は、実際に試すことです。

個人的には、Python C++より優れていると思います。これは、言語の表現力が向上し、バイナリファイルの操作とコードの生成のタスクを管理するための標準ライブラリツールがより簡単になったためです(もちろん、個人的な意見です)。もちろん、タスク用に開発された洗練されたライブラリーが利用できる場合がありますが、そうでない場合は、個人的にはPythonが「より頻繁に正しい」答えになることを確信しています。一般的なケースです。

1
zxcdw

自分でスクリプトを作成しないでください。あなたは努力を重ね、車輪を再発明しています。

[〜#〜] scons [〜#〜] または C++ビルドシステムのサポート があるMaven 3のようなものを使用します。

優れたビルドシステムは、言語に関係なく、機能する実行可能アーティファクトをビルドするために、スクリプトの形でカスタムロジックを必要とするべきではありません。

ビルドシステムをカスタマイズするためのスクリプトを記述する必要がある場合、それは良いビルドシステムではありません。ビルドシステム用のプラグインを作成するのは別の話ですが、それでもほとんどの場合、環境/ハードウェアに非常に特有であり、めったに使用されないものでなければなりません。

1
user7519

質問に集中するには:

C++でビルドスクリプトを書くことは意味がありますか?

答えは単純ですno

現在受け入れられている答えはpythonに拡大し、有効な懸念事項をすべてリストしますが、言語に依存しない理由を追加したいと思います。

あなたが本当にしないでくださいあなたがそれを助けることができるなら、-anyコンパイルされた言語で何かをスクリプト化したいです:

  • bootstrapスクリプトを実行するには、スクリプトが必要です!
  • または、コンパイルされたスクリプトをソース管理にチェックインする必要があります(チェックインされたソースとの同期を維持してください!)
  • スクリプトには、突然、添付されたスクリプトのビルド構成もあります。 (それを維持する必要があります!)

さらに、他の答えに行く:

おそらくあなたはまたしないでくださいビルドスクリプトを作成するために「生の」スクリプト言語を使用したいと思います(C++の複雑さはCMakeによって処理されると思います)。

おそらくがすべきことは Build の1つを選択することです。 システムoutあり 。そして、あなたの請求書があなたの法案に適合するかどうかを確認してください。スクリプト可能性/拡張性/ play-Nice-with-CMake /クロスプラットフォーム性。

0
Martin Ba