플랫폼 별 컴파일 설정의 개요

CMake는 다양한 플랫폼에서 소프트웨어를 빌드할 수 있는 강력한 빌드 시스템이다. 서로 다른 운영 체제, 컴파일러, 아키텍처를 지원하기 위해 CMakeLists.txt 파일 내에서 플랫폼 별로 다른 컴파일 설정을 지정할 수 있다. 이를 통해 코드의 이식성과 호환성을 높일 수 있다.

CMake의 기본 개념

CMake는 소스 코드에서 빌드 시스템을 생성하는 도구이다. 이를 통해 사용자는 플랫폼에 따라 빌드 설정을 커스터마이즈할 수 있다. CMakeLists.txt 파일은 프로젝트의 빌드를 관리하는 핵심 파일로, 이 파일을 통해 컴파일러 옵션, 링크 옵션, 빌드 타입 등을 지정할 수 있다.

플랫폼 별 컴파일 설정의 필요성

서로 다른 플랫폼은 고유한 컴파일러, 링커, 파일 시스템 구조를 갖는다. 이를 고려하지 않으면 코드가 한 플랫폼에서는 제대로 작동하지만, 다른 플랫폼에서는 실패할 수 있다. CMake는 이러한 문제를 해결하기 위해 플랫폼 별 설정을 지원한다.

CMake에서 플랫폼 감지 및 조건부 설정

CMake에서는 특정 변수를 사용하여 현재 플랫폼을 감지하고, 그에 따라 다른 설정을 적용할 수 있다.

if(WIN32)
    # Windows 관련 설정
elseif(APPLE)
    # macOS 관련 설정
elseif(UNIX)
    # Linux 또는 Unix 관련 설정
endif()

이 구문은 현재 빌드 중인 플랫폼을 감지하고, 각 플랫폼에 맞는 빌드 설정을 적용한다.

컴파일러 별 설정

CMake는 여러 컴파일러를 지원하며, 컴파일러 별로 다른 설정을 적용할 수 있다.

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    # GCC 관련 설정
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
    # Clang 관련 설정
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    # MSVC 관련 설정
endif()

이 구문을 통해 사용자는 GCC, Clang, MSVC와 같은 컴파일러 별로 다른 옵션을 적용할 수 있다.

아키텍처 별 설정

플랫폼과 컴파일러 외에도, 특정 CPU 아키텍처를 위한 설정이 필요할 수 있다.

if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
    # 64비트 아키텍처 관련 설정
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM")
    # ARM 아키텍처 관련 설정
endif()

이를 통해 64비트, 32비트, ARM 등 서로 다른 아키텍처에 맞는 설정을 지정할 수 있다.

플랫폼 별 라이브러리 링크

서로 다른 플랫폼에서 사용할 수 있는 라이브러리가 다를 수 있다. 따라서 특정 플랫폼에 따라 다른 라이브러리를 링크해야 할 때가 있다.

if(WIN32)
    target_link_libraries(my_target ws2_32)
elseif(APPLE)
    target_link_libraries(my_target "-framework Cocoa")
elseif(UNIX)
    target_link_libraries(my_target pthread)
endif()

이 구문은 플랫폼에 따라 필요한 라이브러리를 적절히 링크할 수 있도록 한다.

플랫폼 별 파일 경로 설정

각 운영체제는 파일 시스템이 다르기 때문에, 파일 경로나 이름 규칙도 다를 수 있다. CMake에서는 이를 반영하여 플랫폼 별로 다른 파일 경로를 설정할 수 있다.

if(WIN32)
    set(DATA_DIR "C:/ProgramData/MyApp/")
elseif(APPLE)
    set(DATA_DIR "/Library/Application Support/MyApp/")
elseif(UNIX)
    set(DATA_DIR "/usr/local/share/myapp/")
endif()

이를 통해 각 플랫폼에 맞는 파일 경로를 지정할 수 있다.

빌드 타입 별 설정

CMake는 Debug, Release, RelWithDebInfo, MinSizeRel 등 여러 빌드 타입을 지원한다. 각 빌드 타입에 따라 설정을 다르게 적용할 수 있다.

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
endif()

이 구문은 빌드 타입에 따라 최적화 옵션이나 디버그 정보를 포함하도록 설정을 조정한다.

사용자 정의 변수 및 옵션

사용자는 CMake에서 커스텀 변수를 정의하고, 이를 통해 빌드 설정을 제어할 수 있다.

option(USE_CUSTOM_LIB "Use custom library" ON)

if(USE_CUSTOM_LIB)
    add_definitions(-DUSE_CUSTOM_LIB)
    target_link_libraries(my_target custom_lib)
endif()

이를 통해 특정 기능을 활성화하거나 비활성화할 수 있다.

외부 도구 및 스크립트와의 통합

CMake는 외부 도구나 스크립트와 통합하여 빌드 프로세스를 자동화할 수 있다. 이를 통해 복잡한 빌드 절차도 효율적으로 관리할 수 있다.

if(WIN32)
    add_custom_command(TARGET my_target POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "${PROJECT_SOURCE_DIR}/my.dll"$<TARGET_FILE_DIR:my_target>)
endif()

이 구문은 빌드 후 특정 작업을 자동으로 수행하도록 한다.


관련 자료: