ビルドスクリプトをC ++で書くのは理にかなっていますか?


15

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

以前のプロジェクトではPythonを使用していましたが大丈夫でしたが、現在作業中の2つの非常に大きなプロジェクトで多くの依存関係を管理するのが大変なため、どこでも依存関係を最小限に抑えたいと思います。

誰かが、そのための言語依存関係を追加する代わりに、C ++を使用してビルドスクリプトを作成するように私に提案しました。プロジェクトのテーマはすでにC ++を使用しているため、いくつかの利点があります。

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

しかし、いくつかの欠点があるかもしれないと思うし、私はまだ試していないので、本当の影響がわからない:

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

私には経験と洞察力が欠けているので、長所と短所が足りないかもしれません。質問は次のとおりです。これにC ++を使用するのは理にかなっていますか?報告する経験はありますか、また重要な利点と欠点がありますか?


1
単一の言語インタープリターに依存してビルドすることは、特にPythonであるため、それほど悪くはないようです。非常に移植性が高く、Linuxで広く普及しており、Windowsでも簡単に入手できます。追加のPythonライブラリが必要な場合は、virtualenvを使用できます。1つのPythonファイル(出荷可能な)インターネット接続と、virtualenvのセットアップ、インストール、および実際のその環境でスクリプトをビルドします。ビルド内の追加のスクリプトと、必要に応じてインターネット接続を取得できます。

かなり信頼性の高いテキストのエンコーディングを推測できます。
DeadMG

@DeadMGええ、しかし、あまりにも多くの作業が必要場合は手作業で行います(推測が必要で、「このASCIIまたはUnicodeであり、Unicodeの場合、ビット数とバイト順は何ですか?」別の依存関係を追加すると(このためのフリーで独立したライブラリがある場合)、C ++にドロップしてPythonに依存することをやめるという点を打ち負かします。

@delnanはい、まだインストールする言語が増えています。あなたの説明から、追加の依存関係は「悪くない」と思われますが、すでに管理する必要があるため、使用する言語を制限するのに役立つ可能性があるため、それを検討しています。また、組み込みのスクリプト言語(プロジェクトに直接C ++で実装されている)、javascript / HTML / CSS、XML、および既に心に留めておくべきその他の形式を使用しています。
クライム

2
C ++ビルドスクリプトのビルドに何を使用しますか?
jk。

回答:


24

Pythonを使用してください。

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

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

C ++で挙げた利点について:

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

クロスpaltformプロジェクトでcmakeを使用して1年間苦労した後、これを行いました(pythonビルド)。最終的に、依存関係のチェック(ビルドの最も複雑な部分)を試みることさえしませんでした。自動化のためには、とにかくとCのすべてを再構築したいビルドしますので、++非常に多くの複雑な依存関係があります
マーティン・ベケット

1

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

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


1

自分でスクリプトを書かないでください。努力を重ね、車輪を再発明します。

SCONSC ++ビルドシステムをサポートする Maven 3のようなものを使用してください。

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

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


1
説明したように、私はすでにcmakeを使用していますが、それでもカスタムスクリプトを実行する必要があります。ビルドプロセス自体ではなく、これらのカスタムスクリプトについて話しています。
クライム

1
私はMavenが大好きです。「Hell World」Cプログラムを構築するために必要なスクリプトは、プログラムよりも長いのです!
quant_dev

@quant_dev、私は自分のWebページでMavenの使用を初めて検討したことを覚えています。それは私がそれとはまったく関係ないことを望んだ最初の兆候でした!
ブレイディ

私はSConsが好きでした、それは少し遅いですが、非常に使いやすいです。
quant_dev

1
@JarrodRoberson「スクリプト」をあまりにも自由に使用しました。その構成ファイルを意味します。宣言的であることで、Mavenが自動的に移植性を高め、保守しやすくなるかどうかはわかりません。ただし、柔軟性が低下するため、大規模なプロジェクトでは苦痛になります。
-quant_dev

0

質問に集中するには:

ビルドスクリプトをC ++で書くのは理にかなっていますか?

答えは簡単ですがありません

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

あなたは本当にいないのスクリプトは何もしたいすべてのあなたはそれを助けることができればコンパイル言語:

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

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

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

あなたはおそらく、やるべきことの一つ選んでビルドをシステムアウトそこに。そして、1つがあなたの手形に合うかどうかを確認します スクリプト可能性/拡張性/ play-nice-with-CMake /クロスプラットフォーム。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.