내가 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

CMake는 Make를 사용할 적에 흘리듯이 들었던 링크, 의존성 등의 과정에서 문제가 아주 효율적으로 해결된다.
CMake도 Make와 마찬가지로 의존성 검사를 해서 빌드되지만, 큰 차이점은 CMake는 의존성 정보를 스스로 파악한다는 것이다.
Make에서는 빌드시 중간과정의 Object파일의 이름, 의존성 정보들까지 입력해야 하지만, CMake는 그렇지 않다는 것이다.

정말 간단한 예제를 보자.

# CMake의 최소 버전 입력
cmake_minimum_required(VERSION 3.24)

# CMake의 변수 생성 { PROJECT_NAME = "cmake_project_example"}
set(PROJECT_NAME cmake_project_example)
# CMake에서의 C++ 사용버전
set(CMAKE_CXX_STANDARD 17)

# project 생성
project(${PROJECT_NAME})

# project의 소스 파일 추가
add_executable(${PROJECT_NAME} src/main.cpp)

이렇게 우리가 사용할 CMakeList.txt가 생성되었다.
Header파일도 Object파일도 명시되어있진 않지만 CMake는 내부적으로 처리된다.
(혹시, Object파일이 보고 싶다면 Build파일을 잘 살펴보시길 바랍니다.)

'CMake' 카테고리의 다른 글

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

분명히 나는 컴퓨터 그래픽스의 공부로 OpenGL을 공부하고 싶었으나...
노트북은 맥, 데스크톱은 윈도우로 운영체제가 달랐고...
맥은 심지어 Metal이라는 고유의 그래픽 API를 사용하면서 OpenGL, OpenCL의 지원을 중단해버렸다.

그래서 나는 고민을 해야 했다.
맥에서 윈도우를 돌릴 방법은 여러 가지 있지만, 그래픽스의 작업이기 때문에 자원을 잡아먹는걸 내가 컨트롤할 자신이 없었다.
고로 Xcode, Visual Studio, Make... 등의 빌드 환경에 따라 빌드 파일을 생성하고 실행, 디버깅할 수 있게 해 줄 것이 필요했다.

예전 맥이 없던 시절의 나는 클러스터에 꼭 나와야 했었다.
어찌어찌 주먹구구식으로 배웠던 Makefile 작성법을 사용하여 과제를 해왔으며,
Makefile이 익숙해져 버린 탓에 데스크톱(윈도우)에서의 개발환경을 조성하질 못하고 붕 떠있었다.

그렇게 여러모로 Cmake는 알 수 없었던 내 상황에서의 타개책이 될 수 있었다.

처음 만났던 Cmake는 굉장히 무섭고, 두려운 존재였다.
왜냐? 처음 봤던 CMakeList.txt는 몸집이 굉장했고 범접할 수 없다 생각이 들 수밖에 없는 라인의 수였기 때문이다.
하지만, 돌고 돌고 돌아서 다시 CMake를 접했을 땐, '생각보다 튜토리얼이 많았다.', '이전엔 도대체 뭘 본거야;;' 대충 이런 생각이었다.

이렇게 나는 CMake를 접했고 작성하기 시작했다.

'CMake' 카테고리의 다른 글

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

+ Recent posts