3. 소개
• 기존의 유닉스 기반 환경에서의 autotools와 견주어지는 빌드 시스템.
• C/C++ 프로그램을 주로 대상.
• Linux 및 유닉스 계열, OS X, Windows 지원.
• 유닉스 계열은 Makefile 과 관련 파일이 결과물로 나옴.
• Windows는 .sln 파일 및 관련 파일이 결과물로 나옴.
• OS X는 Makefile 과 관련 파일이 나올 것으로 예측.(경험이 없음)
5. 사용법
• cmake 프로세스는 두 가지로 구성
▫ 환경 설정
cmake -S . -Bbuild
-S는 source가 위치한 곳을 지정. C++ sourc가 아니라 CMakeLists.txt
-B는 build 관련 파일들이 생성되는 곳을 지정. Source 위치와 build 위치는 분리되는 것이 좋다.
▫ 빌드
cmake --build build
• 사용법은 cmake --help 와 다음 사이트를 참조
▫ https://cmake.org/cmake/help/v3.14/manual/cmake.1.html
6. 주요 명령, 매크로, 함수(1)
• cmake_minimum_required (VERSION 2.6)
▫ cmake script의 호환성을 위한 설정. 현재 최신 버전 3.14
• Project (Tutorial)
▫ 프로젝트 명 표기. IDE에서는 이것으로 프로젝트명을 일반적으로 사용.
• add_executable(programName main.cpp)
▫ main.cpp를 컴파일 및 링크해서 programName이라는 실행파일을 만든다.
• add_library(libraryName SHARED|STATIC lib.cpp)
▫ lib.cpp를 컴파일 및 링크해서 라이브러리 파일을 만든다.
▫ SHARED를 사용하면 liblibraryName.so(유닉스 계열), libraryName.lib/dll(윈도우)이 출력.
▫ STATIC을 사용하면 liblibrary.a(유닉스 계열), libraryName.lib(윈도우)가 출력
7. 주요 명령, 매크로, 함수(2)
• include
▫ 예: include(OpenSSL) 윈도우의 경우, C:Program FilesCMakesharecmake-
3.13Modules 위치에 있는 FindOpenSSL.cmake 가 포함되는 것으로 확인된다.
• find_package
▫ 예: find_package(OpenSSL) FindOpenSSL.cmake 에 등록된 함수들을 실행해서, 관련
변수들의 값을 찾는다.
▫ OPENSSL_INCLUDE_DIR 와 OPENSSL_LIBRARIES 값이 생성됨.
▫ 생성된 변수값을 이용하여, target_include_directories, target_link_libraries 등에 사용.
8. 주요 명령, 매크로, 함수(3)
• target_link_libraries
▫ 예: target_link_libraries(Tutorial ${OPENSSL_LIBRARIES})
▫ Target인 Tutorial을 생성할 때, OPENSSL_LIBRARIES 에 설정된 값으로 링크한다.
참고) Target: add_executable() 혹은 add_library() 를 사용할 때의 설정값
• target_include_directories
▫ 예: target_include_directories(Tutorial PRIVATE ${OPENSSL_INCLUDE_DIR})
▫ Target인 tutorial의 Include 검색 경로로 추가한다.
참고) private, public: private 은 현재 target 전용, public 은 현재 target 뿐만 아니라, 이
target을 사용하는 project에도 표출시키는 역할로 이해함.
9. 주요 명령, 매크로, 함수(4)
• add_subdirectory
▫ 예: add_subdirectory(moduleTest)
▫ moduleTest 라는 하위 디렉토리의 CMakeLists.txt를 함께 포함해서 실행한다.
▫ 여러 프로젝트를 한번에 빌드할 때 유용
▫ 상위 디렉토리의 설정값이 유지되어 전달된다. 즉, 상위에서 find_package 등을 통해 얻는 값을 하
위 디렉토리에서 그대로 사용 가능.
• message
▫ 예: message("OPENSSL_INCLUDE_DIR="${OPENSSL_INCLUDE_DIR})
▫ cmake 설정 중 화면에 메시지를 출력.
▫ cmake 설정 중간에 값을 확인해보는 용도로 많이 사용하고 있음.
10. 주요 명령, 매크로, 함수(5)
• install
▫ 유닉스 계열의 경우, 최종적으로 make의 install target에 반영하는 것으로 보임.
▫ 윈도우의 경우, INSTALL.vcxproj 파일이 생성되는데, 이것에 영향을 주는 것으로
보임.
▫ 예: install(TARGETS first LIBRARY DESTINATION ${CMAKE_SOURCE_DIR}/lib
ARCHIVE DESTINATION ${CMAKE_SOURCE_DIR}/lib)
▫ LIBRARY는 .so 파일을 의미, ARCHIVE는 .a 나 .lib 파일을 의미
▫ 윈도우에서 .dll 파일 설치를 위해서는 RUNTIME을 사용
11. 중요 변수(1)
• CMAKE_MODULE_PATH
▫ cmake 의 라이브러리가 설치된 위치라고 볼 수 있다.
▫ 사용자가 cmake 모듈을 만들었을 경우, 이 값에 추가하여 모듈에 대한 include 검색 경로를 추가할
수 있음.
▫ 예: set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
▫ 새롭게 만든 Findsecp256k1.cmake 파일이 cmake 디렉토리에 존재하게 되면,
include(Findsecp256k1)으로 모듈을 포함시킬 수 있다.
• CMAKE_CXX_STANDARD
▫ C++ standard를 지정할 수 있다.
▫ 예: set (CMAKE_CXX_STANDARD 11) c++11 standard 로 컴파일함.
12. 중요 변수(2)
• CMAKE_SOURCE_DIR
▫ cmake를 최초로 실행할 때 지정된 source의 위치
▫ 하위 디렉토리로 들어가게 되더라도 유지됨.
• CMAKE_CURRENT_SOURCE_DIR
▫ 현재 source의 위치
▫ 하위 디렉토리로 들어가게 되면 이에 맞춰 변경됨.
13. Example: 개발 환경
CMakeLists.txt
+---firstexec
| CMakeLists.txt
| main.cpp
|
---firstlib
CMakeLists.txt
firstlib.cpp
firstlib.h
cmake_minimum_required (VERSION 2.6)
project(cmake-tutorial)
add_subdirectory(firstlib)
add_subdirectory(firstexec)
CMakeLists.txt in root
디렉토리 구조
14. Example: firstlib
cmake_minimum_required (VERSION 2.6)
project(firstlib)
add_library(first STATIC firstlib.cpp)
install(TARGETS first
LIBRARY DESTINATION ${CMAKE_SOURCE_DIR}/lib
ARCHIVE DESTINATION ${CMAKE_SOURCE_DIR}/lib
)
install(FILES firstlib.h DESTINATION
${CMAKE_SOURCE_DIR}/include)
CMakeLists.txt in firstlib
#include "firstlib.h"
int add(int a, int b) {
return a+b;
}
firstlib.cpp in firstlib
#ifndef FIRSTLIB_H
#define FIRSTLIB_H
int add(int a, int b);
#endif //FIRSTLIB_H
firstlib.h in firstlib