回答:
Make(またはMakefile)はビルドシステムです-コンパイラやその他のビルドツールを駆動してコードをビルドします。
CMakeはビルドシステムのジェネレーターです。Makefileを生成したり、Ninjaビルドファイルを生成したり、KDEvelopまたはXcodeプロジェクトを生成したり、Visual Studioソリューションを生成したりできます。同じ開始点から、同じCMakeLists.txtファイル。したがって、プラットフォームに依存しないプロジェクトがある場合、CMakeはそれをビルドシステムに依存しないようにする方法でもあります。
Visual Studioに慣れているWindows開発者と、GNU Makeで誓うUnix開発者がいる場合、CMakeは(その1つ)に進む方法です。
プロジェクトをマルチプラットフォームまたは広く使用できるようにする場合は、常にCMake(または別のビルドシステムジェネレーターですが、CMakeが私の好みです)を使用することをお勧めします。CMake自体にも、依存関係の検出、ライブラリインターフェイスの管理、CTest、CDash、CPackとの統合などの優れた機能がいくつかあります。
buildsystemジェネレーターを使用すると、プロジェクトの将来性が高まります。あなたが現在GNU-Makeのみである場合でも、後で他のプラットフォーム(Windowsや組み込みのものなど)に拡張することを決定した場合、または単にIDEを使用したい場合はどうなりますか?
find_package()やテスト/パッケージ化のサポートなど、他の機能もあります。
CMakeが「ビルドジェネレーター」であるという説明は、よくある誤解です。
技術的には問題ありません。それがどのように機能するかを説明するだけで、何が機能するかは説明しません。
質問の文脈では、彼らは同じことをします:C / C ++ファイルの束を取り、それらをバイナリに変換します。
では、実際の違いは何ですか?
CMakeははるかに高レベルです。C ++をコンパイルするように調整されているため、作成するビルドコードがはるかに少なくなりますが、汎用ビルドにも使用できます。make組み込みのC / C ++ルールもいくつかありますが、それらはほとんど役に立ちません。
CMake2段階のビルドを行います。低レベルのビルドスクリプトを1 ninjaつmakeまたは他の多くのジェネレーターで生成し、それを実行します。通常積み重ねられるすべてのシェルスクリプト部分Makefileは、生成段階でのみ実行されます。したがって、CMakeビルドは桁違いに速くなります。
一度makeアーティファクトを構築し、それが構築された方法を忘れてしまいました。ビルド元のソース、コンパイラフラグ CMakeそれを追跡し、makeあなたに任せます。ライブラリー源の一つは、以前のバージョンのため、削除された場合はMakefile、makeそれを再構築しません。
モダンCMake(バージョン3.something以降)は、「ターゲット」間の依存関係に関して機能します。ターゲットは依然として単一の出力ファイルです(悲しいことに)が、推移的な(CMake用語では「パブリック」/「インターフェース」)依存関係を持つ可能性があります。これらの推移的な依存関係は、依存パッケージに対して公開または非表示にすることができます。CMakeディレクトリも管理します。ではmake、ファイルごとのレベルとディレクトリごとの管理のレベルで立ち往生しています。
makeフラグファイルを使用して最後の2つのギャップをカバーするようにコードを作成することもできますが、それは自分で行います。チューリング完全な言語(2つ、時には3つがガイルを数える)makeが含まれていて、それらすべてが恐ろしいです。
正直なところ、これは何CMakeでmakeあり、共通しています-彼らの言語はかなり恐ろしいです:
で開始する。
しかし、CMakeあなたははるかに少ないコード行を書きます。