使用xmake构建STM32

使用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 的配置文件就不多进行介绍了,注释已经非常完整了,有问题的话可以在下面留言,我会及时给予答复!

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构建STM32 插图1

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

使用xmake构建STM32 插图2

温馨提示:本文最后更新于2023-03-04 21:47:28,某些文章具有时效性,若有错误或已失效,请在下方留言或联系XinMouRen
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

文章版权声明 1、本网站名称:昕某人の博客
2、本站永久网址:https://xinmouren.cn
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。

THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
不需要使用MarkDown格式哦
提交
头像

昵称

夸夸
夸夸
还有吗!没看够!
取消
昵称表情代码图片

    暂无评论内容