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 的配置文件就不多进行介绍了,注释已经非常完整了,有问题的话可以在下面留言,我会及时给予答复!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| 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("openocd -f jlink.cfg -f stm32f4x.cfg -c 'program Build/TestProject.hex verify reset exit'") end) -- 设置插件的命令行选项 set_menu { -- 设置菜单用法 usage = "xmake flash",
-- 设置菜单描述 description = "Download the flash",
-- 设置菜单选项,如果没有选项,可以设置为{} options ={} } task_end()
|
在根目录下执行xmake指令即可进行编译!

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