uboot的Makefile分析之顶层config.mk

顶层目录下的config.mk文件 主要完成如下功能的配置:
1、确定生成可执行文件过程中需要的各种工具,如编译器(arm-linux-gcc)、连接器(arm-linux-ld)、反 汇编 器(arm-linux-objdump)等
2、确定CPU、板相关的配置文件,存在于各个目录下的config.mk
3、确定编译、链接、转换等过程的操作选项

4、根据步骤3确定的编译连接选项生成需要的文件

config.mk完整内容及必要注释如下
:config.mk文件注释符改为/* 注释内容 */

001. ifneq ($(OBJTREE),$(SRCTREE))
002. ifeq ($(CURDIR),$(SRCTREE))
003. dir :=
004. else
005. dir := $(subst $(SRCTREE)/,,$(CURDIR))
006. endif
007.  
008. obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)
009. src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)
010.  
011. $(shell mkdir -p $(obj))
012. else
013. obj :=
014. src :=
015. endif
016. /* obj = 空,src = 空
017. * dir = 空
018. */
019.  
020. /* clean the slate ... */
021. PLATFORM_RELFLAGS =
022. PLATFORM_CPPFLAGS =
023. PLATFORM_LDFLAGS =
024.  
025. /* HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
026. * -Wall: 打印出编译时所有的错误或警告信息
027. * -Wstrict-prototypes: 编译时,若产生与数据类型不相符的问题,打印出提示或警告信息。当在不同体系结构间移植时,加上该选项可避免很多错误
028. * -O: 编译代码时的优化等级,共有五种:-O0、-O1、-O2、-O3和-Os
029. * -fomit-frame-pointer: 对于不需要帧指针的函数,不要在寄存器中保存帧指针
030. * 代码优化时打开-fomit-frame-pointer,函数调用时不保存frame指针,也就不能用backtrace()来查看函数栈调用
031. * backtrace()系列函数见[http://blog.csdn.net/u013686019/article/details/42128771](Linux中backtrace()系列函数的应用实例)
032. */
033. HOSTCFLAGS  = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer \
034. $(HOSTCPPFLAGS)
035. /* HOSTSTRIP = strip
036. * strip能清除执行文件中不必要的标示符及调试信息,可减小文件大小而不影响正常使用,、
037. * 与压缩不同的是,文件一旦strip后就不能恢复原样
038. * strip后的文件不包含调试信息
039. */
040. HOSTSTRIP   = strip
041.  
042. /*
043. * Mac OS X / Darwin's C preprocessor is Apple specific.  It
044. * generates numerous errors and warnings.  We want to bypass it
045. * and use GNU C's cpp.  To do this we pass the -traditional-cpp
046. * option to the compiler.  Note that the -traditional-cpp flag
047. * DOES NOT have the same semantics as GNU C's flag, all it does
048. * is invoke the GNU preprocessor in stock ANSI/ISO C fashion.
049. *
050. * Apple's linker is similar, thanks to the new 2 stage linking
051. * multiple symbol definitions are treated as errors, hence the
052. * -multiply_defined suppress option to turn off this error.
053. */
054. ifeq ($(HOSTOS),darwin)
055. ......
056. else
057. HOSTCC      = gcc
058. endif
059.  
060. ifeq ($(HOSTOS),cygwin)
061. ......
062. endif
063.  
064. /* We build some files with extra pedantic flags to try to minimize things
065. * that won't build on some weird host compiler -- though there are lots of
066. * exceptions for files that aren't complaint.
067. */
068. HOSTCFLAGS_NOPED = $(filter-out -pedantic,$(HOSTCFLAGS))
069. /* -pedantic: 当GCC在编译不符合ANSI/ISO C语言标准的源代码时,如果在编译指令中加上了-pedantic选项
070. * 那么源程序中使用了扩展语法的地方将产生相应的警告信息
071. */
072. HOSTCFLAGS  += -pedantic
073.  
074. #########################################################################
075. /* Option checker (courtesy linux kernel) to ensure
076. * only supported compiler options are used
077. * cc-option变量保存了一个测试编译选项的命令,其他地方会经常用call函数来调用它,测试编译选项
078. * if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1;then
079. echo "$(1)";
080. else
081. echo "$(2)";
082. fi;
083. * -S:编译后立即结束,不进行<a href="http://www.it165.net/pro/yysam/" target="_blank" class="keylink">汇编</a>等操作
084. * -o /dev/null : 生成文件到/dev/null,即不生成任何编译结果,要编译的文件也为空
085. * -xc: 指定按c语言编译
086. * 用此语句如:call cc-option,-a,-b 则如果支持-a选项则返回-a否则返回-b
087. */
088. cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
089. > /dev/null 2>&1; then echo "$(1)"else echo "$(2)"; fi ;)
090.  
091. /* Include the make variables (CC, etc...) */
092. AS  = $(CROSS_COMPILE)as    /* 汇编工具 */
093. LD  = $(CROSS_COMPILE)ld    /* 链接工具 */
094. CC  = $(CROSS_COMPILE)gcc   /* 编译工具 */
095. CPP = $(CC) -E              /* 预处理   */
096. AR  = $(CROSS_COMPILE)ar    /* 归档工具 */
097. NM  = $(CROSS_COMPILE)nm    /* 列出object文件中的符号 */
098. LDR = $(CROSS_COMPILE)ldr
099. STRIP   = $(CROSS_COMPILE)strip
100. OBJCOPY = $(CROSS_COMPILE)objcopy /* 转换可执行文件格式工具 */
101. OBJDUMP = $(CROSS_COMPILE)objdump /* 反汇编工具 */
102. RANLIB  = $(CROSS_COMPILE)RANLIB  /* 产生归档文件索引 */
103.  
104. #########################################################################
105. /* Load generated board configuration */
106. /* sinclude:
107. * 在Makefile中可使用"sinclude"代替"include",用来忽略由于包含文件不存在或者无法创建时的错误
108. */
109. sinclude $(OBJTREE)/include/autoconf.mk
110.  
111. /* Some architecture config.mk files need to know what CPUDIR is set to,
112. * so calculate CPUDIR before including ARCH/SOC/CPU config.mk files.
113. * Check if arch/$ARCH/cpu/$CPU exists, otherwise assume arch/$ARCH/cpu contains
114. * CPU-specific code.
115. */
116. CPUDIR=arch/$(ARCH)/cpu/$(CPU)
117. ifneq ($(SRCTREE)/$(CPUDIR),$(wildcard $(SRCTREE)/$(CPUDIR)))
118. CPUDIR=arch/$(ARCH)/cpu
119. endif
120. /* CPUDIR=arch/arm/cpu/arm920t */
121.  
122. /* include architecture dependend rules: arch/arm/config.mk */
123. sinclude $(TOPDIR)/arch/$(ARCH)/config.mk
124. /* include  CPU specific rules: arch/arm/cpu/arm920t/config.mk */
125. sinclude $(TOPDIR)/$(CPUDIR)/config.mk
126. ifdef   SOC
127. /* include  SoC specific rules: arch/arm/cpu/arm920t/s3c24x0/config.mk */
128. sinclude $(TOPDIR)/$(CPUDIR)/$(SOC)/config.mk
129. endif
130. ifdef   VENDOR
131. BOARDDIR = $(VENDOR)/$(BOARD)
132. else
133. BOARDDIR = $(BOARD)
134. endif
135. /* BOARDDIR = samsung/smdk2410 */
136.  
137. ifdef   BOARD
138. /* include board specific rules: board/samsung/smdk2410/config.mk */
139. sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk
140. endif
141.  
142. #########################################################################
143. ifneq (,$(findstring s,$(MAKEFLAGS)))
144. ARFLAGS = cr
145. else
146. ARFLAGS = crv
147. endif
148. RELFLAGS= $(PLATFORM_RELFLAGS)
149. DBGFLAGS= -g # -DDEBUG
150. OPTFLAGS= -Os #-fomit-frame-pointer
151.  
152. /* LDSCRIPT = arch/arm/cpu/arm920t/u-boot.lds,在在文件arch/arm/config.mk中赋值 */
153. ifndef LDSCRIPT
154. #LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
155. ifeq ($(CONFIG_NAND_U_BOOT),y)
156. LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
157. else
158. LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
159. endif
160. endif
161. /* 段之间的空隙用0xff填充 */
162. OBJCFLAGS += --gap-fill=0xff
163.  
164. gccincdir := $(shell $(CC) -print-file-name=include)
165.  
166. /* CPPFLAGS变量综合了DBGFLAGS,OPTFLAGS,RELFLAGS编译选项,并定义了__KERBEL__
167. * -D: 设置宏定义__KERNEL__
168. */
169. CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)     \
170. -D__KERNEL__
171. ifneq ($(TEXT_BASE),)
172. CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
173. endif
174.  
175. ifneq ($(RESET_VECTOR_ADDRESS),)
176. CPPFLAGS += -DRESET_VECTOR_ADDRESS=$(RESET_VECTOR_ADDRESS)
177. endif
178.  
179. ifneq ($(OBJTREE),$(SRCTREE))
180. CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/include
181. endif
182.  
183. CPPFLAGS += -I$(TOPDIR)/include
184. CPPFLAGS += -fno-builtin -ffreestanding -nostdinc   \
185. -isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)
186.  
187. ifdef BUILD_TAG
188. CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes \
189. -DBUILD_TAG='"$(BUILD_TAG)"'
190. else
191. CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes
192. endif
193.  
194. CFLAGS += $(call cc-option,-fno-stack-protector)
195.  
196. /* $(CPPFLAGS) sets -g, which causes gcc to pass a suitable -g<format> */
197. /* option to the assembler. */
198. AFLAGS_DEBUG :=
199.  
200. AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)
201.  
202. LDFLAGS += -Bstatic -T $(obj)u-boot.lds $(PLATFORM_LDFLAGS)
203. ifneq ($(TEXT_BASE),)
204. LDFLAGS += -Ttext $(TEXT_BASE)
205. endif
206. /* LDFLAGS = -Bstatic -T u-boot.lds -Ttext 0x33F80000 */
207. /* CFLAGS = -g  -Os   -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ -DTEXT_BASE=0x33F80000 -I/u-boot-2010.06/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/arm/4.2.2-eabi/usr/bin-ccache/../lib/gcc/arm-unknown-linux-gnueabi/4.2.2/include -pipe  -DCONFIG_ARM -D__ARM__ -marm  -mabi=aapcs-linux -mno-thumb-interwork -march=armv4 -Wall -Wstrict-prototypes -fno-stack-protector */
208.  
209. /* Location of a usable BFD library, where we define "usable" as
210. * "built for ${HOST}, supports ${TARGET}".  Sensible values are
211. * - When cross-compiling: the root of the cross-environment
212. * - Linux/ppc (native): /usr
213. * - NetBSD/ppc (native): you lose ... (must extract these from the
214. *   binutils build directory, plus the native and U-Boot include
215. *   files don't like each other)
216. *
217. * So far, this is used only by tools/gdb/Makefile.
218. */
219. ifeq ($(HOSTOS),darwin)
220. BFD_ROOT_DIR =      /usr/local/tools
221. else
222. ifeq ($(HOSTARCH),$(ARCH))
223. /* native */
224. BFD_ROOT_DIR =      /usr
225. else
226. /* BFD_ROOT_DIR =       /LinuxPPC/CDK       # Linux/i386 */
227. /* BFD_ROOT_DIR =       /usr/pkg/cross      # NetBSD/i386 */
228. BFD_ROOT_DIR =      /opt/powerpc
229. endif
230. endif
231.  
232. #########################################################################
233. export  HOSTCC HOSTCFLAGS HO<a href="http://www.it165.net/pro/" target="_blank"class="keylink">STL</a>DFLAGS PEDCFLAGS HOSTSTRIP CROSS_COMPILE \
234. AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP MAKE
235. export  TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS
236.  
237. #########################################################################
238. /* 下面几行规定了各种文件的编译时用到的编译选项 */
239. /* Allow boards to use custom optimize flags on a per dir/file basis */
240. BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%))
241. /* BCURDIR = 顶层目录 */
242. $(obj)%.s:  %.S
243. $(CPP) $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) \
244. -o $@ $<
245. $(obj)%.o:  %.S
246. $(CC)  $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) \
247. -o $@ $< -c
248. $(obj)%.o:  %.c
249. $(CC)  $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) \
250. -o $@ $< -c
251. $(obj)%.i:  %.c
252. $(CPP) $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) \
253. -o $@ $< -c
254. $(obj)%.s:  %.c
255. $(CC)  $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) \
256. -o $@ $< -c -S
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值