web-dev-qa-db-ja.com

CMakeのビルド後のステップでターゲットファイルを別の場所にコピーする

CMakeスクリプトで次のように指定して、構成に応じて異なる名前を取得する動的ライブラリがあります。

set_target_properties(${name} PROPERTIES OUTPUT_NAME ${outputName}64)
set_target_properties(${name} PROPERTIES DEBUG_OUTPUT_NAME ${outputName}64_d)

その結果、リリースビルドとデバッグビルドで別の名前が付けられます。ビルド後のステップとして、結果のライブラリを別のディレクトリにコピーしたいのですが、CMake-Fuのギフト(?)は本当にあなたに微笑みませんでした。

私はこれをやってみました:

GET_TARGET_PROPERTY(origfile mylibrary LOCATION)
STRING(REGEX REPLACE "/" "\\\\" origfile ${origfile})

set(targetfile my_target_path\\${CMAKE_CFG_INTDIR}\\)
STRING(REGEX REPLACE "/" "\\\\" targetfile ${targetfile})

add_custom_command(TARGET mylibrary POST_BUILD
    COMMAND copy ${origfile} ${targetfile}
)

これはリリースビルドでは問題なく機能しますが、デバッグの場合、ソースには予想していた_dが含まれていません。 ファイルをコピーできるように、ターゲットの出力パスを取得するにはどうすればよいですか?

注:上記のスニペットからわかるように、これは現在Windows/Visual Studio用ですが、OS X/Xcode/makeでも動作するようにしたいと思います。

注:このライブラリに依存する他のいくつかのプロジェクトの出力ディレクトリとして機能する追加のディレクトリにライブラリを配置して、これらのプロジェクトが実行時にライブラリをロードできるようにする必要があります。許容できる代替ソリューションは、コピーを行うカスタムターゲットを作成できるようにすることです。これにより、他のプロジェクトがこのプロジェクトに依存し、このプロジェクトがライブラリに依存するようになります。

26
villintehaspam

廃止されたLOCATIONプロパティを使用するのではなく、ジェネレータ式を使用することをお勧めします。

add_custom_command(TARGET mylibrary POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mylibrary> ${targetfile}
)

また、コピーする代わりに、ターゲットプロパティRUNTIME_OUTPUT_DIRECTORYを設定することで、ターゲットディレクトリに直接exeを生成することもできます。これには、構成ごとのオプションがあります(例:RUNTIME_OUTPUT_DIRECTORY_DEBUG)。

set_target_properties(mylibrary PROPERTIES
                      RUNTIME_OUTPUT_DIRECTORY_DEBUG <debug path>
                      RUNTIME_OUTPUT_DIRECTORY_RELEASE <release path>
)

詳細については、次を実行:

cmake --help-property "RUNTIME_OUTPUT_DIRECTORY"
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY_<CONFIG>"

また、Windowsであっても、パスの区切り文字としてスラッシュを使用できる必要があります。

41
Fraser

出力パスを手動で計算する代わりに、POST_BUILDコマンドで ジェネレーター式 を使用します。これらは構成に対応しています。例:

add_custom_command(TARGET mylibrary POST_BUILD 
  COMMAND "${CMAKE_COMMAND}" -E copy 
     "$<TARGET_FILE:mylibrary>"
     "my_target_path/$<CONFIGURATION>/$<TARGET_FILE_NAME:mylibrary>" 
  COMMENT "Copying to output directory")
11
sakra

他の答えは100%明確ではありませんでした...

実行可能ファイルを構築しているとしましょうtest_base.exe、以下は実行可能ファイルをビルドし、.exeをベースの「ビルド」ディレクトリにコピーします。

add_executable(test_base "")
target_sources(test_base
    PRIVATE
        catch_main.cpp
        catch_tests.cpp
        sc_main.cpp
)
target_link_libraries(test_base PRIVATE Catch2 systemc)

add_custom_command(TARGET test_base POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:test_base> ${PROJECT_BINARY_DIR}/test_base.exe
    COMMENT "Created ${PROJECT_BINARY_DIR}/test_base.exe"
)

したがって、この実行後のプロジェクトは次のようになります。

<project dir>/build/test_base.exe

0
driedler