makefile 转 cmake STM32工程

2023-05-16

makefile 转 cmake STM32工程

STM32开发由MDK转到 vscode好久了。每次新建工程,stm32cubemx生成代码都要手动把makefile转到cmake,好烦,特别一下小的频繁更改。
故,一劳永逸,搞了个python脚本,一键转

测试环境

  • vscode 1.63.2
  • cmake 3.20
  • arm gcc 10.2
  1. STM32CUBEMX生成代码时选择makefile,不要选keil
  2. 运行脚本
  3. 生成CMakeLists.txt

代码

目前只测试了少量几个工程,都是M0

import os
import re

cmake_head = [
    "set(CMAKE_SYSTEM_NAME  Generic)\n",
    "set(CMAKE_SYSTEM_PROCESSOR cortex-m0+)\n",
    "include(target.cmake)\n",
    "cmake_minimum_required(VERSION 3.1.6)\n",
]

cmake_hex = [
    "set(BIN_TARGET ${PROJECT_NAME}.bin)\n",
    "set(HEX_TARGET ${PROJECT_NAME}.hex)\n",
    "set(LSS_TARGET ${PROJECT_NAME}.lss)\n",
    "\n",
    "# create binary & hex files and show size of resulting firmware image\n",
    "add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD\n",
    "        COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_TARGET}\n",
    "        COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_TARGET}\n",
    "        COMMAND ${ARM_OBJDUMP_EXECUTABLE} -S $<TARGET_FILE:${PROJECT_NAME}.elf> > ${LSS_TARGET}\n",
    "        COMMAND ${ARM_SIZE_EXECUTABLE} -B ${PROJECT_NAME}.elf\n",
    "        COMMENT \"Generating ${HEX_TARGET}, ${BIN_TARGET}\")\n",
]
target_gcc_head = [
    "######设置编译器###########\n",
    "set(CMAKE_C_COMPILER arm-none-eabi-gcc)\n",
    "set(CMAKE_CXX_COMPILER arm-none-eabi-g++)\n",
    "set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)\n",
    "set(CMAKE_OBJCOPY arm-none-eabi-objcopy)\n",
    "set(CMAKE_OBJDUMP arm-none-eabi-objdump)\n",
    "set(CMAKE_C_COMPILER_WORKS TRUE)\n",
    "set(CMAKE_CXX_COMPILER_WORKS TRUE)\n",
    "set(CMAKE_ASM_COMPILER_WORKS TRUE)\n",
    "set(CMAKE_TRY_COMPILE_TARGET_TYPE \"STATIC_LIBRARY\")\n\n\n",
    "find_program(ARM_SIZE_EXECUTABLE arm-none-eabi-size)\n",
    "find_program(ARM_GDB_EXECUTABLE arm-none-eabi-gdb)\n",
    "find_program(ARM_OBJCOPY_EXECUTABLE arm-none-eabi-objcopy)\n",
    "find_program(ARM_OBJDUMP_EXECUTABLE arm-none-eabi-objdump)\n\n\n\n",
    "######优化等级###########\n",
    "if(CMAKE_BUILD_TYPE MATCHES Debug)\n",
    "set(OPT \"-g -gdwarf-3 -O0\")\n",
    "elseif(CMAKE_BUILD_TYPE MATCHES Release)\n",
    "set(OPT \"-O3\")\n",
    "elseif(CMAKE_BUILD_TYPE MATCHES MinSizeRel)\n",
    "set(OPT \"-Os\")\n",
    "elseif(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)\n",
    "set(OPT \"-gdwarf-3 -Ofast\")\n",
    "endif()\n",
]


def write_var(f, var, v):
    f.write("set(%s %s)\n" % (var, v))


def open_makefile():
    if os.path.isfile("Makefile") == True:
        print("find makefile")
        makefile = open("Makefile").read()

        project_name = re.findall(r'TARGET = [\d\w]*', makefile)[0]
        project_name = re.findall(r'[\d\w]+', project_name)[1]
        print(project_name)

        LDSCRIPT = re.findall(r'[\S]*\.ld', makefile)[0]
        print(LDSCRIPT)

        c_source = re.findall(
            r'# C sources[\W\S\D\d\w\s]*# ASM sources', makefile)[0]
        c_source = re.findall(r'[\S]*\.c', c_source)
        print(c_source)

        asm_source = re.findall(
            r'# ASM sources[\W\S\D\d\w\s]*# binaries', makefile)[0]
        asm_source = re.findall(r'[\S]*\.s', asm_source)
        print(asm_source)

        c_include = []
        temp = re.findall(r'-I[\S]*', makefile)
        for c in temp:
            c_include.append(c[2:])

        c_def = re.findall(r'-D[\S]*', makefile)

        cpu = re.findall(r'-mcpu[\S]*', makefile)
        fpu = re.findall(r'-mfpu[\S]*', makefile)
        flaot_abi = re.findall(r'-mfloat-abi[\S]*', makefile)

        c_flags = re.findall(
            r'CFLAGS = .*', makefile)[0][len("CFLAGS = "):].replace("(", "{").replace(")", "}")

        asm_flags = re.findall(
            r'ASFLAGS = .*', makefile)[0][len("ASFLAGS = "):].replace("(", "{").replace(")", "}")

        link_flags = re.findall(
            r'LDFLAGS = .*', makefile)[0][len("LDFLAGS = "):].replace("(", "{").replace(")", "}")

        libs = re.findall(r'LIBS = .*', makefile)[0][len("LIBS = "):]
        print(libs)
