CMake 프로젝트 구성하기 - 다양한 변수들
CMake는 다양한 변수들을 제공한다. 프로젝트를 구성할 때 해당 변수들을 잘 활용해서 명령어와 스크립트를 구성하면 효율적이고 유지보수에 좋은 프로젝트를 구성할 수 있다.수많은 명령어 중에서 자주 사용될 만한 것을 선정해 보았고 실제로 출력해 보면서 어떤 용도로 사용할지 생각해 보았다. 여러 카테고리로 나누어져 있고, 그 카테고리에 맞게 분류해서 정리해 본다.
https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
Variables that Provide Information
정보를 제공하는 변수로 주로 현재 프로젝트에 적용된 이름과 디렉토리를 출력한다. 이 값들은 프로젝트나 사람에 따라 상대경로로 작용하기 때문에 절대 경로나 고정된 이름이 아니라 변수들을 잘 활용하면 유지보수에 좋은 구조를 만들 수 있다.
CMAKE_BINARY_DIR,
CMAKE_SOURCE_DIR,
CMAKE_CURRENT_BINARY_DIR,
CMAKE_CURRENT_SOURCE_DIR
message(${CMAKE_BINARY_DIR})
message(${CMAKE_SOURCE_DIR})
message(${CMAKE_CURRENT_BINARY_DIR})
message(${CMAKE_CURRENT_SOURCE_DIR})
CMAKE의 바이너리 디렉토리, 소스 디렉터리를 얻어 올 수 있는 변수들이다.
CURRENT가 붙는 것은 현재 프로세싱 중인 타깃의 정보이고, CURRENT가 안 붙은 것들을 CMake상 Top-level에 해당하는 것이다. 일반적으로 구성하는 적당한 수준의 프로젝트는 붙나 안 붙나 비슷한 것으로 보인다.
CMAKE_COMMAND
CMake가 실행될 cmake의 실행 위치를 저장한다.
message(${CMAKE_COMMAND})
CMAKE_PROJECT_NAME
프로젝트 이름을 저장한다. project() 에 명시한 이름으로, my_test_project가 출력된다.
project(my_test_project LANGUAGES CXX VERSION 0.1.0)
message(${CMAKE_PROJECT_NAME})
Variables that Change Behavior
실제 CMake 동작을 바꿀 수 있는 변수들이다.
BUILD_SHARED_LIBS
해당 변수는 ON 으로 설정할 수 있으며 add_library 시에 정적 라이브러리로 만들지 공유 라이브러리로 만들지를 결정하는 변수이다. ON이면 공유 라이브러리고, 아니면 기본은 정적 라이브러리로 만든다.
file(GLOB SRC
"src/*.cpp" "src/*.c")
add_library(my_test_project ${SRC})
설정하지 않은 경우 libmy_test_project.a 로 정적 라이브러리로 빌드됨을 알 수 있다.
아래와 같이 BUILD_SHARED_LIBS를 ON으로 설정한 경우 libmy_test_project.so로 빌드됨을 알 수 있다.
file(GLOB SRC
"src/*.cpp" "src/*.c")
set(BUILD_SHARED_LIBS ON)
add_library(my_test_project ${SRC})
CMAKE_BUILD_TYPE
빌드 타입을 지정하는 변수로 Debug, Release와 같이 지정 가능하다. 정확하진 않지만 특별히 지정해 주지 않으면 Debug로 설정되는 것으로 보인다.
message(${CMAKE_BUILD_TYPE})
Variables for Languages
언어별로 설정할 수 있는 변수들이다.
CMAKE_C_STANDARD
CMAKE_CXX_STANDARD
C, C++의 Standard를 설정할 수 있는 명령어이다. C89/C90, C99, C11, C++98, C++11 등이 지정 가능하다
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
CMAKE_<LANG>_COMPILER
CMAKE_<LANG>_FLAGS
complier와 flag를 지정할 수 있는 명령어이다.
크로스 컴파일 하거나 프로젝트 내에 여러가지 언어로 빌드하길 원할 때 컴파일러를 지정할 수 있고, 그에 따라 필요한 flag들을 언어에 맞게 설정할 수 있다.
'개발 > 개발 환경' 카테고리의 다른 글
[개발 환경] CMake 프로젝트에 Googletest 추가하기 (0) | 2023.02.05 |
---|---|
[개발 환경] 구글 테스트(googletest) 개념 및 예제 (0) | 2023.02.05 |
[개발 환경] CMake 프로젝트 구성하기 - 프로젝트 관련 명령어들 (1) | 2023.01.30 |
[개발 환경] CMake 프로젝트 구성하기 - 스크립트 관련 명령어들 (0) | 2023.01.29 |
[개발 환경] CMake 최신 버전 설치하기 (1) | 2023.01.29 |