基于Keil工具链搭建CMake编译环境

建立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命令来完成项目的编译。
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值