8

cmakeコミュニティ全体が私を荒らしているように感じます。「チュートリアル」やリソースはどれも私には意味がありません。私は何かが欠けているようです。私を最も混乱させているのは言語であり、私が見たチュートリアルのどれも、ほとんどUNIXを持たず、経験を積んだ人にcmakeを説明するのにまともなものではありません.

とにかく、私は FireBreath で作業しており、cmake を広く使用しています。プロジェクト ファイルを直接変更するのではなく、それを使用する方法を理解し始める時が来たと思います。

ルートの CMakeLists.txt ファイルには、次のものが含まれています。

cmake_minimum_required (VERSION 2.6)
set (CMAKE_BACKWARDS_COMPATIBILITY 2.6)

Project(${PLUGIN_NAME})

file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
    [^.]*.cpp
    [^.]*.h
    [^.]*.cmake
    )

include_directories(${PLUGIN_INCLUDE_DIRS})

# Generated files are stored in ${GENERATED} by the project configuration
SET_SOURCE_FILES_PROPERTIES(
    ${GENERATED}
    PROPERTIES
        GENERATED 1
    )

SOURCE_GROUP(Generated FILES
    ${GENERATED}
    )

SET( SOURCES
    ${GENERAL}
    ${GENERATED}
    )

誰かが私に各行を説明してくれたら本当にありがたい. 特に何が${GENERAL}あり${GENERATED}ます。

4

2 に答える 2

19

まず、cmake の構文は非常に単純です。「コマンド」と「引数」で構成されています。単純すぎて、慣れるまでに時間がかかります。すべて「コマンド(引数)」です。さらに、コマンド名は大文字と小文字を区別しません。以前はすべて大文字でなければなりませんでしたが、バージョン 2.6 以降 (私が思うに) は関係ありません。ただし、引数は大文字と小文字が区別されます。

cmake_minimum_required (VERSION 2.6)

このコマンドは、プロジェクトに最低限必要な cmake のバージョンを設定します。cmake の現在のバージョンが 2.6 より前の場合、処理が停止し、エラーが報告されます。これにより、古いバージョンのツールをサポートする必要がなくなります。

set (CMAKE_BACKWARDS_COMPATIBILITY 2.6)

変数 CMAKE_BACKWARDS_COMPATIBILITY を値 2.6 に設定します。CMAKE_BACKWARDS_COMPATIBILITY は 2.6 以降では使用しないでください。スクリプトはおそらくcmake_policy. これは、以前のバージョンの cmake で矛盾が発生した場合に、新しいバージョンの cmake がどのように動作するかを指定するためのものです。今日ゼロから作成するスクリプトでは、これについて心配する必要はありません。

Project(${PLUGIN_NAME})

プロジェクト名を variable にあるものの値に設定しますPLUGIN_NAME。この値は、一部の IDE ではプロジェクト名として表示されます。変数に値を書き込むには、と を使用して、次の構文set(PLUGIN_NAME myName)を使用して値を読み取ることができます。一部のコマンドは変数にも書き込みますが、コマンドと同じように使用します。${}"${PLUGIN_NAME}"set

file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
     [^.]*.cpp
     [^.]*.h
     [^.]*.cmake
     )

fileコマンドです。その最初の引数GLOBは、「引数として指定するパターンと名前が一致するディスク上のファイルを返す」ことを意味します。次の引数GENERALは、結果が格納される変数です。これにより、結果が変数に書き込まれ、set後で で読み取ることができます${GENERAL}RELATIVEパスは、完全なパスではなく、そのパスに関連するファイル名を返すことを意味します。したがって、"C:\some\long\path\src\foo.cpp" または "/home/me/some/path/src/foo.cpp" ではなく、"src\foo.cpp" または "src/ foo.cpp". 変数 CMAKE_CURRENT_SOURCE_DIR は、CMake が入力する「魔法の変数」であり、この CMakeLists.txt ファイルが存在する現在処理中のソース ディレクトリへのパスを参照します。引数の最後のリストは、一致するファイルのパターンです。基本的に、ファイル拡張子が cpp、h、または cmake のすべて。

include_directories(${PLUGIN_INCLUDE_DIRS})

${PLUGIN_INCLUDE_DIRS}インクルード ファイルのコンパイラによって検索されるディレクトリに、ディレクトリを追加します。たとえば、gcc でコンパイルすると、余分な「-I」引数が発生します。

# Generated files are stored in ${GENERATED} by the project configuration

# で始まる行はコメントです。

