2023년 12월 31일 일요일

Cmake external project 예제

github 등 외부 URL 의 cmake project 를 다운받아 빌드 수행


참고: CMake ExternalProject module


예제

https://github.com/bjtj/tjsamples/tree/main/cmake/external-project

  • github 에 올라간 osl-c (cmake project) 를 불러와 사용하기


CMakeLists.txt 일부분


include(ExternalProject)
ExternalProject_Add(oslc
  GIT_REPOSITORY    https://github.com/bjtj/osl-c.git
  GIT_TAG           1.0.0
  EXCLUDE_FROM_ALL  TRUE
  BUILD_COMMAND     cmake --build .
  STEP_TARGETS      build
)


설명:

  • BUILD_COMMAND cmake --build 로 설정하면 cross platform 하게 빌드를 수행
    • powershell (windows), bash shell (linux) 에서 동일하게 cmake --build <dir> 로 빌드 수행 가능하여 편리함
    • cmake project 가 아니라면 manual 하게 따로 설정해야함 (e.g. autoconf)


set(oslc_BINARY_DIR "${CMAKE_BINARY_DIR}/oslc-prefix/src/oslc-build")
set(oslc_SOURCE_DIR "${CMAKE_BINARY_DIR}/oslc-prefix/src/oslc/src")
add_dependencies(hello oslc-build)

if(UNIX AND NOT APPLE)
  target_link_libraries(hello ${oslc_BINARY_DIR}/libosl.so)
endif()

if(MSVC)
  target_link_libraries(hello ${oslc_BINARY_DIR}/Debug/osl.lib)
  add_custom_command(TARGET hello POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
      "${oslc_BINARY_DIR}/Debug/osl.dll"
      $<TARGET_FILE_DIR:hello>)
endif()

target_include_directories(hello PUBLIC ${oslc_SOURCE_DIR})


설명:

  • 주의) 예제의 oslc 를 실제 사용하는 라이브러리로 수정할 것
  • 빌드 수행 결과물을 link 해 줘야 함
    • LINUX 는 .so 파일을 링크
      • if(UNIX AND NOT APPLE)
          target_link_libraries(hello ${oslc_BINARY_DIR}/libosl.so)
        endif()

         
    • MSVC 는 .lib 파일을 링크 + 빌드 수행 후 .dll 파일을 결과 폴더에 복사
      • if(MSVC)
          target_link_libraries(hello ${oslc_BINARY_DIR}/Debug/osl.lib)
          add_custom_command(TARGET hello POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
              "${oslc_BINARY_DIR}/Debug/osl.dll"
              $<TARGET_FILE_DIR:hello>)
        endif()