一 、系统名称相关:

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)

文章作者: 路西法
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 以梦为马
编译构建 CMake
喜欢就支持一下吧