개발/개발 환경

[개발 환경] CMake 프로젝트 구성하기 - 스크립트 관련 명령어들

growing-dev 2023. 1. 29. 22:41

CMake 프로젝트 구성하기 - 스크립트 관련 명령어들

CMake에는 수많은 명령어(함수)들이 존재한다. 이 전 포스팅에서 프로젝트를 구성하기 위한 간단한 필수적이고 자주 사용되는 명령어들을 알아보았는데 이번에는 추가적인 명령어들이 어떤 게 있는지 공부해 보고 좀 더 풍성하게 CMake를 활용해 보는 게 목적이다.

첫 번째로 스크립트 관련 명령어들을 알아본다.

 

Scripting Commands

cmake_path

cmake_path는 3.20에 새로 추가되었다.

대표적으로 GET, SET, APPEND 와 같은 옵션을 활용해서 path를 설정할 수 있다.

아래 여러가지 예제를 실험해 보았다.

set(path2 "home/growing-dev/a.cpp")
cmake_path(GET path2 FILENAME fileName)
message("file name is \"${fileName}\"")


set(path "${CMAKE_CURRENT_SOURCE_DIR}/src")
cmake_path(SET path2 "${CMAKE_CURRENT_SOURCE_DIR}/src")
cmake_path(APPEND path3 "${CMAKE_CURRENT_SOURCE_DIR}" "src")
message(${path})
message(${path2})
message(${path3})

첫 번째 GET으로 FILENAME을 추출하는 명령어이다.

a.cpp라는 path를 주고 filename을 추출하도록 명령하고 출력하였다.

file name is "a.cpp"라고 출력되는 걸 볼 수 있다.

 

다음으로 SET과 APPEND를 같이 실험했다.

${CMAKE_CURRENT_SOURCE_DIR}/src 경로를 출력하기 위해 cmake_path의 SET 옵션과 그냥 set을 비교해 보았고 또 APPEND를 통해 "src" 만으로도 경로 형태로 출력되는 걸 확인할 수 있다.

 

 

find_package

find_package는 라이브러리 같은 연관된 패키지가 미리 제대로 설치되어 있는지 찾을 때 사용하는 명령어이다.

아래와 같이 python이 제대로 설치되어 있는지 확인해 보았다.

테스트를 위해 EXACT 옵션을 주고 3.3 버전인지 찾도록 했다.

find_package(Python EXACT 3.3)

예상대로 내가 지금 설치된 버전은 3.8.10인데 3.3이라고 에러를 띄어준다.

그래서 다시 아래와 같이 수정해주었다.

find_package(Python)

 

 

include

include 명령어의 경우 프로젝트 구조상 각종 변수나 컴파일러 종류 등을 별도로 관리하기 위한. cmake 파일을 포함하는 용도로 사용한다.

CMakeList.txt 에 아래와 같이 variant 디렉터리 내에 projectA.cmake 파일을 추가하고

include(variant/projectA.cmake)

projectA는 clang 컴파일러를 사용해서 빌드하기 위해 아래와 같이 컴파일러 지정을 따로 해준다.

기존 gcc를 사용했을 때와 동일하게 잘 빌드가 되는 것을 확인할 수 있다.

이렇게 include를 통해 여러 가지 프로젝트를 분리하여 원하는 것만 포함시켜 가면서 빌드를 할 수 있게 해 주고 유지보수에 좋게 만들 수 있다.

set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)

 

 

list

list는 말 그대로 list를 다룰 수 있는 명령어이다.

APPEND, LENGTH, GET, FIND 등이 존재한다.

list(APPEND my_list "A" "B" "C")

set(length)
list(LENGTH my_list length)
message(${length})

set(first_one)
list(GET my_list 0 first_one)
message(${first_one})


set(found_index)
list(FIND my_list "C" found_index)
message(${found_index})
list(FIND my_list "D" found_index)
message(${found_index})

우선 APPEND를 통해 my_list라는 변수에 A, B, C를 넣는다.

1. length를 구하기 위해 length 변수를 만들고 집어넣은 뒤 출력한다.

2. GET을 이용해 index (0번)의 값을 출력한다.

 

FIND를 이용해 원하는 값의 index를 반환하여 저장하고 출력하도록 한다.

3. "C"는 list에 있는 값이고

4. "D"는 list에 없는 값이다.

 

 

위와 같이 출력되었다.

1. 길이는 A, B, C라서 3이 출력된다.

2. 0번 index 즉 첫 번째 값은 A라서 A가 출력된다.

3. C는 3번째 값이므로 index 2가 출력된다.

4. D는 list에 없는 값이므로 -1이 출력된다.

 

 

결론

이 외에도 기본적인 문법에 해당하는 if, function, foreach, macro 등의 스크립트 연관된 명령어들이 있다.

기본적이라서 굳이 다루지 않아도 되거나, 너무 복잡하다고 느끼거나 중요하지 않다고 느껴서 굳이 다 조사하진 않았다.

많은 명령어들을 지원하지만 실제로 다 활용한다고 무조건 좋은 건 아닌 것 같다.

적당한 명령어를 필요한 만큼 사용하여 효율적으로 구현하는 것이 제일 좋을 것이다.

그 다음 포스팅은 프로젝트와 관련된 명령어를 공부해 볼 예정이다.

반응형