- cmake_minimum_required
=> 프로젝트에 대한 cmake 의 최소 버전을 명시
=> ex) cmake_minimum_required(VERSION 3.1) - project
=> 프로젝트의 이름을 설정
=> 버전 관리도 할 수 있음
=> 하지만, 프로그램 언어 정도만 기술하는게 편해보임
=> ex) project(myproject C CXX)
=> CXX == C++ - set
=> 사용 할 값에 대한 변수명을 명시
=> set(변수명 값)
=> ex) set(CMAKE_BUILD_TYPE Release) - message
=> 콘솔 화면에 로그를 기록
=> message(Mode messages...)
=> mode 는 주로 STATUS, FATAL_ERROR, DEBUG, TRACE 사용해도 충분해 보임
=> FATAL_ERROR 로 출력할 경우 cmake 빌드를 중단 함
=> ex) message(STATUS "Hello " "world")
=> 메시지가 여러 개 일 경우 메시지를 concat 해서 출력 함 - list
=> Reading, Search, Modification, Ordering 같은 명령어를 사용
=> https://cmake.org/cmake/help/latest/command/list.html
=> ex) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
=> CMAKE_MODULE_PATH 라는 list 에 값을 추가 함 - find_package
=> 현재 프로젝트가 참조해야 하는 외부 라이브러리 package 를 찾는다.
=> 보통, Find<package_name>.cmake 파일을 이용하여 찾음.
=> ex) boost 를 찾고자 하는 경우 FindBoost.cmake 파일을 이용하여 찾음.
cmake 설치 시, 대부분의 Find cmake 파일이 이미 내장되어 있음
없는 경우, list(APPEND CMAKE_MODULE_PATH ...) 를 이용하여
해당 패키지에 대한 find cmake 파일 경로를 추가해야 함
=> ex) find_package(Boost <version> <REQUIRED> <COMPONENTS>)
boost 의 경우 버전도 다양하고 제공하는 라이브러리도 많기 때문에,
특정 버전/ 특정 컴포넌트만 찾도록 명시 할 수 있다.
=> REQUIRED 가 명시되어 있을 때, package 를 찾지 못하면 cmake 빌드는 중단된다.
=> package 를 찾은 경우 해당 package 의 include 경로와 library 경로를 알 수 있다.
boost 의 경우
${Boost_INCLUDE_DIRS} 와 ${Boost_FILESYSTEM_LIBRARY} 등이다.
include 경로와 library 경로를 의미하는 변수는 인터넷이나 find cmake 파일 내에서 찾을 수 있다. - include_directories
=> 컴파일러가 include file 을 찾을 경로를 명시한다.
=> 상대경로는 현재 소스 경로를 기준으로 한다. (CMakeLists.txt 가 위치하는 경로)
=> ex) include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
AFTER: appending
BEFORE: prepending
SYSTEM: 일부 플랫폼에서 system include directory 로 취급하도록 알림 - add_definitions
=> 소스코드 컴파일 시 사용 할 매크로 값을 설정 (gcc -D 옵션)
=> ex) add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS) - add_executable
=> 명시한 소스코드를 실행 파일 형태로 빌드할 것을 명시
=> ex) add_executable(<name> source)
=> add_executable 에서 명시한 <name> 을 기준으로 이후 해당 빌드에 대한 여러 옵션을 추가 할 수 있다. - add_library
=> 명시한 소스코드를 라이브러리 형태로 빌드할 것을 명시
=> ex) add_library(<name> [STATIC | SHARED | MODULE] sources...)
<name> 을 통해 차후 컴파일 시 [리눅스: lib<name>.a] / [윈도우: <name>.lib] 형태로 출력물이 생성 된다. - target_link_libraries
=> 명시한 라이브러리를 target 빌드 시 링킹 하도록 한다.
=> ex) target_link_libraries(<target> item1 item2 ...)
<target> 에는 add_executable 및 add_library 에서 명시한 <name> 을 사용해야 한다.
item 에는 library 경로를 명시해야 한다.
/usr/lib/abc.a 와 같은 절대 경로 혹은 cmake 가 library 디렉터리 경로를 알고 있는 경우 ws2_32.lib 와 같이
라이브러리 이름만 명시하면 된다.
=> Module 간 의존성이 존재 할 경우 순서에 유의 해야한다.
=> ex) Module_A 가 Module_B 에 의존하며 AppC 가 Module B 와 Module A 를 링킹해야 하는 경우
target_link_libraries(AppC Module_B Module_A)
# 의존이 많이 걸리지 않는 모듈이 가급적 앞에 와야 한다. - target_precompile_headers
=> CMake 3.16 버전부터 지원
=> 미리 컴파일 된 헤더 빌드를 지원
=> add_library 또는 add_executable 로 지정 된 target 에 대해서 사용이 가능하다.
=> - set_target_properties
=> add_library 나 add_executable 인 target 을 대상으로 설정 가능. (복수 개 가능)
=> ex) target mySimple 을 32bit 로 컴파일 한다. (리눅스 gcc 혹은 g++ 기준)
set_target_properties(mySimple PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
set_target_properties(mySimple1 mySimple2 PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
'C++ > CMake' 카테고리의 다른 글
CMake command 정리 2 (0) | 2023.06.07 |
---|---|
리눅스 CMake 설치 (0) | 2023.01.04 |