建立CMake运行环境
搭建基于Keil工具链的CMake环境,需要安装下列工具:CMake,Keil MDK和make(或者Ninja)。在安装完成下列工具后,将上述工具的安装路径添加到环境变量路径中。或者建立.bat文件,然后将下列命令添加到文件中。
set PATH=%PATH%;D:\Tools\Ninja\;D:\Keil_v5\ARM\ARM_Compiler_5.06u7\bin\;D:\Program Files\CMake\bin\
在环境变量添加完成后,打开命令行,分别输入下列命令,查看上述工具是否安装成功。
ninja --version
cmake --version
armcc
编写CMakeLists.txt文件
下面开始着手编写CMakeLists.txt文件。
首先在项目的目录下建立CMake目录,用来存放CMakeLists.txt等相关文件。然后建立CMakeLists.txt文件,打开该文件在文件中输入如下命令。
cmake_minimum_required(VERSION 3.17)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER armcc)
set(CMAKE_OBJCOPY fromelf)
# project settings
project(template C ASM)
set(CMAKE_CXX_STANDARD 03)
set(CMAKE_C_STANDARD 99)
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "ARMCC")
set(ARMCC 1)
endif()
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "ARMClang")
set(ARMClang 1)
endif()
if (ARMCC)
set(c_flags --c99 --cpu Cortex-M4.fp.sp --apcs=interwork --split_sections)
set(asm_flags -c --cpu Cortex-M4.fp.sp --apcs=interwork)
add_compile_options(
"$<$<COMPILE_LANGUAGE:C>:${c_flags}>"
"$<$<COMPILE_LANGUAGE:ASM>:${asm_flags}>"
)
endif()
add_compile_definitions(USE_HAL_DRIVER STM32G431xx)
include_directories(
../Core/Inc
../Drivers/STM32G4xx_HAL_Driver/Inc
../Drivers/STM32G4xx_HAL_Driver/Inc/Legacy
../Drivers/CMSIS/Device/ST/STM32G4xx/Include
../Drivers/CMSIS/Include
)
file(GLOB SOURCES
../MDK-ARM/startup_stm32g431xx.s
../Core/Src/*.c
../Drivers/STM32G4xx_HAL_Driver/Src/*.c
../Drivers/CMSIS/**/*.c
)
set(LINKER_SCRIPT ../uart.sct)
add_link_options("--scatter=${LINKER_SCRIPT}")
add_executable(${PROJECT_NAME}.axf ${SOURCES})
set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(ASM_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.asm)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
add_custom_command(TARGET ${PROJECT_NAME}.axf POST_BUILD
COMMAND ${CMAKE_OBJCOPY} --i32 $<TARGET_FILE:${PROJECT_NAME}.axf> --output=${HEX_FILE}
COMMAND ${CMAKE_OBJCOPY} --text -c --cpu=Cortex-M0 $<TARGET_FILE:${PROJECT_NAME}.axf> --output=${ASM_FILE}
COMMAND ${CMAKE_OBJCOPY} --bin $<TARGET_FILE:${PROJECT_NAME}.axf> --output=${BIN_FILE}
COMMENT "Building ${HEX_FILE}
Building ${ASM_FILE}
Building ${BIN_FILE}")
下面解释一下CMakeLists.txt中的部分内容。
if (ARMCC)
set(c_flags --c99 --cpu Cortex-M4.fp.sp --apcs=interwork --split_sections)
set(asm_flags -c --cpu Cortex-M4.fp.sp --apcs=interwork)
add_compile_options(
"$<$<COMPILE_LANGUAGE:C>:${c_flags}>"
"$<$<COMPILE_LANGUAGE:ASM>:${asm_flags}>"
)
endif()
这部分代码,针对“.c”和“.s”文件分别设置了编译选项,选项的内容来自于Keil中的设置。如下图所示:
除此之外还可以生成编译命令文件,然后根据该文件设置编译选项。
然后在objects目录中查找后缀名为“.__i”的文件,打开该文件就可以看到编译选项。值得注意的是在asm文件的编译选项中需要添加“-c”选项,而.c文件的编译选项不需要添加该编译选项。
执行编译
在CMakeLists.txt文件编写完成之后,就可以开始编译了。
在CMake目录下建立一个build目录,然后执行如下命令:
set PATH=%PATH%;D:\Tools\Ninja\;D:\Keil_v5\ARM\ARM_Compiler_5.06u7\bin\;D:\Program Files\CMake\bin\
cmake .. -DCMAKE_TOOLCHAIN_FILE=..\ARMCC.cmake -DCMAKE_BUILD_TYPE=Debug -G "Ninja"
其中第一行将ninja、cmake和armcc等工具添加到环境变量中。
第二行执行了cmake命令。其中
- -DCMAKE_TOOLCHAIN_FILE会将CMAKE_TOOLCHAIN_FILE的设定值传给了CMakeLists.txt文件,
- CMAKE_BUILD_TYPE指定了build的类型,不同的类型会给编译器传递不同的参数,build类型就是在前面所说的armcc.cmake文件中定义的。
- -G参数定义了所使用的构建系统,可使用
cmake -G list
命令查看cmake所支持的构建系统。
cmake执行完成后,可使用ninja命令来完成项目的编译。