###################target.cmake####################################
        target_file = open("target.cmake", "w", encoding='utf-8')
        target_file.writelines(target_gcc_head)

        target_file.writelines("\n\n###宏定义##########\n")
        for c in c_def:
            target_file.write("add_definitions(%s)\n" % (c))

        target_file.writelines("\n\n###编译器选项##########\n")
        write_var(target_file, "LDSCRIPT",
                  "${CMAKE_CURRENT_SOURCE_DIR}/"+LDSCRIPT)
        write_var(target_file, "LIBS", "\""+libs+"\"")
        if len(cpu) > 0:
            write_var(target_file, "CPU", cpu[0])
        if len(fpu) > 0:
            write_var(target_file, "FPU", fpu[0])
        if len(flaot_abi) > 0:
            write_var(target_file, "FLOAT_ABI", flaot_abi[0])

        write_var(target_file, "MCU", "\"${CPU} -mthumb ${FPU} ${FLOAT_ABI}\"")

        target_file.write(
            "set(CMAKE_C_FLAGS \" % s\" CACHE INTERNAL \"C compiler flags\")\n" % (c_flags))
        target_file.write(
            "set(CMAKE_CXX_FLAGS \" % s\" CACHE INTERNAL \"Cxx compiler flags\")\n" % (c_flags))
        target_file.write(
            "set(CMAKE_ASM_FLAGS \" % s\" CACHE INTERNAL \"ASM compiler flags\")\n" % (asm_flags))

        target_file.write(
            "set(CMAKE_EXE_LINKER_FLAGS \" % s\" CACHE INTERNAL \"Exe linker flags\")\n" % (link_flags))

        target_file.close()
# ----------------CMakeLists.txt------------------------------
        cmake_file = open("CMakeLists.txt", "w", encoding='utf-8')
        cmake_file.writelines(cmake_head)

        cmake_file.write("project(%s C CXX ASM)\n\n" % project_name)

        cmake_file.write("set(_SRC\n")
        for src in c_source:
            cmake_file.write("%s\n" % src)
        for src in asm_source:
            cmake_file.write("%s\n" % src)
        cmake_file.write(")\n")

        cmake_file.write("include_directories(\n")
        for c_in in c_include:
            cmake_file.write("%s\n" % c_in)
        cmake_file.write(")\n")

        cmake_file.write(
            "add_executable(${PROJECT_NAME}.elf  ${_SRC})\n\n")
        cmake_file.write(
            "include(app.cmake)\n\n")

        cmake_file.writelines(cmake_hex)
        cmake_file.close()
# ----------------app.cmake------------------------------
        if os.path.isfile("app.cmake") == False:
            app_cmake = open("app.cmake", "w", encoding='utf-8')
            app_cmake.write("#app file \n\n")
            app_cmake.close()


if __name__ == '__main__':
    open_makefile()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

makefile 转 cmake STM32工程 的相关文章

