표기법

make file 문법

# 주석

# CMake 최소 버전.
cmake_minimum_required(VERSION 3.10)

# project 이름
project(my_project)
project(my_project LANGUAGE CXX VERSION 1.2.3) # 언어와 버전 지정도 가능.

# 변수 선언
set(my_variable value) # 변수 이름, 값

# 변수 참조
${my_variable}

# Verbose
set(CMAKE_VERBOSE_MAKEFILE true/false) # CMake 실행시 발생하는 모든 출력 메시지 표시 여부.

# 컴파일러 지정
set(CMAKE_C_COMPILER c_compiler_path) # 컴파일러 경로를 CMAKE_C_COMPILER 내장 변수에 지정.

# 컴파일러 옵션 지정
add_compile_options(-g -Wall ... )

# 빌드 구성별 컴파일 옵션
set(CMAKE_C_FLAGS_빌드구성 ...)
set(CMAKE_C_FLAGS_RELEASE "-DMY_DEFINE 3 -DYOUR_DEFINE 4" ...) # Release 구성.

# 전처리 매크로 추가
add_definitions(-Dmy_define=value -Dyour_define=value, -Dhis_define=value ...)

# 컴파일에 사용할 헤더/라이브러리 관련 추가
include_directories(include_dir1, include_dir2, ...) # include directory
link_directories(lib_dir1, lib_dir2, ...) # lib directory
link_libraries(a.lib, b.lib, a.dll, ...) # lib name
link_libraries(a.lib -static) # -static 옵션을 통해 정적 라이브러리만 사용하도록 지정 가능.

# 출력 경로
set(RUNTIME_OUTPUT_DIRECTORY output/bin) # 바이너리 파일 출력 경로.
set(LIBRARY_OUTPUT_DIRECTORY my_lib_output_path) # 라이브러리 파일 출력 경로.
set(ARCHIVE_OUTPUT_DIRECTORY my_archive_output_path) # static 라이브러리 파일 출력 경로.

# 구성 대상 파일 지정
add_executable(my_executable main.cpp, data.cpp, ...) # exe 대상.
add_library(my_lib main.cpp, data.cpp, ...) # 라이브러리 공통 묶음 대상.
add_library(my_lib STATIC main.cpp, data.cpp, ...) # static lib 대상.
add_library(my_lib SHARED main.cpp, data.cpp, ...) # dll 대상.

# 프로젝트간 빌드 의존성
add_dependencies(my_target, target1, target2, ...) # my_target 빌드시 target1/2 가 필요.

# 프로젝트별 컴파일 옵션 (PUBLIC, INTERFACE, PRIVATE)
target_compile_options(my_target PUBLIC option1 ...) # PUBLIC: 전역 컴파일 옵션

# 프로젝트별 전처리 정의
target_compile_definitions(my_target PUBLIC macro1=value ...)

# 프로젝트별 include/link 경로 지정
target_include_directories(my_target PUBLIC include_dir1 include_dir2 ...)
target_link_libraries(my_target PUBLIC lib_dir1 lib_dir2 ...)

# 파일 구성: 변수의 값을 참조하여 템플릿 파일의 일부를 치환하여 생성 (자주 사용됨)
configure_file(template_filename output_filename)
# 템플릿 파일은 $variable$ 또는 @variable@으로 변수이름을 지정합니다.
# 예를 들어 다음과 같은 템플릿 파일 version.h.in이 있습니다.
# define __VERSION__ "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}"
# 그리고 CMakeLists.txt에 다음 변수들이 정의되어 있습니다.
# set(VERSION_MAJOR 1)
# set(VERSION_MINOR 0)
# set(VERSION_PATCH 45)
# set(VERSION_TWEAK 32)
# 그러면 version.h는 아래와 같이 출력됩니다.
#define __VERSION__ "1.0.45.32"