개발/개발 환경

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

growing-dev 2023. 1. 30. 22:44
반응형

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

 

이 전 포스팅에서 스크립트 관련 명령어들을 알아보았다.

이번에는 프로젝트를 구성할 때 필요한 명령어들을 알아보겠다.

스크립트 명령어가 기본적이고 베이스가 되는 명령어라면, 프로젝트 명령어를 통해서 실제 라이브러리나 프로그램을 만든다고 할 수 있겠다. 또 의존성이나 캡슐화를 프로젝트 구조적인 측면에서부터 할 수 있는 장점이있다.

 

Project Commands

 

add_compile_definitions

소스를 컴파일할 때 preprocessor 에 추가되는 define을 추가하는 명령어이다.
이렇게 추가를 하면 COMPILE_DEFINITIONS 라는 변수에 추가가 되고 이를 get_property를 통해 읽을 수 있다.
add_compile_definitions(DEBUG=TRUE VALUE=1)

get_directory_property(VAL COMPILE_DEFINITIONS)
message(STATUS "Compile definitions: ${VAL}")
결과

 

add_custom_command

아래와 같이 특정 툴을 이용해서 빌드하거나 빌드할 때 특별히 지정해야 될 포맷이 있거나 할 때 사용하는 명령어이다.

명령어 이름에 맞게 일괄적으로 적용되는 것이 아니고 custom할 수 있는 기능이다.

아래는 공식 문서에서 지정해준 예시이다.

add_custom_command(
  OUTPUT out.c
  COMMAND someTool -i ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
                   -o out.c
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
  VERBATIM)
add_library(myLib out.c)

 

add_dependencies

add_dependencies(<target> [<target-dependency>]...)

top-level target간의 의존성을 지정하는 명령어이다. 여기서 top-level 이란 install 등으로 설치한 패키지가 아니라 add_executable이나 add_library와 같이 CMakeList.txt로 빌드된 target을 의미한다.

의존 대상들을 먼저 빌드하고(보장하고) 그 다음 target을 빌드하는 식으로 동작한다.

 

 

add_executable

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
               [EXCLUDE_FROM_ALL]
               [source1] [source2 ...])

빌드 결과 나오는 산출물을 지정하는 명령어이다. 최종 결과물을 실행파일로 생성하는 명령어이다.

가장 기본적이고 필수적인 명령어라고 할 수 있겠다.

윈도우면 .exe로 나올 것이고 리눅스면 확장자가 없는 실행파일로 나올 것이다.

file(GLOB SRC
    "src/*.cpp" "src/*.c")
    
add_executable(my_test_project ${SRC})

실행파일 my_test_project 가 생성되었다.
그 자체로 실행하였다.

 

add_library

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])

빌드 결과 나오는 산출물을 지정하는 명령어이다. 최종 결과물을 라이브러리로 생성하는 명령어이다.

STATIC과 SHARED로 지정할 수 있다. .a나 .lib로 산출물이 나올 것이다.이 또한 add_executable과 함께 없어서는 안되는 명령어이다.

file(GLOB SRC
    "src/*.cpp" "src/*.c")

add_library(my_test_project ${SRC})

libmy_test_project.a 가 생성되었다.

 

 

target_include_directories

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

주어진 target을 빌드할 때 필요한 헤더파일이 포함된 디렉토리를 추가할 때 필요한 명령어이다. 빌드할 때 #include로 포함시킨 파일의 위치를 제대로 검색할 수 있도록 포함시켜주어야 한다.PUBLIC과 PRIVATE을 지정해서 추가해 주는게 좋다. 이를 활용해서 불필요한 의존성을 사전에 예방할 수 있다.

 

 

target_link_libraries

target_link_libraries(<target>
                      <PRIVATE|PUBLIC|INTERFACE> <item>...
                     [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

target에 포함할 라이브러리를 추가할 때 사용하는 명령어이다. 라이브러리의 prefix나 확장자 등은 제거하고 추가해 준다.

역시 PUBLIC과 PRIVATE를 지정해주면서 라이브러리의 scope를 지정하고 의존성을 관리할 수 있는 좋은 수단이 된다.

반응형