내가 OpenGL을 위해 사용하는 CMakeList.txt를 예시로 적어보자.
# CMake 최소버전 표기
cmake_minimum_required(VERSION 3.24)
# 프로젝트 이름 지정
set(PROJECT_NAME OpenGL_example)
# 사용할 C++ 버전 표기
set(CMAKE_CXX_STANDARD 17)
# 프로젝트 지정
project(${PROJECT_NAME})
# 빌드 대상 소스파일
add_executable(${PROJECT_NAME} src/main.cpp)
# 외부 라이브러리를 불러오면서 저장소 분리를 위한 Dependency 명령어 추가
include(ExternalProject)
# Dependency 관련 저장소 분리
set(DEP_INSTALL_DIR ${PROJECT_BINARY_DIR}/install)
set(DEP_INCLUDE_DIR ${DEP_INSTALL_DIR}/include)
set(DEP_LIB_DIR ${DEP_INSTALL_DIR}/lib)
# 외부 라이브러리 GIT으로 가져옴
ExternalProject_Add(
dep_glfw # 이름
GIT_REPOSITORY "https://github.com/glfw/glfw.git" # git주소
GIT_TAG "3.3.8" # git의 tag
GIT_SHALLOW 1 # 아래 설명참고
UPDATE_COMMAND "" # 업데이트 단계 재정의
PATCH_COMMAND "" # 패치 단계 재정의
TEST_COMMAND "" # 테스트 단계 재정의
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DEP_INSTALL_DIR}
-DGLFW_BUILD_EXAMPLES=OFF
-DGLFW_BUILD_TESTS=OFF
-DGLFW_BUILD_DOCS=OFF
# 해당하는 라이브러리에 CMake를 열어보면 우측의 Flag, 변수 등이 있는데 자유롭게 조절가능
)
# Dependency 리스트 및 라이브러리 파일 리스트 추가
set(DEP_LIST ${DEP_LIST} dep_glfw)
set(DEP_LIBS ${DEP_LIBS} glfw3)
ExternalProject_Add(
dep_glm
GIT_REPOSITORY "https://github.com/g-truc/glm.git"
GIT_TAG "0.9.9.8"
GIT_SHALLOW 1
UPDATE_COMMAND ""
PATCH_COMMAND ""
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
TEST_COMMAND ""
INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory
${PROJECT_BINARY_DIR}/dep_glm-prefix/src/dep_glm/glm
${DEP_INSTALL_DIR}/include/glm
)
# 위의 과정과 조금 다른 부분은 LIB를 설정하지 않았다는 것인데, 없어서 그렇다.
set(DEP_LIST ${DEP_LIST} dep_glm)
# ImGui는 직접 가져가서 사용하는 것을 권장하여 개발환경에 맞춰서
# 직접 복사해서 가져온다.
add_library(imgui
imgui/imgui_draw.cpp
imgui/imgui_tables.cpp
imgui/imgui_widgets.cpp
imgui/imgui.cpp
imgui/imgui_impl_glfw.cpp
imgui/imgui_impl_opengl3.cpp
)
# ImGui에서는 개발환경에 따라 의존성을 요구하기에 현재까지 있었던 의존성을 엮어준다.
target_include_directories(imgui PRIVATE ${DEP_INCLUDE_DIR})
# 링크, 의존성등은 비슷하게 진행된다.
add_dependencies(imgui ${DEP_LIST})
set(DEP_INCLUDE_DIR ${DEP_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/imgui)
set(DEP_LIST ${DEP_LIST} imgui)
set(DEP_LIBS ${DEP_LIBS} imgui)
# include / lib 관련 옵션 추가 {의존성, 링크 관련하여 설정할 내용}
target_include_directories(${PROJECT_NAME} PUBLIC
${DEP_INCLUDE_DIR}
)
target_link_directories(${PROJECT_NAME} PUBLIC
${DEP_LIB_DIR}
)
target_link_libraries(${PROJECT_NAME} PUBLIC
${DEP_LIBS}
)
target_compile_definitions(${PROJECT_NAME} PUBLIC
WINDOW_NAME="${PROJECT_NAME}"
)
# Dependency들이 먼저 Build 되도록 설정한다.
add_dependencies(${PROJECT_NAME}
${DEP_LIST}
)
Shallow Clone
간혹 git에서 매우 큰 저장소를 clone 하게 되면 시간도 오래 걸릴뿐더러 중간에 실패할 수도 있다.
그럴 때 우리는 Shallow clone을 사용하는데, 해당 git에 전체 이력을 가져오는 게 아니라 일부만 가져오는 것이다.
위에서 우리는 1로 지정했는데 이는 1개의 커밋 히스토리를 불러오는 것이다.