CMake?

看过之前文章的兄弟都看得出来,虽然我们使用的是CMake来构建系统,离开了MDK,还不用编写复杂的MakeFile,相对而言的开发效率也是很高的。但是,CMake真的好用吗? 回想一下整个流程,首先搭建开发环境,我们需要的有:CMake、MinGW、Openocd,再使用CubeMX生成项目,然后编写CMakeList.txt,然后生成MakeFile,执行Make指令,执行下载指令。这样一套流程下来,将耗费非常多的时间。而且如果你决心使用CMake来进行构建,那么是相当于入了一个大坑,虽然很多的开源项目都是使用CMake来构建,但是CMake的语法结构和官方文档简直让你恶心。 先说一下我个人对CMake的看法吧,首先是语法混乱,虽然大小写不敏感,但是官方推荐的是使用大写,这就导致看起来非常难受。其次是CMake的变量,一点也不直观。如果你打算先将部分的代码打包成静态库或者动态库,然后在进行链接,你会发现这个过程非常的繁琐,写出来的CMake文件一点也不简洁。甚至,我觉得的CMake可以被当作一门编程语言。总体而言,CMake是一个入门难、上限高的”编程语言“,学习它就会花费的你大量的时间。

为什么使用xmake

所以,我希望找到一个体积小,语法结构简单的构建工具,所以我选择了xmake。 先简单说一下xmake,xmake是由国人开发的C、C++构建工具,与CMake不同的是,xmake不再依赖于make工具,也就是不用生成MakeFile,它可以直接构建整个项目。我觉得相比于CMake来说,最重要的是:中文文档!这个非常的重要,在编写构建脚本的过程中,出现什么问题,我们能够很方便的打开文档来进行查找。 此外,xmake提供了绿色版的安装文件,这样对于公司来说,可以很方便的将整个环境一同打包进源码,这样后续维护的时候就不用每次都安装整个开发环境。 最后,上面的文章我们使用了VSCode的任务系统来实现一键下载的功能,但是每次都需要点击快捷键有些时候还是比较麻烦的,尤其是修改了Cmake文件后,需要重新生成MakeFile,然后再进行编译,最后进行下载。起始对于CMake来说,应该是有办法能直接调用命令行来实现下载的,但是CMake的文档实在是太离谱了,本身英语不太好,结果文档还写的非常复杂,导致研究半天也没研究明白。

使用xmake

本次xmake的使用方式依旧按照上次的例子来,实例代码可以到我的网盘下载:

使用xmake构建STM32

xmake 的配置文件就不多进行介绍了,注释已经非常完整了,有问题的话可以在下面留言,我会及时给予答复!

ProjectName = "TestProject"
-- 设置工具链
toolchain("arm-none-eabi")
    set_kind("standalone")
    set_sdkdir("D:/gcc-arm-none-eabi-10.3")
toolchain_end()

-- 设置编译目标
target(ProjectName)
    -- 设置生成的文件名称
    set_filename(ProjectName ..".elf")
    -- 设置编译链
    set_toolchains("arm-none-eabi")
    -- 生成二进制文件
    set_kind("binary")
    -- 启用所有警告
    set_warnings("all")
    -- 禁用优化
    set_optimize("none")
    -- 设置编译文件的目录
    set_targetdir("build")
    -- 设置源文件位置
    add_files(
        "./Core/Src/*.c",
        "./startup_stm32f407xx.s",
        "./Drivers/STM32F4xx_HAL_Driver/Src/*.c"
    )
    -- 移除模板文件
    remove_files(
        "./Drivers/STM32F4xx_HAL_Driver/Src/*_template.c"
    )
    -- 设置头文件搜索路径
    add_includedirs(
        "./Core/Inc",
        "./Drivers/CMSIS/Include",
        "./Drivers/CMSIS/Device/ST/STM32F4xx/Include",
        "./Drivers/STM32F4xx_HAL_Driver/Inc",
        "./Drivers/STM32F4xx_HAL_Driver/Inc/Legacy"
    )
    -- 添加宏定义
    add_defines(
        "USE_HAL_DRIVER",
        "STM32F407xx"
    )
    -- 设置C编译参数
    add_cflags(
        "-mcpu=cortex-m4",
        "-mthumb",
        "-mfloat-abi=hard -mfpu=fpv4-sp-d16",
        "-fdata-sections -ffunction-sections",
        "-g -gdwarf-2",
        { force = true }
    )
    -- 设置汇编编译参数
    add_asflags(
        "-mcpu=cortex-m4",
        "-mthumb",
        "-mfloat-abi=hard -mfpu=fpv4-sp-d16",
        "-fdata-sections -ffunction-sections",
        { force = true }
    )
    -- 设置链接参数
    local MapCMD = "-Wl,-Map=" .. ProjectName .. ".map,--cref"
    add_ldflags(
        "-mcpu=cortex-m4",
        "-mthumb",
        "-mfloat-abi=hard -mfpu=fpv4-sp-d16",
        "-specs=nano.specs",
        "-TSTM32F407VGTx_FLASH.ld",
        "-Wl,--gc-sections",
        MapCMD,
        { force = true }
    )
target_end()

after_build(function(target)
    os.exec("arm-none-eabi-objcopy -O ihex ./build//TestProject.elf ./build//TestProject.hex")
    os.exec("arm-none-eabi-objcopy -O binary ./build//TestProject.elf ./build//TestProject.bin")
    print("生成已完成!")
    print("********************储存空间占用情况*****************************")
    os.exec("arm-none-eabi-size -Bd ./build/TestProject.elf")
    print("****************************************************************")
end)

task("flash")
    on_run(function ()
        os.exec("JLink.exe -autoconnect 1 -device STM32F407VG -if swd -speed 4000 -commandfile project/download.jlink")
        -- os.exec("openocd -f jlink.cfg -f stm32f4x.cfg -c 'program build/MCU_CORE_PROCESSOR.elf verify reset exit'")
    end)
    -- 设置插件的命令行选项
    set_menu {
        -- 设置菜单用法
        usage = "xmake flash",

        -- 设置菜单描述
        description = "Download the flash",

        -- 设置菜单选项,如果没有选项,可以设置为{}
        options ={}
    }
task_end()

在根目录下执行xmake指令即可进行编译!

image-20240202133120089

执行xmake flash指令即可进行下载,这里因为我这边没有板子,所以没有下载成功。

image-20240202133131319