CMake 코드의 재사용성 이해
CMake에서 재사용 가능한 코드를 작성하는 것은 프로젝트의 유지보수성과 확장성을 높이는 데 매우 중요하다. 특히 대규모 프로젝트에서 여러 번 사용될 수 있는 코드를 모듈화하고 재사용할 수 있는 방법을 알면 전체 프로젝트의 구조를 더 간결하고 관리하기 쉽게 만들 수 있다.
함수와 매크로를 사용한 코드 재사용
CMake에서는 코드 재사용성을 높이기 위해 함수와 매크로를 사용할 수 있다. 이 둘의 차이점을 이해하는 것이 중요하다.
함수 정의 및 사용
CMake 함수는 로컬 스코프를 가지며, 호출이 끝나면 로컬 변수는 파괴된다. 따라서, 함수는 다른 곳에 영향을 미치지 않고 안전하게 사용할 수 있다.
function(print_message MESSAGE)
message(STATUS "${MESSAGE}")
endfunction()
print_message("Hello, World!")
매크로 정의 및 사용
매크로는 텍스트 치환 방식으로 작동한다. 매크로는 함수와 달리 전역 변수의 스코프에 영향을 미칠 수 있으므로 주의가 필요하다.
macro(print_message MESSAGE)
message(STATUS "${MESSAGE}")
endmacro()
print_message("Hello, World!")
변수와 옵션의 정의 및 재사용
변수와 옵션은 CMakeLists.txt 파일에서 설정을 중앙집중화하고 쉽게 재사용할 수 있게 한다.
변수 사용
변수는 프로젝트 내에서 반복적으로 사용되는 값들을 중앙에서 관리하기 위해 사용한다.
set(PROJECT_NAME "MyProject")
project(${PROJECT_NAME})
옵션 사용
옵션은 사용자가 프로젝트를 구성하는 동안 특정 기능을 켜거나 끌 수 있게 한다.
option(ENABLE_TESTS "Enable the tests" ON)
if(ENABLE_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
코드 모듈화와 include()
사용
코드 모듈화는 CMakeLists.txt 파일을 여러 개의 독립적인 파일로 나누어, 각 파일이 특정 작업을 수행하도록 하는 방법이다. 이는 include()
명령을 통해 구현할 수 있다.
include(cmake/functions.cmake)
include(cmake/options.cmake)
project(MyProject)
function(print_message MESSAGE)
message(STATUS "${MESSAGE}")
endfunction()
option(ENABLE_TESTS "Enable the tests" ON)
패키지 및 모듈 검색
CMake는 find_package()
를 사용해 외부 라이브러리나 모듈을 검색할 수 있다. 이를 통해 다른 프로젝트에서 사용되는 라이브러리를 쉽게 통합할 수 있다.
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(MyExecutable ${OpenCV_LIBS})
타겟 프로퍼티와 인터페이스 라이브러리
타겟 프로퍼티를 사용하면 특정 타겟에 속하는 빌드 설정이나 컴파일 옵션을 중앙에서 관리할 수 있다. 또한, 인터페이스 라이브러리를 사용해 다른 타겟에 영향을 미치는 설정을 관리할 수 있다.
add_library(MyLib INTERFACE)
target_include_directories(MyLib INTERFACE include/)
target_compile_definitions(MyLib INTERFACE MYLIB_EXPORT)
조건부 로직과 플랫폼 의존성 처리
조건부 로직을 사용해 특정 플랫폼이나 조건에 따라 다른 설정을 적용할 수 있다.
if(WIN32)
set(OS_SPECIFIC_LIBS ws2_32)
elseif(UNIX)
set(OS_SPECIFIC_LIBS pthread)
endif()
target_link_libraries(MyExecutable ${OS_SPECIFIC_LIBS})
CMake 모듈 경로 설정
프로젝트 내에서 사용자 정의 모듈을 사용하려면 CMAKE_MODULE_PATH
를 설정해 모듈을 찾을 경로를 지정할 수 있다.
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
find_package(MyCustomModule REQUIRED)
관련 자료: - CMake Documentation - Mastering CMake