cmake
사용자 정의 빌드 - 단계
수색…
소개
사용자 지정 빌드 단계는 프로젝트 빌드에서 사용자 지정 대상을 실행하거나 파일을 쉽게 복사하여 수동으로 수행 할 필요가 없도록 (dll 일 수도 있습니다.) 유용합니다. 여기에서는 두 가지 예를 보여 드리겠습니다. 첫 번째는 dll (특히 Qt5 dll)을 프로젝트 바이너리 디렉토리 (Debug 또는 Release)에 복사하는 것이고 두 번째는 솔루션에서 사용자 정의 타겟 (이 경우 Doxygen)을 실행하는 것입니다. (Visual Studio를 사용하는 경우).
비고
보시다시피 cmake에서 사용자 지정 빌드 대상 및 단계를 사용하여 많은 작업을 수행 할 수 있지만 dll을 복사 할 때는 특히주의해야합니다. 그렇게하는 것이 편리하지만, 때때로 "dll hell"이라고 애정을 나타내는 결과를 낳을 수 있습니다.
기본적으로 이것은 실행 파일이 실제로 어떤 DLL에로드되는지, 어떤 DLL이 실행될 필요가 있는지 (컴퓨터의 경로 변수로 인해) 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
에서 다음을 수행 할 수 있습니다 (간단히하기 위해 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
이라는 빌드 대상을 갖게됩니다.