git submodule 이용
- git 저장소 안에 다른 git 저장소를 디렉토리로 분리해 넣는 방법
- git을 이용하기 때문에 명시적인 표현이 가능
- 프로젝트에서 참조하는 다른 프로젝트들의 리스트를 본다거나 수정을 할 수 있음
- 사용 방법이 썩 쉽지가 않고 최초 설정 이후에도 clone을 하면 init, update 등의 추가 과정이 필요함
- 한번의 컴파일로 make 옵션을 다르게 줄 수 있는 방법을 찾지 못함
- Git 도구 - 서브모듈
cmake의 FetchContent 이용
- 컴파일 시점에 git repository 정보를 통해 프로젝트를 가져와서 컴파일까지 수행해주는 방법
- 사용방법이 쉽고 최초 설정 이후 추가 과정이 없음
- 프로젝트가 변경되면 컴파일 시 자동반영
- 빌드가 필요한 경우
include(FetchContent)
set(TARGET_NAME "googletest")
set(ALIAS_NAME "lib::${TARGET_NAME}")
FetchContent_Declare(
${TARGET_NAME}
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG release-1.11.0
)
FetchContent_MakeAvailable(${TARGET_NAME})
add_library(${ALIAS_NAME} ALIAS gtest)
- 빌드가 필요 없는 경우(헤더만 있는 경우)
include(FetchContent)
set(TARGET_NAME "rabbit")
set(ALIAS_NAME "lib::${TARGET_NAME}")
FetchContent_Declare(
${TARGET_NAME}
GIT_REPOSITORY https://github.com/mashiro/rabbit.git
GIT_TAG master
)
FetchContent_GetProperties(${TARGET_NAME})
if(NOT ${TARGET_NAME}_POPULATED)
FetchContent_Populate(${TARGET_NAME})
add_library(${TARGET_NAME} INTERFACE)
add_library(${ALIAS_NAME} ALIAS ${TARGET_NAME})
set_target_properties(
${TARGET_NAME} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${${TARGET_NAME}_SOURCE_DIR}
)
endif()