随机推荐

  • 【STM32】入门(十二):实时操作系统RTOS和通用操作系统GPOS的区别

    STM32 STM32单片机总目录 1 简述 实时操作系统 RTOS xff0c Real Time Operating System 通用操作系统 GPOS xff0c General Purpose Operating System 2
  • 【STM32】入门(十四):FreeRTOS-任务

    1 简述 FreeRTOS应用程序由一组独立的任务构成 在任何时间点 xff0c 应用程序中只能执行一个任务 xff0c FreeRTOS调度器负责决定所要执行的任务 每个任务在自己的上下文中执行 xff0c 不依赖于系统内的其他任务或 F
  • 【SBUS】一文看懂SBUS协议

    STM32 STM32单片机总目录 1 简介 S BUS是一个串行通信协议 xff0c S BUS是FUTABA提出的舵机控制总线 xff0c S bus使用RS232C串口的硬件协议作为自己的硬件运行基础 使用TTL电平 xff0c 即3
  • 【ubuntu】ubuntu14.04、16.04、18.04 LTS版本支持时间

    0 历史版本下载地址 http old releases ubuntu com releases http mirrors 163 com ubuntu releases 1 官网说明 https wiki ubuntu com Kerne
  • 树莓派,tx2硬件对比

    具体参考以下链接 http www exuehao com article detail 14
  • Gazebo中的平面运动 (urdf+控制器设置)及所遇见的问题

    这里有个视频 xff0c 介绍怎么让机器人在平面运动 xff08 在x和y方向上进行平移 xff09 xff1a https www youtube com watch v 61 mtSpqObg9X4 如果你们看不了视频也没关系 xff0
  • 2014年年终总结:写书成长,承载收获

    雪花纷飞 xff0c 任你飘落凝成魅力的雪域之城 美丽的守候 xff0c 望长城内外惟余莽莽 数着北国春夏秋冬的每一天 xff0c 2014 的日历天天换新装 xff0c 消瘦了你的时光 但丰盈了我的渴望 2014 年 xff0c 在你的身
  • 漫步数学分析三十五——乘法法则与梯度

    微分中另一个有名的法则是乘法法则或莱布尼兹法则 定 理 6 令 A R n 是开集 xff0c f A R m g A R 是可微函数 xff0c 那么 g f 是可微的并且对于 x A D g f x R n R m 为 D
  • CAN总线标准及协议分析

    目录 1 简介 2 CAN总线标准 2 1 物理层 2 1 1 CAN总线网络 2 1 2 CAN收发器 2 1 3 CAN信号表示 2 1 4 CAN信号传输 2 2 数据链路层 2 2 1 数据帧 2 2 1 1 帧起始与结束帧 2 2
  • Eclipse中Python开发环境搭建详细图文教程(Windows环境)

    转载请注明出处 Eclipse可便捷的集成开发Python xff0c 这里我们为了更好地使用Python进行机器学习 xff0c 首先进行Eclipse中Python开发环境的搭建 一 下载EclipseIDE 下载地址 xff1a ht
  • FreeRTOS系列|多任务调度

    多任务调度 1 多任务启动流程 多任务启动流程如下表所示 启动后以下各函数由上至下依次执行含义osKernelStart 启动内核vTaskStartScheduler 启动任务调度器xPortStartScheduler 启动调度器prv
  • Realsense d435i驱动安装、配置及校准

    写在前面 本文是在ubuntu20 04下安装 xff0c 其它版本大同小异 可能出现的问题 xff0c 主要由各自安装相关库版本不一致导致 xff0c 故问题不一 xff0c 但一般很好解决 xff0c 正常情况下不会出现 Intel R
  • Realsense d435i内参、外参标定

    使用工具code utils imu utils kalibr对Realsense d435i 内参 外参标定 本文介绍上述工具的安装 xff0c 及标定方法 一 code utils安装 1 建立工作空间 mkdir p calibrat
  • 从零完成slam实战,以Vins-Fusion为例

    写在前面 1 本文以vins fusion为例 xff0c 是因为其框架正统 简单清晰 xff0c 易于调试和后续改进 xff1b camera imu外参及同步时间td可实时估计 xff1b 已有融合gps方案且较为容易可添加融合其它传感
  • Vins-Fusion整体框架,数据流分析

    一 VINS Fusion VINS Fusion是一种基于优化的多传感器状态估计器 xff0c 可实现自主应用 xff08 无人机 汽车和AR VR xff09 的精确自我定位 VINS Fusion是VINS Mono的扩展 xff0c
  • Vins-Fusion初始化位姿——3D-2D:PNP求解当前帧位姿

    继上一篇博文Vins Fusion 外参camera imu 标定 xff0c 本文继续介绍Vins Fusion初始化时 xff0c 通过PNP求解当前帧位姿 一 3D 2D xff1a PNP PnP是求解3D到2D点对运动的估计 xf
  • ORB_SLAM3启动流程以stereo_inertial_realsense_D435i为例

    概述 ORB SLAM3 是第一个同时具备纯视觉 xff08 visual xff09 数据处理 视觉 43 惯性 xff08 visual inertial xff09 数据处理 和构建多地图 xff08 multi map xff09
  • BoW(词袋)模型详细介绍

    最近学习BoW模型 xff0c 将自己网上看到的资料及对论文的理解 xff0c 将BoW模型总结如下 xff01 BoW模型 Bag of words model BoW model 最早出现在自然语言处理 xff08 Natural La
  • Win10 VS Code + CMake STM32开发环境

    Win10 VS Code 43 CMake STM32开发环境 软件 软件安装与环境变量的配置不多讲 xff0c 这步都搞不定还是老老实实用MDK把 VS Codecmake 插件 c c 43 43 插件mingwgcc arm non
  • makefile 转 cmake STM32工程

    makefile 转 cmake STM32工程 STM32开发由MDK转到 vscode好久了 每次新建工程 xff0c stm32cubemx生成代码都要手动把makefile转到cmake xff0c 好烦 xff0c 特别一下小的频