CMake ビルドディレクトリをソースディレクトリと異なるディレクトリに設定する方法 質問する

CMake ビルドディレクトリをソースディレクトリと異なるディレクトリに設定する方法 質問する

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

問題は、プログラムを作成するときに、ソース コードの一部のフォルダーに触れたり、いじったりしたくないということです。すべての CMake とmake出力ファイルおよびフォルダーを に格納したい../Compile/ので、そのために CMake スクリプトのいくつかの変数を変更しました。ラップトップで次のような操作を行ったところ、しばらくの間は機能しました。

Compile$ cmake ../src
Compile$ make

すると、今いるフォルダーにクリーンな出力が得られました。まさに私が探していたものです。

今、別のコンピューターに移動して、CMake 2.8.11.2 を再コンパイルしましたが、ほぼ振り出しに戻ってしまいました。常に、srcmy が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

あなたは、ソース外ビルドソース外ビルドを作成するには、いくつかの方法があります。

  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 3.13以降の場合は、これらのオプションを使用してソースとビルドフォルダを設定します

     cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
    
  3. 古い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.cmakeGoogle で多数見つかりますが、オリジナルを見つけることができないようです。また、マクロは短いので、ここに全文を記載します。

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

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

おすすめ記事