web-dev-qa-db-ja.com

CMake出力/ビルドディレクトリ

私はcmakeにかなり慣れていないので、使用方法に関するチュートリアルをいくつか読み、3つの異なるコンパイラー用のプログラムを作成するために複雑な50行のCMakeスクリプトを作成しました。これはおそらく、cmakeに関する私のすべての知識を結論付けるものです。

今私の問題は、プログラムを作成するときにフォルダを触ったり混乱させたりしたくないソースコードがあることです。すべてのcmakeおよび出力ファイルとフォルダーを../Compile/に入れるようにしたいので、そのためにcmakeスクリプトのいくつかの変数を変更しました。

Compile$ cmake ../src
Compile$ make

それで、私が今いるフォルダにきれいな出力がありました。まさに私が探しているものです。

今、私は別のコンピューターに移動し、CMake 2.8.11.2を再コンパイルしましたが、もう1台のコンピューターに戻りました! CMakeLists.txtがあるsrcフォルダーに常にコンパイルされます。

Cmakeスクリプトでディレクトリを選択する部分は次のとおりです。

set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/)
set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir})
set(CMAKE_BUILD_FILES_DIRECTORY ${dir})
set(CMAKE_BUILD_DIRECTORY ${dir})
set(CMAKE_BINARY_DIR  ${dir})
SET(EXECUTABLE_OUTPUT_PATH ${dir})
SET(LIBRARY_OUTPUT_PATH ${dir}lib)
SET(CMAKE_CACHEFILE_DIR ${dir})

そして今では常に次のようになります:

-- Build files have been written to: /.../src

何か不足していますか?

89

設定しているすべての変数を設定する必要はほとんどありません。 CMakeはそれらを妥当なデフォルトに設定します。間違いなくnotを変更するCMAKE_BINARY_DIRまたはCMAKE_CACHEFILE_DIR。これらを読み取り専用として扱います。

まず、srcディレクトリから既存の問題のあるキャッシュファイルを削除します。

cd src
rm CMakeCache.txt
cd ..

次に、すべてのset()コマンドを削除して、次を実行します。

cd Compile
rm -rf *
cmake ../src

CMakeの実行時にソースディレクトリの外にいる限り、CMakeListが明示的に指示しない限り、ソースディレクトリは変更されません。

これが動作したら、CMakeがデフォルトで配置する場所を確認できます。デフォルトの場所(EXECUTABLE_OUTPUT_PATHのデフォルト値など)に満足できない場合にのみ、必要なものだけを変更します。そして、それらをCMAKE_BINARY_DIRCMAKE_CURRENT_BINARY_DIRPROJECT_BINARY_DIRなどに関連して表現するようにしてください。

CMakeのドキュメントを見ると、変数がセマンティックセクションに分割されていることがわかります。 very特別な状況を除いて、「情報を提供する変数」の下にリストされているすべてをCMakeLists内で読み取り専用として扱う必要があります。

50
Angew

out of source build が必要なようです。ソースビルドからビルドを作成するには、いくつかの方法があります。

  1. やっていたことを実行

    cd /path/to/my/build/folder
    cmake /path/to/my/source/folder
    

    これにより、cmakeは/path/to/my/build/folderソースツリーに対して/path/to/my/source/folderビルドツリーを生成します。

    作成したら、cmakeはソースフォルダーの場所を記憶します。したがって、ビルドツリーでcmakeを再実行できます。

    cmake /path/to/my/build/folder
    

    あるいは

    cmake .
    

    現在のディレクトリが既にビルドフォルダである場合。

  2. いくつかの ドキュメント化されていないオプションを使用してソースおよびビルドフォルダーを設定

    cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
    

    (1)とまったく同じことを行いますが、現在の作業ディレクトリに依存しません。

CMakeはデフォルトですべての出力をbuild treeに配置するため、cmakeファイルで${CMAKE_SOURCE_DIR}または${CMAKE_CURRENT_SOURCE_DIR}を自由に使用しない限り、ソースツリーに触れないでください。

間違っている可能性のある最大の問題は、以前にソースツリーでビルドツリーを生成していた場合です(つまり、in source build)。これを行うと、上記の(1)の2番目の部分が開始され、cmakeはソースまたはビルドの場所を変更しません。したがって、ソース内ビルドを使用してソースディレクトリのソース外ビルドを作成することはできません。ソースディレクトリから(少なくとも)CMakeCache.txtを削除することで、これをかなり簡単に修正できます。 CMakeが生成する他のいくつかのファイル(ほとんどはCMakeFilesディレクトリにあります)も削除する必要がありますが、これらはcmakeがソースツリーをビルドツリーとして扱うことを引き起こしません。

多くの場合、ソース外ビルドはソース内ビルドよりも望ましいため、ソースビルド外を要求するようにcmakeを変更することができます。

# Ensures that we do an out of source build

MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
     STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
     "${CMAKE_BINARY_DIR}" insource)
     GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
     STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
     "${PARENTDIR}" insourcesubdir)
    IF(insource OR insourcesubdir)
        MESSAGE(FATAL_ERROR "${MSG}")
    ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)

MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
    "${CMAKE_PROJECT_NAME} requires an out of source build."
)

上記のマクロは、MacroOutOfSourceBuildと呼ばれる一般的に使用されるモジュールに由来します。 GoogleにはMacroOutOfSourceBuild.cmakeのソースが多数ありますが、オリジナルを見つけることができないようで、ここにすべてを含めるには十分に短いです。

残念ながら、cmakeは通常、マクロが呼び出されるまでにいくつかのファイルを書き込んでいるので、実際にビルドを実行できなくなりますが、CMakeCache.txtCMakeFilesを削除する必要があります。

バイナリ、共有ライブラリ、静的ライブラリが書き込まれるパスを設定すると便利な場合があります-その場合は cmakeの出力を「bin」ディレクトリにするにはどうすればよいですか? (免責事項、その質問に対するトップ投票の答え...しかし、それは私がそれについて知っている方法です)。

93
Adam Bowen

CMake Wiki :現在

インソースでビルドしている場合はCMAKE_BINARY_DIR、これはCMAKE_SOURCE_DIRと同じです。それ以外の場合、これはビルドツリーの最上位ディレクトリです

これら2つの変数を比較して、ソース外ビルドが開始されたかどうかを判別します

7
damkrat

私のコメントを答えに変える:

誰かが私がしたことをした場合、すべてのビルドファイルをソースディレクトリに置くことから始めました:

cd src
cmake .

cmakeは、CMakeFiles dirに多数のビルドファイルとキャッシュファイル(CMakeCache.txtsrccmake_install.cmakeなど)を配置します。

アウトオブソースビルドに変更するには、これらのファイルをすべて削除する必要がありました。その後、@ Angewが彼の回答で推奨したことを実行できました。

mkdir -p src/build
cd src/build
cmake ..
6
Avi Tevet

まず第一に、スクリプト内のビルドディレクトリ名を中継しないでください。 ../Compileの行を変更する必要があります。

コンパイルする場所はユーザー次第だからです。

その代わりに、事前定義された変数のいずれかを使用します。 http://www.cmake.org/Wiki/CMake_Useful_Variables (CMAKE_BINARY_DIRおよびCMAKE_CURRENT_BINARY_DIRを探します)

5