私は CMake をあまり使い慣れていないので、使い方のチュートリアルをいくつか読み、3 つの異なるコンパイラ用のプログラムを作成するために 50 行の複雑な CMake スクリプトをいくつか書きました。これで、CMake に関する私の知識はすべて終わりです。
問題は、プログラムを作成するときに、ソース コードの一部のフォルダーに触れたり、いじったりしたくないということです。すべての CMake とmake
出力ファイルおよびフォルダーを に格納したい../Compile/
ので、そのために CMake スクリプトのいくつかの変数を変更しました。ラップトップで次のような操作を行ったところ、しばらくの間は機能しました。
Compile$ cmake ../src
Compile$ make
すると、今いるフォルダーにクリーンな出力が得られました。まさに私が探していたものです。
今、別のコンピューターに移動して、CMake 2.8.11.2 を再コンパイルしましたが、ほぼ振り出しに戻ってしまいました。常に、src
my がCMakeLists.txt
配置されているフォルダーにコンパイルされます。
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
何か見逃しているのでしょうか?
ベストアンサー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 .
現在のディレクトリがすでにビルド フォルダーである場合。
CMake 3.13以降の場合は、これらのオプションを使用してソースとビルドフォルダを設定します
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
古いCMakeの場合は、ソースとビルドフォルダを設定するための文書化されていないオプション:
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
これは(1)と全く同じことを行いますが、現在の作業ディレクトリに依存しません。
CMakeは出力をすべてツリーを構築するデフォルトでは、 cmakeファイルで${CMAKE_SOURCE_DIR}
またはを頻繁に使用しない限り、${CMAKE_CURRENT_SOURCE_DIR}
ソースツリー。
最も問題になるのは、ソースツリーにビルドツリーを生成したことがある場合です(つまり、ソース内ビルド)。これを実行すると、上記(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
。 のソースはMacroOutOfSourceBuild.cmake
Google で多数見つかりますが、オリジナルを見つけることができないようです。また、マクロは短いので、ここに全文を記載します。
残念ながら、マクロが呼び出されるまでに cmake は通常いくつかのファイルを書き込んでいるため、ビルドを実際に実行することはできなくなりますが、CMakeCache.txt
と を削除する必要がありますCMakeFiles
。
バイナリ、共有ライブラリ、静的ライブラリが書き込まれるパスを設定すると便利な場合があります。その場合は、cmake の出力を 'bin' ディレクトリにするにはどうすればいいですか?(免責事項、私はこの質問に対して最も投票数の多い回答を持っています...しかし、それが私がこの質問について知っている方法です)。