CMake 프로젝트 구성하기 - 프로젝트 관련 명령어들
이 전 포스팅에서 스크립트 관련 명령어들을 알아보았다.
이번에는 프로젝트를 구성할 때 필요한 명령어들을 알아보겠다.
스크립트 명령어가 기본적이고 베이스가 되는 명령어라면, 프로젝트 명령어를 통해서 실제 라이브러리나 프로그램을 만든다고 할 수 있겠다. 또 의존성이나 캡슐화를 프로젝트 구조적인 측면에서부터 할 수 있는 장점이있다.
Project Commands
add_compile_definitions
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})
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})
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를 지정하고 의존성을 관리할 수 있는 좋은 수단이 된다.
'개발 > 개발 환경' 카테고리의 다른 글
[개발 환경] 구글 테스트(googletest) 개념 및 예제 (0) | 2023.02.05 |
---|---|
[개발 환경] CMake 프로젝트 구성하기 - 다양한 변수들 (2) | 2023.02.01 |
[개발 환경] CMake 프로젝트 구성하기 - 스크립트 관련 명령어들 (0) | 2023.01.29 |
[개발 환경] CMake 최신 버전 설치하기 (1) | 2023.01.29 |
[개발 환경] CMake 프로젝트 구성 및 명령어들 (feat. VS Code) (2) | 2023.01.27 |