SET_SOURCE_FILES_PROPERTIES(
       ${GENERATED}
       PROPERTIES
           GENERATED 1
       )

ファイルにはキーと値のペアを関連付けることができ、これはファイルの構築方法に影響します。ここで、変数にリストされているファイルに${GENERATED}は、プロパティ「GENERATED」が値 1 に設定されています。これはどういう意味ですか? CMake は、別のビルド ステップで作成されるため、ディスク上のファイル "${GENERATED}" を検索しないことを認識しています。投稿されたスニペットでは、誰も変数を設定していません${GENERATED}。プロジェクトファイルの他の場所に設定されると思います。${GENERATED}変数とプロパティ GENERATED を混同しないでください! これは微妙な点であり、おそらく変数はGENERATED_FILES混乱を避けるためにあるべきSET_SOURCE_FILES_PROPERTIES(${GENERATED_FILES} PROPERTIES GENERATED 1)でした。

 SOURCE_GROUP(Generated FILES ${GENERATED})

これにより、グループが作成されます。このグループは、Visual Studio では、変数内のファイルを含む "Generated" というファイル タブに変換されます${GENERATED}

 SET(SOURCES ${GENERAL} ${GENERATED})

この行は、変数 SOURCES を変数${GENERAL}andにあるものに設定します${GENERATED}${GENERAL}前に、現在のソース ディレクトリにあった cpp、h、および cmake ファイルのリストを設定しました。C ライクな擬似コードでは、これは "SOURCES = GENERAL + GENERATED" のようなものです。実装の詳細として、値 SOURCES は実際にはリストであり、その内容は ";" で区切られています。文字。通常、これは、後で${SOURCES}他の 2 つの変数をどこでも繰り返すのではなく、変数を使用するだけでライブラリまたは実行可能ファイルを作成できるようにするために行われます。

于 2011-05-30T09:03:08.173 に答える
6

時々、cmake チュートリアルに対するあなたの気持ちが理解できます。オンライン ドキュメントと、Ogre、Vtk、Kde などの cmake プロジェクトを参照することをお勧めします。

CMakeLists.txt を見ると、変数 PLUGIN_NAME、PLUGIN_INCLUDE_DIRS、および GENERATED を参照しているため、これは外部の CMake プロジェクト (add_subdirectory を使用) によって呼び出されることになっているようです。

質問に答えるには:

cmake_minimum_required (VERSION 2.6)
set (CMAKE_BACKWARDS_COMPATIBILITY 2.6)
Project(${PLUGIN_NAME})

これにより、cmakefile が準備され、バージョン 2.6 以降である必要があること、および PLUGIN_NAME 変数で指定された名前でプロジェクトを開始することが cmake に通知されます。

file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
    [^.]*.cpp
    [^.]*.h
    [^.]*.cmake
    )

この部分は、現在のソース ディレクトリ (cmakelists.txt があるディレクトリ) をグロブし、すべての *.cpp、*.h、および *.cmake ファイルを収集します。結果は、現在のソース ディレクトリに関連するファイル パスのセット/リストであり、変数 GENERAL に格納されます。

# Generated files are stored in ${GENERATED} by the project configuration
SET_SOURCE_FILES_PROPERTIES(
    ${GENERATED}
    PROPERTIES
        GENERATED 1
    )

SOURCE_GROUP(Generated FILES
    ${GENERATED}
    )

どうやら、変数 GENERATED (したがって GENERAL ではない) に格納されたソース ファイルのセットがあるようです。ビルドで生成されたソース ファイルの場合、これらのファイルは CMake の最初のビルドで必ずしもそこにあるとは限らず、CMake はこれらが生成されたことを認識する必要があります。set_source_files_properties コマンドを使用して、CMake が正しい依存関係チェックを行うために必要な「生成された」プロパティを取得します。

SET( SOURCES
    ${GENERAL}
    ${GENERATED}
    )

これで、file( GLOB ... ) 呼び出しからのソース ファイルのセットが変数 GENERAL に格納されました。そして、別の場所で作成された変数 GENERATED に格納された一連のソース ファイルがあります。これら 2 つのセットは、ソース ファイルの 1 つのリストに結合され、変数 SOURCES に格納されます。

通常の状況では、add_library 呼び出しを期待します: add_library( ${PLUGIN_NAME} {SOURCES} )

これは、SOURCES のソース ファイルから新しいライブラリを作成してビルドすることを Cmake に指定します。

于 2011-05-30T09:29:54.627 に答える