hunting/doc/cmake_guide.md
2024-06-04 23:13:48 +08:00

4.2 KiB
Raw Blame History

1. CMake构建工具使用

SDK使用CMake工具构建。

1.1. 安装

详见://tools/cmake/Makefile
$ cd tools/cmake
$ make
$ cmake --version
cmake version 3.27.4

1.2. SDK构建配置脚本

  • build目录下是基本的配置脚本。
build/
├── cmake
│   ├── Makefile                  // 调用cmake命令生成Makefile文件
│   └── toolchain
│       └── linux.toolchain.cmake // 工具链配置文件已经一些全局变量;
├── global_config.cmake           // 配置文件
└── sdk_config.cmake              // 配置文件

1.2.1. //build/cmake/Makefile

调用cmake命令生成Makefile文件。

all:
    @mkdir -p ../../cmake-shell;\
    cd ../../cmake-shell;\
    pwd;\
    # 调用cmake命令并指定工具链配置文件生成Makefile文件。
    cmake -DCMAKE_TOOLCHAIN_FILE="./build/cmake/toolchain/linux.toolchain.cmake" ..;\
    cd ..
clean:
    rm -rf ../../cmake-shell

1.2.2. //build/cmake/toolchain/linux.toolchain.cmake

  工具链配置文件或者一些跨平台差异化的配置文件。该文件在//build/cmake/Makefile中被指定当需要交叉编译时此文件的变量需要被重新配置。


INCLUDE(CMakeForceCompiler)

set(LINUX_TEST                    "true")
set(CROSS_COMPILE_PREFIX          "")                // 工具链前缀
set(CMAKE_C_COMPILER "${CROSS_COMPILE_PREFIX}gcc")   // 配置工具链
set(CMAKE_CXX_COMPILER "${CROSS_COMPILE_PREFIX}g++") // 配置工具链

# path to compiler and utilities
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# Name of the target platform
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# Version of the system
set(CMAKE_SYSTEM_VERSION 1)
cmake_policy(SET CMP0011 NEW)
cmake_policy(SET CMP0005 NEW)

add_definitions(-Wall -O2 -Os)
add_definitions(-Wno-unused-local-typedefs)
add_definitions(-Wstrict-aliasing -Wwrite-strings)

set(TOOLCHAIN_NAME arm-linux-gnueabihf)

set(TARGET_PLATFORM                        "linux") // 编译系统平台Linux表示在PC的ubuntu系统上编译
set(SUBMODULE_PATH_OF_IPC_SDK               "") // 子仓库路面,此处为空,交叉编译时设置
set(PLATFORM_PATH                          "${CMAKE_CURRENT_SOURCE_DIR}") // 平台路径
set(TEST_COVERAGE                          "true") // 覆盖率报告开关
add_definitions(-DPLATFORM_PATH=\"${PLATFORM_PATH}\") // 定义一个宏
set(PROJECT_OUTPUT_FOLDER        "output_files")  // 编译的目标文件输出目录
set(CMAKE_INSTALL_PREFIX         "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_OUTPUT_FOLDER}")

... // 此处省略不同模块的配置参数,一般是一些宏定义;

1.2.3. //CMakeLists.txt

SDK跟目录下的第一个CMakeLists.txt文件cmake命令执行的时候会指定根目录到此目录下寻找CMakeLists.txt文件作为整个项目的构建起点。

1.3. 重要的配置

1.3.1. 目录设置

  目录结构都是通过.cmake脚本来配置的。

1.3.1.1. 源码目录结构配置

详见://build/global_config.cmake

set(EXEC_OUTPUT_PATH            "${PLATFORM_PATH}/${PROJECT_OUTPUT_FOLDER}/bin")
set(LIBS_OUTPUT_PATH            "${PLATFORM_PATH}/${PROJECT_OUTPUT_FOLDER}/libs")
set(TEST_TOOLS_OUTPUT_PATH      "${PLATFORM_PATH}/${PROJECT_OUTPUT_FOLDER}/libs/test_tools")
set(EXTERNAL_LIBS_OUTPUT_PATH   "${PLATFORM_PATH}/${PROJECT_OUTPUT_FOLDER}/libs/external")
set(TEST_OUTPUT_PATH            "${PLATFORM_PATH}/${PROJECT_OUTPUT_FOLDER}/test")

set(PROJECT_ROOT_PATH           "${PLATFORM_PATH}")
set(APPLICATION_SOURCE_PATH     "${CMAKE_SOURCE_DIR_IPCSDK}/application") # 应用层目录
set(MIDDLEWARE_SOURCE_PATH      "${CMAKE_SOURCE_DIR_IPCSDK}/middleware")  # 中间件层目录
set(UTILS_SOURCE_PATH           "${CMAKE_SOURCE_DIR_IPCSDK}/utils")       # 工具层目录
set(HAL_SOURCE_PATH             "${CMAKE_SOURCE_DIR_IPCSDK}/hal")         # 硬件抽象层目录
set(TEST_SOURCE_PATH            "${CMAKE_SOURCE_DIR_IPCSDK}/test")        # 自动化测试代码/example目录
set(EXTERNAL_SOURCE_PATH        "${CMAKE_SOURCE_DIR_IPCSDK}/external")    # 外部依赖库目录