当前位置:   article > 正文

编写Makefile 构建ShareRTOS工程_wno-missing-braces

wno-missing-braces

      项目硬件验证环境: STM32F205
      项目码云git地址: https://gitee.com/liwandong/ShareRTOS


      在进行linux驱动开发时经常会使用到make menuconfig 这中基于文本的工程管理方法来决定是否编译某一个文件,想参考这种方式进行自己的工程的管理,使用这个博客记录一下这个功能的实现过程,先看一下总体的效果图如下:

  1. 首先进行工程路径的规划,整体的项目规划思路如下
    在工程的总目录下定义一个总的makefile,其余的子文件夹中同步定义其对应的makefile和Kconfig文件。
  2.  构建对应的工具部分。
       在工程目录下创建tools的文件夹,下载一份linux内核的代码,从scripts/kconfig/ 目录下拷贝mconf和conf文件到tools文件夹下,如果,没有这个文件则在内核文件下执行make menuconf 命令后即可生成这个文件,也可以自己去移植makefile单独编译,这里感觉比较麻烦直接用编译好的。执行后的结果如下:
  3. 在makefile 中如何使用mconf 文件,实现过程如下:

    在执行完mconf 命令后会生成新的.config文件,但是我这里编译目标的时候没有去检查这个文件是否发生变化,从而导致编译的时候因为依赖文件没有更新导致无法编译生成新的目标,所以采用比较简单的方法,执行配置选项后直接将output删除,编译目标时会重新解析.conf文件生产新的目标。
  4. Makefile文件分为两个文件,Makefile 文件用于实现生产项目的.bin文件,download 和 clean 功能,Makefile.build 文件实现将传入的文件夹下的c文件编译成build-in.o。Makefile 生产.bin目标时直接链接各个子文件夹下的build-in.o 文件.下面分别对总Makefile和Makefile.build 文件进行说明:
    顶层Makefile文件的说明如下:
    1. #选择编译工具链
    2. CROSS_COMPILE = arm-none-eabi-
    3. CC := $(CROSS_COMPILE)gcc
    4. CXX := $(CROSS_COMPILE)g++
    5. AS := $(CROSS_COMPILE)as
    6. AR := $(CROSS_COMPILE)ar
    7. LD := $(CROSS_COMPILE)ld
    8. OBJCOPY :=$(CROSS_COMPILE)objcopy
    9. OBJDUMP :=$(CROSS_COMPILE)objdump
    10. SIZE :=$(CROSS_COMPILE)size
    11. #编译输出的路径
    12. OUTPUT :=output/
    13. #查找当前目录下所有的inc文件夹
    14. allincdir := $(shell find ./ -name inc -type d)
    15. #编译的CFLAGS 选项中添加头文件路径
    16. CFLAGS += $(addprefix -I,$(allincdir))
    17. CFLAGS += -Wall -O0 -g -Wno-missing-braces -std=gnu99 -mthumb -mcpu=cortex-m3 -mfloat-abi=soft -D__NO_SYSTEM_INIT -lnosys --specs=nano.specs -ffunction-sections -fdata-sections
    18. #设置为环境变量,方便在makefile.build中使用
    19. export CC CXX AS AR LD OBJCOPY OBJDUMP SIZE CFLAGS OUTPUT #BUILDOBJYFILE
    20. #编译项目的目标名称
    21. PROJECTNAME = sharertos
    22. #需要编译的文件夹名称,即项目下需要编译的文件夹路径名
    23. PROJECTSRCDIR = mcudevice/
    24. PROJECTSRCDIR += user/
    25. #链接脚本路径
    26. LDDIR = mcudevice/stm32f205/
    27. #链接选项
    28. LDFLAGS += -I ./include/generated
    29. LDFLAGS += -nostartfiles -Wl,--gc-sections,-Map=$(OUTPUT)$(PROJECTNAME).map,-cref -mcpu=cortex-m3 -march=armv7-m -T$(LDDIR)stm32f2xxx.ld
    30. #用于生成bin文件的依赖文件的名称,例如user/build-in.o
    31. allbuildfile = $(addsuffix build-in.o,$(addprefix $(OUTPUT),$(PROJECTSRCDIR)))
    32. #目标文件
    33. all:$(OUTPUT)$(PROJECTNAME).bin
    34. #生成bin文件
    35. $(OUTPUT)$(PROJECTNAME).bin:$(OUTPUT)$(PROJECTNAME).elf
    36. $(OBJCOPY) -O binary $^ $@
    37. #生成elf文件
    38. $(OUTPUT)$(PROJECTNAME).elf:$(allbuildfile)
    39. $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
    40. #调用makefile.build 文件生成对应的build-in文件,这个地方应该可以用foreach的函数去实现,没有验证
    41. #目前要用的话直接像后加3 4 等这样的
    42. $(allbuildfile):FORCE
    43. make -f Makefile.build obj=$(word 1,$(PROJECTSRCDIR))
    44. make -f Makefile.build obj=$(word 2,$(PROJECTSRCDIR))
    45. #清除文件
    46. clean:
    47. -rm -rf $(OUTPUT)
    48. #实现menuconfig
    49. menuconfig:Kconfig
    50. ./tools/mconf $<
    51. ./tools/conf -s --syncconfig $<
    52. rm -rf $(OUTPUT)
    53. #下载到mcu中
    54. download:
    55. echo "si 1" >> jlinkcmd #选择swd端口
    56. echo "speed 4000" >>jlinkcmd #设置速度
    57. echo "device STM32F205RE" >> jlinkcmd #选择mcu型号
    58. echo "r" >> jlinkcmd #重新复位
    59. echo "h" >> jlinkcmd #挂起目标
    60. #echo "erase" >> jlinkcmd #全部擦除flash
    61. echo "loadfile $(OUTPUT)/$(PROJECTNAME).bin 0x08000000" >> jlinkcmd #烧录
    62. echo "g" >> jlinkcmd #运行
    63. echo "qc" >> jlinkcmd #退出
    64. JLinkExe -CommanderScript jlinkcmd
    65. rm jlinkcmd
    66. FORCE:
    67. .PHONY:FORCE

    Makefile.build 文件的说明如下:
     

    1. #接收传入的参数
    2. src :=$(obj)
    3. PHONY := __build
    4. __build:
    5. #定义obj-y
    6. obj-y :=
    7. include ./include/config/auto.conf
    8. #获取传入的文件夹下的makefile
    9. allmakefile := $(shell find $(src) -name Makefile)
    10. #包含所有的makefile
    11. include $(allmakefile)
    12. #获取obj-y 文件
    13. buildobjyfile := $(obj-y)
    14. #挑出目录
    15. buildobjydir :=$(filter %/,$(buildobjyfile))
    16. #设置文件obj-y目录顺序
    17. #判断文件夹的个数来觉得目录顺序
    18. ifeq ($(words $(buildobjydir)),1)
    19. builddir := $(join $(src),$(buildobjydir))
    20. else
    21. firstdir := $(word 1, $(buildobjydir))
    22. seconddir := $(word 2, $(buildobjydir))
    23. ifeq ($(firstdir),src/)
    24. builddir := $(join $(src)$(seconddir),$(firstdir))
    25. else
    26. builddir := $(join $(src)$(firstdir),$(seconddir))
    27. endif
    28. endif
    29. #给obj-y的文件名加上前缀
    30. objsrc :=$(addprefix $(builddir),$(filter-out %/,$(buildobjyfile)))
    31. #生成build-in.o文件
    32. __build:$(objsrc) $(OUTPUT)$(src)build-in.o
    33. @:
    34. #将.c文件编译生成.o文件
    35. $(objsrc):%.o:%.c FORCE
    36. -mkdir -p $(OUTPUT)$(dir $@)
    37. $(CC) -c $(CFLAGS) $< -o $(OUTPUT)$@
    38. #尝试生成build-in.o
    39. $(OUTPUT)$(src)build-in.o:$(addprefix $(OUTPUT),$(objsrc))
    40. $(LD) -EL -r -o $@ $^
    41. $(OUTPUT):
    42. -mkdir $(OUTPUT)
    43. FORCE:
    44. .PHONY:FORCE

    之后便可以实现make menuconfig 来控制编译那个文件,make 生成.bin文件的功能。这个make只能实现我想要的功能,也许有更好的实现方法,如果大家有更好的实现方法也可以交流和共享。谢谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/623918
推荐阅读
相关标签
  

闽ICP备14008679号