赞
踩
项目硬件验证环境: STM32F205
项目码云git地址: https://gitee.com/liwandong/ShareRTOS
在进行linux驱动开发时经常会使用到make menuconfig 这中基于文本的工程管理方法来决定是否编译某一个文件,想参考这种方式进行自己的工程的管理,使用这个博客记录一下这个功能的实现过程,先看一下总体的效果图如下:
- #选择编译工具链
- CROSS_COMPILE = arm-none-eabi-
- CC := $(CROSS_COMPILE)gcc
- CXX := $(CROSS_COMPILE)g++
- AS := $(CROSS_COMPILE)as
- AR := $(CROSS_COMPILE)ar
- LD := $(CROSS_COMPILE)ld
- OBJCOPY :=$(CROSS_COMPILE)objcopy
- OBJDUMP :=$(CROSS_COMPILE)objdump
- SIZE :=$(CROSS_COMPILE)size
-
- #编译输出的路径
- OUTPUT :=output/
-
- #查找当前目录下所有的inc文件夹
- allincdir := $(shell find ./ -name inc -type d)
-
- #编译的CFLAGS 选项中添加头文件路径
- CFLAGS += $(addprefix -I,$(allincdir))
- 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
-
- #设置为环境变量,方便在makefile.build中使用
- export CC CXX AS AR LD OBJCOPY OBJDUMP SIZE CFLAGS OUTPUT #BUILDOBJYFILE
-
- #编译项目的目标名称
- PROJECTNAME = sharertos
-
- #需要编译的文件夹名称,即项目下需要编译的文件夹路径名
- PROJECTSRCDIR = mcudevice/
- PROJECTSRCDIR += user/
-
- #链接脚本路径
- LDDIR = mcudevice/stm32f205/
-
- #链接选项
- LDFLAGS += -I ./include/generated
- LDFLAGS += -nostartfiles -Wl,--gc-sections,-Map=$(OUTPUT)$(PROJECTNAME).map,-cref -mcpu=cortex-m3 -march=armv7-m -T$(LDDIR)stm32f2xxx.ld
-
- #用于生成bin文件的依赖文件的名称,例如user/build-in.o
- allbuildfile = $(addsuffix build-in.o,$(addprefix $(OUTPUT),$(PROJECTSRCDIR)))
-
- #目标文件
- all:$(OUTPUT)$(PROJECTNAME).bin
-
- #生成bin文件
- $(OUTPUT)$(PROJECTNAME).bin:$(OUTPUT)$(PROJECTNAME).elf
- $(OBJCOPY) -O binary $^ $@
-
- #生成elf文件
- $(OUTPUT)$(PROJECTNAME).elf:$(allbuildfile)
- $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
-
- #调用makefile.build 文件生成对应的build-in文件,这个地方应该可以用foreach的函数去实现,没有验证
- #目前要用的话直接像后加3 4 等这样的
- $(allbuildfile):FORCE
- make -f Makefile.build obj=$(word 1,$(PROJECTSRCDIR))
- make -f Makefile.build obj=$(word 2,$(PROJECTSRCDIR))
-
- #清除文件
- clean:
- -rm -rf $(OUTPUT)
-
- #实现menuconfig
- menuconfig:Kconfig
- ./tools/mconf $<
- ./tools/conf -s --syncconfig $<
- rm -rf $(OUTPUT)
-
- #下载到mcu中
- download:
- echo "si 1" >> jlinkcmd #选择swd端口
- echo "speed 4000" >>jlinkcmd #设置速度
- echo "device STM32F205RE" >> jlinkcmd #选择mcu型号
- echo "r" >> jlinkcmd #重新复位
- echo "h" >> jlinkcmd #挂起目标
- #echo "erase" >> jlinkcmd #全部擦除flash
- echo "loadfile $(OUTPUT)/$(PROJECTNAME).bin 0x08000000" >> jlinkcmd #烧录
- echo "g" >> jlinkcmd #运行
- echo "qc" >> jlinkcmd #退出
- JLinkExe -CommanderScript jlinkcmd
- rm jlinkcmd
-
- FORCE:
- .PHONY:FORCE
Makefile.build 文件的说明如下:
- #接收传入的参数
- src :=$(obj)
-
- PHONY := __build
- __build:
-
- #定义obj-y
- obj-y :=
-
- include ./include/config/auto.conf
-
-
- #获取传入的文件夹下的makefile
- allmakefile := $(shell find $(src) -name Makefile)
-
- #包含所有的makefile
- include $(allmakefile)
-
- #获取obj-y 文件
- buildobjyfile := $(obj-y)
-
- #挑出目录
- buildobjydir :=$(filter %/,$(buildobjyfile))
-
-
- #设置文件obj-y目录顺序
-
- #判断文件夹的个数来觉得目录顺序
- ifeq ($(words $(buildobjydir)),1)
- builddir := $(join $(src),$(buildobjydir))
- else
- firstdir := $(word 1, $(buildobjydir))
- seconddir := $(word 2, $(buildobjydir))
- ifeq ($(firstdir),src/)
- builddir := $(join $(src)$(seconddir),$(firstdir))
- else
- builddir := $(join $(src)$(firstdir),$(seconddir))
- endif
- endif
-
-
- #给obj-y的文件名加上前缀
- objsrc :=$(addprefix $(builddir),$(filter-out %/,$(buildobjyfile)))
-
-
- #生成build-in.o文件
- __build:$(objsrc) $(OUTPUT)$(src)build-in.o
- @:
-
- #将.c文件编译生成.o文件
- $(objsrc):%.o:%.c FORCE
- -mkdir -p $(OUTPUT)$(dir $@)
- $(CC) -c $(CFLAGS) $< -o $(OUTPUT)$@
-
-
- #尝试生成build-in.o
- $(OUTPUT)$(src)build-in.o:$(addprefix $(OUTPUT),$(objsrc))
- $(LD) -EL -r -o $@ $^
-
-
- $(OUTPUT):
- -mkdir $(OUTPUT)
-
- FORCE:
- .PHONY:FORCE
之后便可以实现make menuconfig 来控制编译那个文件,make 生成.bin文件的功能。这个make只能实现我想要的功能,也许有更好的实现方法,如果大家有更好的实现方法也可以交流和共享。谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。