cmake_minimum_required(VERSION X.X.X)
가장 최상위에 cmake 최소 요구 버전을 작성해주어야 합니다.
set(CMAKE_SYSROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../sysroot)
CMAKE_SYSROOT는 크로스 컴파일 환경에서 타겟의 sysroot를 지정할 때 사용합니다.
컴파일러가 찾아야하는 헤더파일이나 라이브러리를 host 환경이 아닌, 타겟 시스템 기준으로 찾도록 해줍니다. find_xx() 매크로에서 찾는 경로로 쓰이기도 합니다.
set(CMAKE_C_COMPILER ${C_COMPILER_PATH})
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_PATH})
사용할 컴파일러의 경로를 지정합니다.
set( CMAKE_CXX_FLAGS -std=c++17 -g3 -O0") // C++ 컴파일러 옵션
set( CMAKE_C_FLAGS "-g3 -O0") // C 컴파일러 옵션
해당 CMakeLists.txt에서 빌드되는 모든 타겟에 대하여 컴파일러 옵션이 적용됩니다.
주의할 점은 target_compile_options()로 덮어쓸 수 없다는 점입니다.
set(EXAMPLE ${CMAKE_SYSROOT}/../example)
CMake 변수가 아닌 원하는 변수도 지정이 가능합니다.
add_compile_options (
-g3
-O0
-fno-omit-frame-pointer
-fno-stack-protector
-std=c++17
)
마찬가지로 전역으로 적용되는 컴파일 옵션으로, CMAKE_C_COMPILER와 CMAKE_CXX_COMPILER랑 겹치기 때문에, 중복 사용이므로 필요 없지만 참고하면 될 것 같습니다.
CMake 변수에서는 "-g3" 처럼 문자열의 형태이지만 add_compile_options() 매크로에서는 ""로 감싸져 있지 않다는 차이가 있습니다.
add_definitions(
-DMY_DEFINITION
)
전처리문을 미리 지정할 수 있습니다. -D 문자 뒤에 오는 부분이 #define처럼 사용됩니다. 이 경우에는 #define MY_DEFINITION이 되겠네요.
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
빌드 후 결과물을 저장할 경로를 설정합니다.
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
include(CMakeModule)
CMake 모듈 사용 시, 참조할 경로를 설정합니다.
add_library(mylib
${CMAKE_CURRENT_SOURCE_DIR}/../src/mylib1.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../src/mylib2.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../src/mylib3.cpp
)
직접 작성한 라이브러리를 추가합니다.
target_include_directories(mylib PRIVATE
${MY_LIB1_INCLUDE_PATH}
${MY_LIB2_INCLUDE_PATH}
${MY_LIB3_INCLUDE_PATH}
)
타겟이 필요한 include 파일의 경로를 설정합니다. 이 경우에는 mylib이라는 라이브러리를 빌드하기 위해 참조해야하는 헤더 파일 등의 경로입니다.
이 매크로에는 PRIVATE, PUBLIC, INTERFACE 옵션이 쓰일 수 있습니다.
PRIVATE : 타겟에만 포함되도록 함
PUBLIC : 타겟과 타겟을 사용하는 다른 타겟에도 포함되도록 함
INTERFACE : 타겟을 사용하는 다른 타겟에만 포함되도록 함
add_executable(mybin
${MY_SRC_FILES}
${MY_LIB1_FILES}
${MY_LIB2_FILES}
${MY_LIB3_FILES}
)
실행 파일로 얻으려고 하는 타겟을 추가합니다. 가장 먼저 타겟 이름, 그 뒤에는 타겟을 빌드하기 위해 필요한 파일들을 나열합니다.
target_include_directories(mybin PRIVATE
${MY_SRC_INCLUDE_PATH}
)
마찬가지로 타겟을 빌드하기 위해 필요한 include 파일 경로를 설정합니다. mylib은 add_library()를 사용했지만 mybin은 add_executable()을 사용한다는 차이가 있습니다.
link_directories(
${EXT_LIB_PATH}
)
참조할 외부 라이브러리 경로를 설정합니다. 하지만 공식 문서에서도 사용을 되도록 피하고, 직접 타겟에 라이브러리를 링크하는 매크로를 사용하기를 권장합니다.
find_library, target_link_libraries 등을 사용하면 좋을 것 같습니다!
find_library(LIB_I_WANT libname PATHS ${LIB_PATH} REQUIRED)
이미 존재하는 특정 라이브러리를 찾는 매크로입니다. 찾은 라이브러리의 경로를 첫 번째 변수에 저장합니다.
PATHS를 사용하여 직접 라이브러리를 찾을 경로를 지정할 수도 있고, PATHS를 사용하지 않을 경우 기본 설정 경로에서 찾게됩니다.
REQUIRED는 찾지 못하면 오류를 발생시키도록 합니다. 꼭 필요한 라이브러리의 경우 REQUIRED를 사용합니다.
target_link_libraries(mybin
myblib
extlib
)
타겟이 사용할 라이브러리를 링크합니다.
주의할 점은 target_link_libraries()가 link_directory()나 find_library() 등 보다 먼저 작성되어 있으면 CMake에서 링크할 라이브러리의 경로를 찾지 못합니다.