Makefile初学者,看了点Makefile的资料,想着写个通用的Makefile,于是写了三天。。。
可能还有很多错误,
测试通过的有gcc的.s和.c,以及嵌入式开发arm-linux-gcc的.S和.c,
权当参考吧,当然,如果有发现错误帮我指正更好啦(也是贴出来的原因^_^)
#文件名:Makefile
#创建者:冷月
#创建日期:2010.12.4
#功能描述:通用Makefile, 可处理*.c *.s *.S,
# 主要用于嵌入式开发,否则应指明编译器,如 用法1 和 用法2
# 用法1:make CC=gcc 指定编译器为gcc,默认用arm-linux-gcc
# 用法2:make CC=gcc t=hello 编译器用gcc,生成hello可执行文件
# 用法3:make 生成用于嵌入式的 bin 文件
# 用法4:make t=hello 生成用于嵌入式的 hello.bin 文件
# 用法5:make addr=0x30000000 用于嵌入式的bin文件,指定代码段从0x30000000开始
# 用法6:make clean 清除编译生成的文件
# 用法7:make clean t=hello 清除编译生成的文件
#最终生成的目标target, 如:make t=hello,默认生成example
t := example
#代码段地址
addr := 0x00000000
#c编译器
CC := arm-linux-gcc
#连接器
LD := $(subst gcc,ld, $(CC))
#搜索目录
srcDir :=.
#所有源文件, *.c *.s *.S
src := $(foreach dir, $(srcDir), $(wildcard $(dir)/*.c $(dir)/*.s $(dir)/*.S))
#.c源文件
src_c := $(filter %.c, $(src))
#所有.d文件(保存头文件依赖关系)
src_d := $(src:.c=.d)
src_d := $(src_d:.s=.d)
src_d := $(src_d:.S=.d)
#所有目标文件
objs := $(src_d:.d=.o)
#缺省项
all: $(t)
#链接
$(t): $(objs)
ifeq ($(CC),gcc)
ifeq ($(src_c),)
#链接汇编目标文件
$(LD) -o $@ $^
else
#链接c目标文件
$(CC) -o $@ $^
endif
else
#链接嵌入式目标文件并生成bin文件
@$(LD) -Ttext $(addr) $^ -o $(t)
@arm-linux-objcopy -O binary -S $(t) $(t).bin
@echo " bin文件代码段从 $(addr) 开始"
endif
#清除
clean:
@rm -f $(t) $(objs) $(src_d) $(t).bin
@echo "清除成功..."
#声明伪目标
.PHONY: clean
.PHONY: bin
#自动处理头文件的依赖关系,
#依赖关系放在生成的.d文件中,
#并编译生成目标文件
include $(src_d)
%.d: %.c
@set -e; rm -f $@; \
$(CC) -MM $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
%.d: %.s
@set -e; rm -f $@; \
$(CC) -MM $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
%.d: %.S
@set -e; rm -f $@; \
$(CC) -MM $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
用户281310 2010-12-17 15:40