CMake는 크로스 플랫폼 빌드 시스템을 지원하는 도구로, CMakeLists.txt 파일은 프로젝트의 빌드 설정을 정의하는 데 사용된다. 이 파일 내에서 소스 파일을 추가하는 방법은 CMake의 중요한 부분 중 하나이다. 소스 파일을 추가하는 방식은 프로젝트의 구조와 요구 사항에 따라 달라질 수 있다. 아래에서 CMakeLists.txt에서 소스 파일을 추가하는 방법을 계층적으로 자세히 설명하겠다.

프로젝트 구조 이해

CMakeLists.txt에서 소스 파일을 추가하기 전에 프로젝트의 디렉토리 구조를 이해하는 것이 중요하다. 프로젝트는 다음과 같은 구조를 가질 수 있다:

/ProjectRoot
├── CMakeLists.txt
├── src
│   ├── main.cpp
│   ├── utils.cpp
│   └── utils.h
└── include
    └── utils.h

이 구조에서 src 디렉토리에 소스 파일이 있고, include 디렉토리에 헤더 파일이 있다.

CMakeLists.txt 파일에서의 기본적인 소스 파일 추가

CMakeLists.txt에서 소스 파일을 추가하는 가장 기본적인 방법은 add_executable 또는 add_library 명령어를 사용하는 것이다. 예를 들어, 다음과 같은 CMakeLists.txt 파일이 있을 수 있다:

cmake_minimum_required(VERSION 3.10)
project(MyProject)

add_executable(MyExecutable src/main.cpp src/utils.cpp)

이 예에서는 add_executable 명령어를 통해 main.cpputils.cpp 파일이 MyExecutable이라는 실행 파일에 포함되도록 지정하고 있다.

변수 사용을 통한 소스 파일 관리

소스 파일이 많아지면, 이를 직접 나열하는 것이 비효율적일 수 있다. 이럴 때 변수에 소스 파일을 저장하여 관리할 수 있다:

cmake_minimum_required(VERSION 3.10)
project(MyProject)

set(SOURCES
    src/main.cpp
    src/utils.cpp
)

add_executable(MyExecutable ${SOURCES})

set 명령어를 사용하여 소스 파일 목록을 SOURCES 변수에 저장하고, add_executable 명령어에서 이를 참조한다. 이 방법은 파일을 추가하거나 제거할 때 수정할 부분이 줄어들어 편리한다.

서브디렉토리와 파일 추가

프로젝트가 커지면 여러 서브디렉토리로 나뉠 수 있다. 이 경우 add_subdirectory 명령어를 사용하여 각 서브디렉토리의 CMakeLists.txt 파일에서 소스 파일을 관리할 수 있다:

cmake_minimum_required(VERSION 3.10)
project(MyProject)

add_subdirectory(src)

src 디렉토리 내에 별도의 CMakeLists.txt 파일이 존재하고, 이 파일에서 소스 파일을 추가하도록 할 수 있다:


set(SOURCES
    main.cpp
    utils.cpp
)

add_executable(MyExecutable ${SOURCES})

이렇게 하면 프로젝트의 구조를 더 체계적으로 관리할 수 있다.

globbing을 통한 파일 자동 추가

CMake는 globbing을 사용하여 특정 패턴에 맞는 모든 파일을 자동으로 추가할 수 있다. 하지만 이는 파일 추가/삭제 시 CMake를 다시 실행해야 하는 문제점이 있으므로 신중하게 사용해야 한다:

file(GLOB SOURCES "src/*.cpp")

add_executable(MyExecutable ${SOURCES})

위의 예에서는 src 디렉토리 내의 모든 .cpp 파일을 SOURCES 변수에 포함시킨다.

인터페이스 라이브러리 사용

CMake에서 인터페이스 라이브러리는 링크 시에만 포함될 수 있는 타겟을 정의할 때 사용된다. 인터페이스 라이브러리를 정의하고, 이를 다른 타겟에서 사용할 수 있다:

add_library(MyLibrary INTERFACE)
target_sources(MyLibrary INTERFACE src/utils.cpp)
target_include_directories(MyLibrary INTERFACE include/)

add_executable(MyExecutable src/main.cpp)
target_link_libraries(MyExecutable MyLibrary)

이 예제에서는 MyLibrary라는 인터페이스 라이브러리를 정의하고, 이를 MyExecutable에서 링크하도록 했다.

소스 파일의 조건부 추가

프로젝트가 특정 조건에 따라 소스 파일을 다르게 포함해야 하는 경우가 있다. 이럴 때 if 명령어를 사용하여 조건부로 소스 파일을 추가할 수 있다:

cmake_minimum_required(VERSION 3.10)
project(MyProject)

set(SOURCES src/main.cpp)

if(WIN32)
    list(APPEND SOURCES src/windows_specific.cpp)
elseif(UNIX)
    list(APPEND SOURCES src/unix_specific.cpp)
endif()

add_executable(MyExecutable ${SOURCES})

이 코드에서는 빌드 환경에 따라 추가되는 소스 파일이 달라진다.


관련 자료: