Makefile百科简介:一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
在进行工程管理时往因为编译工具或源文件类型,数目多少等等的原因,需得重复编写代码
那如何生成一个通用的Makefile呢? 如下例:
# CORTEX-A9 PERI DRIVER CODE
# VERSION 2.0
# ATHUOR Je_Cortex
# MODIFY DATE
# 2014.05.28 Makefile
CROSS_COMPILE = arm-none-eabi-
#定义一个变量,CROSS_COMPILE ,变量值arm-none-eabi-
#交叉编译工具的前缀
NAME =led
#定义一个变量NAME,变量值 led
#生成的文件名称
#================================================================#
CFLAGS += -g -O0 -mabi=apcs-gnu -mfpu=neon -mfloat-abi=softfp -fno-builtin \
-nostdinc -I ./common/include #告诉编译器不链接gnu 内建库,链接当前路径下的./common/include
# += 变量的原值后面追加
# CFLAGS 是makefile的默认变量,作为gcc的选项
# 对变量CFLAGS,追加值
# -E -S -c -o -g -D -i -I -l -L
LD = $(CROSS_COMPILE)ld
#定义一个变量 LD =arm-none-eabi-ld
CC = $(CROSS_COMPILE)gcc
#定义一个变量 CC =arm-none-eabi-gcc
OBJCOPY = $(CROSS_COMPILE)objcopy
#定义一个变量 OBJCOPY =arm-none-eabi-objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
##定义一个变量 OBJDUMP =arm-none-eabi-objdump
#================================================================#
OBJSss := $(wildcard start/*.S) $(wildcard common/src/*.S) $(wildcard *.S)\
$(wildcard start/*.c) $(wildcard common/src/*.c) \
$(wildcard usr/*.c) $(wildcard *.c)
#$(wildcard start/*.S) : 按指定内容(start目录下,所有以.S结尾的指令)进行文件搜索,返回搜到的文件名
OBJSs := $(patsubst %.S,%.o,$(OBJSss))
#定义变量OBJSs,变量的值为:start.o _udivsi3.o _umodsi3.o uart.c printf.c led.c
#$(patsubst %.S,%.o,$(OBJSss)) 按照指定的规则(对变量OBJSss的值.S 替换成.o)对字符内容进行替换
OBJS := $(patsubst %.c,%.o,$(OBJSs))
#定义变量OBJS,变量的值为:start.o _udivsi3.o _umodsi3.o uart.o printf.o led.o
#================================================================#
%.o: %.S
$(CC) $(CFLAGS) -c -o $@ $<
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
all:clean $(OBJS)
$(LD) $(OBJS) -T map.lds -o $(NAME).elf
$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin
$(OBJDUMP) -D $(NAME).elf > $(NAME).dis
#all:clean $(OBJS) 清除所有.o文件,防止修改.h后不编译
#$(LD) $(OBJS) -T map.lds -o $(NAME).elf
# arm-none-eabi-ld start.o _udivsi3.o _umodsi3.o uart.o printf.o led.o -T map.lds -o led.elf
#根据链接脚本,链接生成elf
#$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin
# arm-none-eabi-objcopy -O binary led.elf led.bin 二进制格式转换
#$(OBJDUMP) -D $(NAME).elf > $(NAME).dis
# arm-none-eabi-objdump -D led.elf > led.dis
#=================================================================#
clean:
rm -rf $(OBJS) *.elf *.bin *.dis *.o
#=====================================