手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

实验平台上Makefile详细的解释

[日期:2014-01-06] 来源:Linux社区  作者:farsight [字体: ]

作者:甘老师,华清远见嵌入式学院讲师。
# CORTEX-A8 PERI DRIVER CODE
# VERSION 2.0
# ATHUOR www.linuxidc.com
# MODIFY DATE
#2013.03.28  Makefile     
/***(下面的解释将用这个的形式进行标注)

写好的源文件,要编译成二进制文件.需要指定工具链的,这里指定我们的工具链是arm-none-eabi-,(arm体系结构,none厂商,eabi是编译环境,亦是arm-abi的编译环境),这里面的eabi的内容很多,可以理解成一个源文件是以何种方式生成可执行的二进制文件.最后NAME指定是这个工程的工程名

*/     
CROSS_COMPILE=arm-none-eabi-
NAME=rtc     
#==============================================================================================================#
/***为了使我们的Makefile简洁,需要将一些编译选项统统定义在CFLAGS中
-g 表示为了调试gdb使用
-O0 表示优化级别为0,就是不进行优化
-mabi=apcs-gnu  使用gnu的apcs(ARM PROCEDUCE CALL STANDARD),它是指定用何种方式来实现函数的调用

-mfpu=neno 硬件浮点单元
-fno-builtin 表示不要使用编译器中默认的一些简单的内建函数,这里是因为我们重写了printf(使用了puts putc等等,将输出指定到串口上,输出到终端上),如果不使用这个编译选项,printf的输出结构将输出到tty上,也在我们的开发板上并没有这么一个用法。
-nostdinc  不要在标准系统目录中寻找头文件.只搜索`-I'选项指定的目录(以及当前目录,如果合适).

指定目标连接器
LD= $(CROSS_COMPILE)ld
指定目标编译器
CC= $(CROSS_COMPILE)gcc
目标复制命令生成二进制文件
OBJCOPY = $(CROSS_COMPILE)objcopy
目标倾倒命令(有点望文生义了)用来创建一个反汇编代码来检查生成的目标文件
OBJDUMP = $(CROSS_COMPILE)objdump
*/     
CFLAGS += -g  -O0  -mabi=apcs-gnu -mfpu=neon -mfloat-abi=softfp  -fno-builtin \
-nostdinc  -I ./common/include
LD= $(CROSS_COMPILE)ld
CC= $(CROSS_COMPILE)gcc
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump     
#==============================================================================================================#
/**
1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符

注意下面的操作仅仅是一个字符串的通配、替换工作
OBJSss :wildcard把 指定工程目录下的根目录/ 、 start/ 和 common/src/ 下的所有后缀是c的文件,和S文件全部展开。也就是OBJSss变量此时为全部相应的.c 和.S文件了(这里大家注意了这里用的是大S,大S好看一些吗?不是那是.S是支持gnu的汇编语法的文件,.s是只支持标准汇编的语法的文件)
好下面就是字符串的替换了工作了
OBJSs:将OBJSss中的.S文件带路径的替换成 .o文件,此时这个时候,OBJSs中只用.c和.o 了。
OBJS将OBJSs中还没有替换掉的.c文件也替换成.o文件。
现在再明白了吧,可是还没有完,做这些工作累死个人,就是仅仅的做字符串的替换?
*/     
OBJSss := $(wildcard start/*.S) $(wildcard start/*.c)\  $(wildcard common/src/*.c) \
$(wildcard common/src/*.S) $(wildcard *.c)\ $(wildcard *.S)
OBJSs  := $(patsubst %.S,%.o,$(OBJSss))
OBJS    := $(patsubst %.c,%.o,$(OBJSs))     
#=============================================================================================================#
/***上面全是做一些准备工作,下面才到了编译的时候了,让我们继续
all:是默认的终极目标,当我们执行make的时候,他就会去执行make all,当在整个Makefile中没有all的时候,一个目标标号就成了all(终极目标)
当执行all的时候,首先将clean,然后需要依赖文件$(OBJS),这里比如a.o
b.o c.o d.o,而在工程目录下,有a.c b.c c.s d.s ,然后这个时候当然是需要a.o了,发现在目标文件中去寻找a.S ,发现a.s不存在,发现存在a.c,便使用$(CC) $(CFLAGS) -c -o  a.o a.c  来编译来生成a.o了
*/     
%.o: %.S
$(CC) $(CFLAGS) -c -o  $@ $<
%.o: %.c
$(CC) $(CFLAGS) -c -o  $@ $<
all:clean  $(OBJS)   

相关阅读

u-boot Makefile完全解读 http://www.linuxidc.com/Linux/2013-04/83529.htm

U-Boot中的date命令 http://www.linuxidc.com/Linux/2013-07/87614.htm

U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

U-Boot下的两个重要数据:bd_t和gd_t http://www.linuxidc.com/Linux/2013-05/83993.htm

U-Boot中的version命令 http://www.linuxidc.com/Linux/2013-05/83990.htm

U-Boot中的usb命令 http://www.linuxidc.com/Linux/2013-05/83991.htm 

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款