CMakeはどのように機能しますか?


158

私はこれを自分のためだけに求めているのではありません。この質問が私のような多くの初心者のための参照になることを願っています。このような小さなCMakeLists.txtファイルの 場合、舞台裏で何が起こっているのかについて完全に困惑していることがわかりました

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

そしてそのような小さな tutorial.cpp

int main() { return 0; } 

非常に多くのファイルが生成されています

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

そして、CMakeFiles非常に多くのファイルとフォルダを含むフォルダ

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

背後で何が起こっているのか(つまり、なぜファイルを生成する必要があるのか​​、その目的は何か)を理解していないことが、CMakeを学ぶ上での最大の障害でした。

だれかが知っているなら、後世のために説明していただけませんか。これらのファイルの目的は何ですか。「」と入力cmake .すると、プロジェクトをビルドする前にcmakeが正確に構成および生成されます。


1
ソース外のビルドを知っています。ソース外ビルドを行わずに、生成されたファイルをクリーンアップする方法をまだ探している場合、この手法はうまく機能します:stackoverflow.com/a/12055610/453673
Nav

3
aosabook.org/en/cmake.htmlにすばらしい説明があり、おそらく質問に対する詳細な回答があります(ここでは簡単に要約できません)。
Parasrish 2016年

@SebTuリンク切れ。cmake.htmlページが存在しません。
ナビゲーション

3
@Nav Yap、マークアップ構文をめちゃくちゃにして、すみません。したがって、ここで修正されたバージョン:cmakeが初めての人には、cmakeのアーキテクチャを読むことをお勧めします。cmakeの詳細を失うことなくどのように機能するかを知るのに十分な情報を提供します。
SebNag 2017年

回答:


92

秘密は、生成されたファイルが何をするかを理解する必要がないことです。

CMakeは、ビルドシステムに多くの複雑さをもたらします。そのほとんどは、複雑なソフトウェアプロジェクトのビルドに使用した場合にのみ効果があります。

良い知らせは、CMakeがこの混乱の多くをあなたから遠ざけるのに良い仕事をするということです:ソース外のビルドを使用て、生成されたファイルを見る必要すらありません。これまでにこれを実行しなかった場合は(書いたので、おそらくそうですcmake .)、続行する前に確認してください。ビルドディレクトリとソースディレクトリを混在させることは、CMakeで本当に苦痛であり、システムの使用方法ではありません。

一言で言えば:代わりに

cd <source_dir>
cmake .

いつも使う

cd <build_dir_different_from_source_dir>
cmake <source_dir>

代わりに。私は通常build、ソースディレクトリ内の空のサブフォルダーをビルドディレクトリとして使用します。

あなたの苦痛を和らげるために、CMakeが生成する関連ファイルの概要を簡単に説明しましょう。

  • プロジェクトファイル/ Makefiles-実際に必要なもの:選択したジェネレーターでプロジェクトをビルドするために必要なファイル。これは、Unix MakefileからVisual Studioソリューションまで何でもかまいません。
  • CMakeCache.txt-これは、実行間で値をキャッシュするために使用される永続的なキー/値の文字列ストレージです。ここに格納される値は、ライブラリの依存関係へのパス、またはオプションのコンポーネントを構築するかどうかです。変数のリストは、ccmakeまたはを実行したときに表示されるものとほとんど同じですcmake-gui。これは時々見るのに役立ちますが、可能であれば値を変更するために前述のツールを使用することをお勧めします。
  • 生成されたファイル -これは、自動生成されたソースファイルから、ビルドされたプロジェクトを他のCMakeプロジェクトと再統合するのに役立つエクスポートマクロまで、何でもかまいません。これらのほとんどはオンデマンドでのみ生成され、質問のような単純なプロジェクトには表示されません。
  • それ以外のものは、ビルドシステムを幸せに保つためにかなりのノイズです。特に、CMakeFilesサブディレクトリ内で起こっていることを気にする必要はありませんでした。

一般に、CMakeが生成するファイルをいじらないでください。すべての問題は、何らかのCMakeLists.txt方法で内部から解決できます。結果が期待どおりにプロジェクトをビルドする限り、おそらく問題ありません。残酷な詳細についてはあまり心配しないでください-これはCMakeがそもそもあなたを避けようとしていたものだからです。


ありがとう。ソース外のビルドを認識していましたが、ご存知のように、この質問をする目的は、さらに理解することでした。あなたの答えのCMakeCache.txtの部分は本当に役に立ちました。このような説明を探していました。また、私の質問の最後の文:「プロジェクトをビルドする前のcmakeの構成と生成とは正確には何ですか
Nav

1
CMakeFilesディレクトリにはCMakeError.logCMakeOutput.logCMakeビルドのトラブルシューティングに含まれ、重要です。
セルジュロガッチ

