使用xmake构建STM32

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指令即可进行编译!

img

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

img