Updated:

less than 1 minute read

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()