原创 通用Makefile

2010-12-6 17:38 2753 7 8 分类: MCU/ 嵌入式

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 $@.$$$$


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户281310 2010-12-17 15:40

顶一下,楼主写的不错啊
相关推荐阅读
用户230358 2010-11-28 09:30
RFID MFRC522
单片机:STC12C5A60S2读卡器:MFRC522非接触IC卡:M1卡keil版本:V4程序是看了网上找的,做了些整理,其中有?号的,是不理解为什么那么设置射频做了好多天,还是有很多不明白,希望对...
用户230358 2010-09-16 23:33
eclipse代码自动提示功能设置
默认是输入"."后出现自动提示,用于类成员的自动提示,可是有时候我们希望它能在我们输入类的首字母后就出现自动提示,可以节省大量的输入时间(虽然按alt + /会出现提示,但还是要多按一次按键,太麻烦了...
用户230358 2010-09-16 23:32
EmEditor配置JAVA
1、选择“工具->外部工具->自定义工具”菜单;2、在“外部工具”对话框中点击“新建”按钮,并进行如下设置:   标题:JAVAC   命令:F:\JDK\bin\javac.exe   ...
用户230358 2010-09-05 10:32
独立按键扫描
定时器1每20ms扫描一次按键,可处理短按、长按 key.c/* * 文 件 名:key.c * 芯    片:STC12C5A60S2 * 晶    振:12MHz * 创 建 者:冷月 * 创建日...
用户230358 2010-09-05 10:23
PWM实现蜂呜器唱歌
PWM用定时器0作时钟源可改变频率,用于输出音符频率,占空比输出音符音长 电路图: BUZZ.C /* * 文 件 名:BUZZ.C * 芯    片:STC12C5A60S2 * 晶    振:12...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条