サーチ…


前書き

カスタムビルドステップは、プロジェクトビルドでカスタムターゲットを実行したり、ファイルを簡単にコピーして手動で行う必要がないように(おそらくdllですか?)便利です。ここでは、まず2つの例を示します。最初は、プロジェクトのバイナリディレクトリ(DebugまたはRelease)にdll(特にQt5 DLL)をコピーする方法、もう1つはソリューションでカスタムターゲット(この場合はDoxygen)を実行する方法です(Visual Studioを使用している場合)。

備考

ご覧のように、cmakeのカスタムビルドのターゲットとステップで多くのことを行うことができますが、特にdllをコピーするときには注意が必要です。そうすることは納得がいくが、時には愛称的に "dll hell"と呼ばれるものをもたらすことがある。

基本的に、これはあなたの実行可能ファイルが実際に依存しているdllと、どのファイルをロードしているのか、どのファイルを実行する必要があるのか​​(コンピュータのパス変数のためかもしれない)

上記の警告以外に、カスタムターゲットを自由に作成できます。彼らは強力で柔軟性があり、どのcmakeプロジェクトにとっても貴重なツールです。

Qt5 dllコピーの例

ですから、Qt5に依存するプロジェクトがあり、関連するdllをビルドディレクトリにコピーする必要があり、手動でそれをやりたくないとしましょう。次の操作を実行できます。

cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project

# add the executable
add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
    
add_custom_command(TARGET MyQtProj POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
    )

プロジェクトをビルドするたびに、コピー先のdllが変更された場合は、ターゲット(この場合はメインの実行可能ファイル)がビルドされた後にコピーされます( copy_if_differentコマンドに気付きます)。さもなければ、それらはコピーされません。

さらに、ここでジェネレータ式の使用に注意してください。これらを使用する利点は、dllをコピーする場所や使用するバリアントを明示的に指定する必要がないことです。これらを使用するには、使用しているプロジェクト(この場合はQt5)にターゲットをインポートする必要があります。

デバッグでビルドしている場合、CMakeは(インポートされたターゲットに基づいて)Qt5Cored.dll、Qt5Guid.dll、およびQt5Widgetsd.dllをビルドフォルダのDebugフォルダにコピーします。リリースでビルドしている場合は、.dllのリリースバージョンがリリースフォルダにコピーされます。

カスタムターゲットの実行

また、特定のタスクを実行するときに実行するカスタムターゲットを作成することもできます。これらは、通常、実行する実行可能ファイルで、異なる処理を実行します。特に使用されるかもしれない何かはあなたのプロジェクトのドキュメンテーションを生成するためにDoxygenを実行することです。これを行うには、 CMakeLists.txt次のCMakeLists.txtを行います(わかりやすくするために、Qt5プロジェクトの例を続けます)。

cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project

add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
    
add_custom_command(TARGET MyQtProj POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
    )

#Add target to build documents from visual studio.
set(DOXYGEN_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile)
#set the output directory of the documentation
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/docs)
# sanity check...
message("Doxygen Output ${DOXYGEN_OUTPUT_DIR}")
find_package(Doxygen)

if(DOXYGEN_FOUND)
    # create the output directory where the documentation will live
    file(MAKE_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
    # configure our Doxygen configuration file. This will be the input to the doxygen
    # executable
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
    ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)

# now add the custom target. This will create a build target called 'DOCUMENTATION' 
# in your project
ADD_CUSTOM_TARGET(DOCUMENTATION
  COMMAND ${CMAKE_COMMAND} -E echo_append "Building API Documentation..."
  COMMAND ${CMAKE_COMMAND} -E make_directory ${DOXYGEN_OUTPUT_DIR}
  COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  COMMAND ${CMAKE_COMMAND} -E echo "Done."
  WORKING_DIRECTORY ${DOXYGEN_OUTPUT_DIR})

endif(DOXYGEN_FOUND)

今度はVisual Studioを使用していると仮定してソリューションを作成すると、プロジェクトのドキュメントを再生成するためにビルドできるDOCUMENTATIONというビルドターゲットがDOCUMENTATIONれます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow