makefile 转 cmake STM32工程

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()
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建一个stm32 makefile工程,可以按照以下步骤进行操作: 1. 确定芯片型号:选择使用的stm32系列芯片型号,例如stm32f103c8t6。 2. 准备开发环境:安装好交叉编译工具链和stlink调试工具。 3. 创建工程目录:在电脑上创建一个工程目录,例如~/stm32_project。 4. 创建makefile文件:在工程目录下创建一个makefile文件,例如~/stm32_project/makefile。 5. 编写makefile文件:根据芯片型号和开发需求,编写makefile文件,例如: ```makefile # makefile文件 # 编译器和链接器 CC = arm-none-eabi-gcc LD = arm-none-eabi-ld # 编译选项 CFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g -O0 LDFLAGS = -T stm32.ld # 源文件和目标文件 SRC = main.c stm32_startup.c OBJ = $(SRC:.c=.o) # 目标文件名 TARGET = stm32_project # 编译规则 all: $(TARGET).bin $(TARGET).elf: $(OBJ) $(LD) $(LDFLAGS) -o $@ $^ $(TARGET).bin: $(TARGET).elf arm-none-eabi-objcopy -O binary $^ $@ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f $(OBJ) $(TARGET).elf $(TARGET).bin ``` 6. 编写应用程序:在工程目录下编写应用程序,例如~/stm32_project/main.c。 7. 编译应用程序:在终端中进入工程目录,执行make命令编译应用程序,例如: ```shell cd ~/stm32_project make ``` 8. 烧录程序:使用stlink调试工具烧录程序到stm32芯片中,例如: ```shell st-flash write stm32_project.bin 0x8000000 ``` 以上就是创建一个stm32 makefile工程的基本步骤。需要注意的是,具体的makefile文件内容和编译选项可能需要根据具体的开发需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值