Cmake 内置变量
一 、系统名称相关:
1.1 目标平台系统名称
# linux:"Linux", Mac:"Darwin", windows:"Windows", Others:"Generic"
CMAKE_SYSTEM_NAME
设置目标平台系统名称后可以在内部 cmake 文件中根具平台系统名称增加对应的特性,增加cmake 编译体系的通用性。
例子:
set(CMAKE_SYSTEM_NAME "Linux")
1.2 主机平台系统名称
# linux:"Linux", Mac:"iOS", windows:"Windows"
CMAKE_HOST_SYSTEM_NAME
此变量是系统自动设置,可以根据主机系统设置对应的特性,例如一个可执行程序,在 Linux 平台下名为 tools.elf,但是在 Windows 下则名为 tools.exe,想要实现兼容性就可以在不同系统下重新定义可执行程序的名称。
例子:
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
message(STATUS "current host system: Linux")
# TODO:
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
message(STATUS "current host system: Mac")
# TODO:
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
message(STATUS "current host system: Windows")
# TODO:
else()
message(STATUS "current host system: ${CMAKE_HOST_SYSTEM_NAME}")
# TODO:
endif()
二 、项目路径相关:
2.1 项目项目的名称
PROJECT_NAME
在顶层 CmakeLists.txt 中与 PROJECT_NAME 相同,但是在子 CmakeLists.txt 使用 project() 定义了项目名称时则 PROJECT_NAME 是子项目名称。
2.2 项目源码目录
PROJECT_SOURCE_DIR
指向当前工程所在源码路径(CmakeLists.txt 中使用 project() 指定工程名称),如果没有在子 CmakeLists.txt 中设置 project() 则始终指向顶层 CmakeLists.txt 所在的路径,应为在顶层CmakeLists.txt 中一定是设置了项目名称的。
2.3 项目构建输出目录
PROJECT_BINARY_DIR
指向当前工程构建输出路径(CmakeLists.txt 中使用 project() 指定工程名称),如果没有子 CmakeLists.txt 中设置 project() 则始终指向顶层 CmakeLists.txt 中 project 的构建输出路径。
三 、CmakeLists.txt路径相关:
3.1 顶层项目名称
CMAKE_PROJECT_NAME
不论是否在子 CmakeLists.txt 中,CMAKE_PROJECT_NAME 始终为顶层 CmakeLists.txt 中使用 project() 定义的项目名称。
3.2 顶层 CmakeLists.txt 所在路径
CMAKE_SOURCE_DIR
3.3 顶层 CmakeLists.txt 构建输出路径
CMAKE_BINARY_DIR
3.4 当前 CmakeLists.tst 所在路径
CMAKE_CURRENT_SOURCE_DIR
指向当前 CmakeLists.tst 所在路径,在子 CmakeLists.txt 中时则指向子 CmakeLists.txt 所在路径。
3.5 当前 CmakeLists.tst 的构建输出目录
CMAKE_CURRENT_BINARY_DIR
四、目标路径设置:
4.1 静态库生成路径
CMAKE_ARCHIVE_OUTPUT_DIRECTORY
设置后生成静态库时自动存放到指定目录。
4.3 动态库生成路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY
设置后生成动态库时自动存放到指定目录。
4.4 可执行文件生成路径
CMAKE_RUNTIME_OUTPUT_DIRECTORY
设置后生成的可执行文件会自动存放在对应路径。
4.5 生成库类型选择
BUILD_SHARED_LIBS
set(BUILD_SHARED_LIBS ON) # 生成动态库
set(BUILD_SHARED_LIBS OFF) # 生成静态库
五、编译链工具设置
5.1 C编译器设置
CMAKE_C_COMPILER
5.2 C++编译器设置
CMAKE_CXX_COMPILER
5.3 自定义其他工具路径
set(CROSS_COMPILE ${TIDE_COMPILE_PATH}/arm-none-eabi-)
# 寻找编译工具
find_program(TIDE_C_COMPILER ${CROSS_COMPILE}gcc REQUIRED)
find_program(TIDE_CXX_COMPILER ${CROSS_COMPILE}g++ REQUIRED)
find_program(TIDE_NM ${CROSS_COMPILE}nm REQUIRED)
find_program(TIDE_SIZE ${CROSS_COMPILE}size REQUIRED)
find_program(TIDE_READELF ${CROSS_COMPILE}readelf REQUIRED)
find_program(TIDE_OBJCOPY ${CROSS_COMPILE}objcopy REQUIRED)
find_program(TIDE_OBJDUMP ${CROSS_COMPILE}objdump REQUIRED)
# 设置编译工具
set(CMAKE_C_COMPILER ${TIDE_C_COMPILER})
set(CMAKE_CXX_COMPILER ${TIDE_CXX_COMPILER})
# 以下部分是自定义的变量,不是cmake的内置变量
set(CMAKE_NM ${TIDE_NM})
set(CMAKE_SIZE ${TIDE_SIZE})
set(CMAKE_READELF ${TIDE_READELF})
set(CMAKE_OBJCOPY ${TIDE_OBJCOPY})
set(CMAKE_OBJDUMP ${TIDE_OBJDUMP})
六、编译选项设置
6.1 设置C编译器编译选项
CMAKE_C_FLAGS
6.2 设置C++编译器编译选项
CMAKE_CXX_FLAGS
区别于add_compile_options 函数设置的选项是针对所有编译器的,特殊条件可能在不同编译器下会报错。
七、可执行文件后缀设置
7.1 汇编可执行文件后缀
CMAKE_EXECUTABLE_SUFFIX_ASM
7.2 C 可执行文件后缀
CMAKE_EXECUTABLE_SUFFIX_C
7.3 C++可执行文件后缀
CMAKE_EXECUTABLE_SUFFIX_CXX
例子:
set(CMAKE_EXECUTABLE_SUFFIX_ASM .elf)
set(CMAKE_EXECUTABLE_SUFFIX_C .elf)
set(CMAKE_EXECUTABLE_SUFFIX_CXX .elf)
八、调试信息设置
8.1 详细编译信息输出
CMAKE_VERBOSE_MAKEFILE
# 打开编译信息输出
set(CMAKE_VERBOSE_MAKEFILE ON)
8.2 message 日志级别控制
CMAKE_MESSAGE_LOG_LEVEL
设置message消息等级为WARNING
set(CMAKE_MESSAGE_LOG_LEVEL WARNING)