내가 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개의 커밋 히스토리를 불러오는 것이다.

'CMake' 카테고리의 다른 글

CMake[01]  (0) 2022.10.12
CMake[00]  (0) 2022.10.12

+ Recent posts