1
CMakeFiles/target_name.dirディレクトリで確認する必要がある2つのことは、flags.makeおよびlink.txtファイルです。上流のプロジェクトからフラグ/リンクされたものを継承した複雑なプロジェクトでこれらをチェックする必要がありました。例:TPL AがTPL Bに依存していたため、エラーが発生しました。また、私のプロジェクトは、ローカルにインストールしたBに依存していました。しかし、Aは(ローカルインストールではなく)私のシステムのBのバージョンを使用しましたが、有効なオプションが異なり、最初にそれが発生したため、プロジェクトでエラーが発生しました。link.txtを見るだけで、これが起こっていることがわかりました。
Bartgol

13

そのウェブサイトで述べたように:

Cmakeは、コンパイラに依存しない方法を使用してソフトウェアのビルドプロセスを管理するためのクロスプラットフォームのオープンソースビルドシステムです。

ほとんどの場合、それはプロジェクト/ makeファイルを生成するために使用されます-あなたの例ではMakefile、あなたのソフトウェアをビルドするために使用される(主にLinux / Unixプラットフォーム上で)それが生成しました。

Cmakeを使用すると、特定のコンパイル/プラットフォーム用のプラットフォーム固有のプロジェクト/ makeファイルを生成するクロスプラットフォームビルドファイルを提供できます。

たとえば、WindowsでVisual Studioを使用してソフトウェアをコンパイルしてから、CMakeLists.txtファイルに適切な構文を使用して起動できます。

cmake .

Windowsプラットフォーム上のプロジェクトのディレクトリ内で、Cmakeは必要なすべてのプロジェクト/ソリューションファイル(.slnなど)を生成します。

Linux / Unixプラットフォームでソフトウェアをビルドする場合は、CMakeLists.txtファイルがあるソースディレクトリに移動して同じファイルをトリガーするcmake .だけで、シンプルmakeまたはを介してソフトウェアをビルドするために必要なすべてのファイルが生成されます make all

ここでは、主要なCmake機能について非常に優れたプレゼンテーションを行っています。http //www.elpauer.org/stuff/learning_cmake.pdf

編集

プラットフォーム依存ライブラリに/変数定義などを含めたい場合は、この構文をCMakeLists.txtファイルで使用できます

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

あなたは、インスタンスのためにあなたがBoostライブラリを持っていないことを通知しますCMakeの失敗から、所定の位置にビルドを予防することができますそれらの使用とコマンドの多くもありますfilesystemし、regexシステムにインストールが。これを行うには、次の構文を使用できます。

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

適切なシステム/ IDE /コンパイラのメイクファイルを生成することを確認した後。


1
Patrykに感謝します。役立つ回答ですが、リンクしたPDFは、基本的にCMakeの実装であるCMakeの学習の第2段階を説明しています。CMakeで地球上で何が起こっているのかを人が理解しなければならない最初の段階の説明について質問します。
ナビゲーション

@Nav私の答えを少し広げました。詳細については、引き続きWebを検索できます。
Patryk 2013

これは、尋ねられた質問に答えるのとはかなりかけ離れています。
SenhorLucas

1

CMakeがどのように機能するかは開発者にとっての問題なので、ここでは答えられません。

ただし、CMakeを使用する必要がある場合、およびCMakeがどのように機能するかについて心配する必要がある場合については、少し役立つガイダンスを提供できます。私は「ああ、うまくいく」という答えも好きではありません。特に、ソフトウェアでは、「うまくいく」とは限らないので、いつか細かい点まで細かく把握する必要があります。

CMakeは産業用強度のツールです。それはいくつかの非常に複雑なプロセスを自動化し、特にかなり新しい開発者として、CMakeが処理できるすべてのオペレーティングシステムとビルドツールの限られた知識で作業していることに気づかないかもしれない多くの変数を考慮に入れます。非常に多くのファイルが生成される理由と、物事が非常に複雑に見える理由は、それらの他のシステムはすべて複雑であり、説明と自動化が必要なためです。さらに、ツールの「キャッシュ」およびその他の時間節約機能の問題があります。CMakeですべてを理解するには、これらのビルドツールとOSのすべて、およびこれらの変数のすべての可能な組み合わせを理解することを意味します。

大規模なクロスプラットフォームビルドシステムの管理を担当しておらず、コードベースが数KLOC、場合によっては最大100KLOGである場合、CMakeの使用は100,000ドルの林業ツリーの削除の使用に少し似ていることに注意することが重要です2フィート×2フィートの花畑から雑草を取り除く機械。(ちなみに、そのようなマシンを見たことがなければ、YouTubeで探してください。素晴らしいマシンです)

ビルドシステムが小さくてシンプルな場合は、手動で独自のメイクファイルを作成するか、自分でスクリプトを作成する方がよいでしょう。メイクファイルが扱いにくくなったとき、または別のプラットフォームでシステムのバージョンをビルドする必要があるときは、CMakeに切り替えることができます。その時点で、解決するべき多くの問題があり、それについてより焦点を絞った質問をすることができます。それまでの間、CMakeについて書かれた優れた本をいくつかチェックしてください。8)

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