2.7 编译选项---config.mk

  代码 163 164 行

  1. # load other configuration
  2. include $(TOPDIR)/config.mk

  此段就是包含顶层目录下的 config.mk,在顶层的  config.mk 中包含了编译选项。

2.7.1 topdir/config.mk 分析

  代码 26 到 45行:

  1. ifneq ($(OBJTREE),$(SRCTREE))
  2. ifeq ($(CURDIR),$(SRCTREE))
  3. dir :=
  4. else
  5. dir := $(subst $(SRCTREE)/,,$(CURDIR))
  6. endif
  7.  
  8. obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)
  9. src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)
  10.  
  11. $(shell mkdir -p $(obj))
  12. else
  13. obj :=
  14. src :=
  15. endif
  16.  
  17. # clean the slate ...
  18. PLATFORM_RELFLAGS =
  19. PLATFORM_CPPFLAGS =
  20. PLATFORM_LDFLAGS =
  1. 代码首先判断 目标存放目录是否不等于源码目录,若不等于,则执行分支语句,等于 则不执行。
  2. 执行分支语句,判断当前目录是否等于源码目录,若等于则将 dir 置空,否则,把$(CURDIR)中的$(SRCTREE)/替换称空,然后赋给dir
  3. 执行完之后,如果 dir 不为空,则把$(OBJTREE)/$(dir)/赋给obj,否则把直接把$(OBJTREE)/赋给obj
  4. 如果src不为空,则把$(SRCTREE)/$(dir)/赋给src,否则把$(SRCTREE)/赋给src
  5. 通过一个shell 函数创建 obj 路径,obj 的路径为 $(OBJTREE)/$(dir)/ 或 $(OBJTREE)/
  6. 若是目标目录和源码目录相同,则 obj 和 src 都为空
  7. 最后清除三个 编译选项 标志

  PLATFORM_RELFLAGS、PLATFORM_CPPFLAGS 和 PLATFORM_LDFLAGS 这三个变量被置空,之后会被赋值上编译参数,接下来的 54 到 92 行都是给三个编译选项赋值参数:

  63 到 70行,是架构为ARM的赋值,但里面的 CROSS_COMPILE 不能匹配,不会执行

  1. ifeq ($(ARCH),arm)
  2. ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
  3. PLATFORM_CPPFLAGS+= -D__ARM__
  4. endif
  5. ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
  6. PLATFORM_CPPFLAGS+= -D__ARM__
  7. endif
  8. endif

  76 到 92 行,会根据前面#include/config.mk 导出的环境变量参数来包含相应的 config.mk 文件

  1. ifdef ARCH
  2. sinclude $(TOPDIR)/$(ARCH)_config.mk # include architecture dependend rules
  3. endif
  4. ifdef CPU
  5. sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules
  6. endif
  7. ifdef SOC
  8. sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rules
  9. endif
  10. ifdef VENDOR
  11. BOARDDIR = $(VENDOR)/$(BOARD)
  12. else
  13. BOARDDIR = $(BOARD)
  14. endif
  15. ifdef BOARD
  16. sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
  17. endif

  根据前面的参数进行展开即可

  96 到 106 行,是给几个参数赋值,HOSTCC 赋值为 gcc,HOSTCFLAGS 和 HOSTSTRIP

  CONFIG_SHELL,涉及到  shell 语法和命令

  • if 语句的 -x 参数为测试文件对当前用户是都可执行
  • 再看一下 shell  的特殊变量:
    • $0      当前脚本的文件名
    • $n      传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
    • $#      传递给脚本或函数的参数个数。
    • $*      传递给脚本或函数的所有参数。
    • $@      传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
    • $?      上个命令的退出状态,或函数的返回值。一般情况下,大部分命令执行成功会返回 0,失败返回 1。
    • $$      当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
    • $* 和 $@ 的区别 : 
      1. $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
      2. 但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
  1. CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
  2. else if [ -x /bin/bash ]; then echo /bin/bash; \
  3. else echo sh; fi ; fi)
  4.  
  5. ifeq ($(HOSTOS)-$(HOSTARCH),darwin-ppc)
  6. HOSTCC = cc
  7. else
  8. HOSTCC = gcc
  9. endif
  10. HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
  11. HOSTSTRIP = strip

  113 到 114行, 这是一个选项检查器,以确保我们只使用所支持的编译器,际上使用了一个shell函数,本函数使用了if-then语句,检测条件分别为"-S, -o, -xc",也用到了重定向

  1. cc-option = $(shell if $(CC) $(CFLAGS) $() -S -o /dev/null -xc /dev/null \
  2. > /dev/null >&; then echo "$(1)"; else echo "$(2)"; fi ;)

  119 到 166 行,定义了交叉工具编译连,指定了交叉工具编译连的参数

  1. AS = $(CROSS_COMPILE)as
  2. LD = $(CROSS_COMPILE)ld
  3. CC = $(CROSS_COMPILE)gcc
  4. CPP = $(CC) -E
  5. AR = $(CROSS_COMPILE)ar
  6. NM = $(CROSS_COMPILE)nm
  7. STRIP = $(CROSS_COMPILE)strip
  8. OBJCOPY = $(CROSS_COMPILE)objcopy
  9. OBJDUMP = $(CROSS_COMPILE)objdump
  10. RANLIB = $(CROSS_COMPILE)RANLIB
  11.  
  12. ifneq (,$(findstring s,$(MAKEFLAGS)))
  13. ARFLAGS = cr
  14. else
  15. ARFLAGS = crv
  16. endif
  17. RELFLAGS= $(PLATFORM_RELFLAGS)
  18. DBGFLAGS= -g # -DDEBUG
  19. OPTFLAGS= -Os #-fomit-frame-pointer
  20. ifndef LDSCRIPT
  21. #LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
  22. ifeq ($(CONFIG_NAND_U_BOOT),y)
  23. LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
  24. else
  25. LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
  26. endif
  27. endif
  28. OBJCFLAGS += --gap-fill=0xff
  29.  
  30. gccincdir := $(shell $(CC) -print-file-name=include)
  31.  
  32. CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS) \
  33. -D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE) \
  34.  
  35. ifneq ($(OBJTREE),$(SRCTREE))
  36. CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/include
  37. endif
  38.  
  39. CPPFLAGS += -I$(TOPDIR)/include
  40. CPPFLAGS += -fno-builtin -ffreestanding -nostdinc \
  41. -isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)
  42.  
  43. ifdef BUILD_TAG
  44. CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes \
  45. -DBUILD_TAG='"$(BUILD_TAG)"'
  46. else
  47. CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes
  48. endif
  • #如果函数$(findstring s,$(MAKEFLAGS))不为空,也就是说能从$(MAKEFLAGS)中找到字符s,则定义AR选项为cr,否则为 crv
  • RELFLAGS、DBGFLAGS 和 OPTFLAGS 赋值
  • 如果没有定义链接脚本(LDSCRIPT),则指定链接脚本
  • 下面的都是编译的一些标志了,不具体分析了

  227 到 244 行,则是指定编译依赖

  1. ifndef REMOTE_BUILD
  2.  
  3. %.s: %.S
  4. $(CPP) $(AFLAGS) -o $@ $<
  5. %.o: %.S
  6. $(CC) $(AFLAGS) -c -o $@ $<
  7. %.o: %.c
  8. $(CC) $(CFLAGS) -c -o $@ $<
  9.  
  10. else
  11.  
  12. $(obj)%.s: %.S
  13. $(CPP) $(AFLAGS) -o $@ $<
  14. $(obj)%.o: %.S
  15. $(CC) $(AFLAGS) -c -o $@ $<
  16. $(obj)%.o: %.c
  17. $(CC) $(CFLAGS) -c -o $@ $<
  18. endif

  例如

  %.s: %.S

    $(CPP) $(AFLAGS) -o $@ $<

  %.s 依赖于 %.S

    -o  后面的为 $@ 为 %.s,$< 为所有依赖

  

  

二、主目录 Makefile 分析(2)的更多相关文章

  1. 二、主目录 Makefile 分析(3)

    2.8 编译选项 重新回到 主 makefile 中执行 2.8.1 u-boot  的编译顺序 代码166 到 189 行,这些是 u-boot 文件编译的顺序,由代码可以看到,首先是从cpu/$( ...

  2. 二、主目录 Makefile 分析(1)

    2.1 uboot 版本号 uboot 的版本号分三个级别: VERSION:主版本号 PATCHLEVEL:次版本号,为补丁级别 SUBLEVEL:再次版本号 EXTRAVERSION:附加版本信息 ...

  3. LibOpenCM3(二) 项目模板 Makefile分析

    目录 LibOpenCM3(一) Linux下命令行开发环境配置 LibOpenCM3(二) 项目模板 Makefile分析 LibOpenCM3 项目模板 项目模板地址: https://githu ...

  4. Android发展的一个重要方面Makefile分析

    Android发展的一个重要方面Makefile分析 随着移动互联网的发展,移动开发也越来越吃香了.眼下最火的莫过于android.android是什么就不用说了,android自从开源以来,就受到非 ...

  5. uboot 主Makefile分析

    一. Makefile 配置 1.1. make xxx_config 1.1.1. 笔者实验时是make x210_sd_config a. x210_sd_config是Makefile下的一个目 ...

  6. makefile 分析 -- 内置变量及自动变量

    makefile 分析1  -p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则. -n 选项, 只运行,不执行, -d 选项,相当于--debug=a,  b(basic), ...

  7. uboot主Makefile分析(t配置和编译过程详解)

    1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_c ...

  8. uboot主Makefile分析

    VERSION = 1 PATCHLEVEL = 3 SUBLEVEL = 4 EXTRAVERSION = U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(S ...

  9. (二)u-boot2013.01.01 for TQ210:《Makefile分析》

           当时写的时候看的是2012-10版本的,但是略对比了一遍和2013.01.01没什么改动,所以这不影响对2013.01.01版本的makefile的理解.本文比较侧重于语法句意的分析,框 ...

随机推荐

  1. angular2+中数据变更子组件页面未更新

    引入监测 import {ChangeDetectorRef} from '@angular/core'; constructor( private changeDetectorRef:ChangeD ...

  2. AntDesign从入门到精通

    第一 设计原则 官方网址:https://ant.design/index-cn 需要做出更好的设计决策,给予研发团队一种高确定性.低熵值的研发状态.同时,不同设计者在充分理解业务述求后,基于 Ant ...

  3. 怎样让DBGrid在按住Shift点鼠标的同时能将连续范围的多行选中?

    参见例子:…privateSel : Boolean ;//判断是否处于选择状态BookMark : TBookMark ;//记录先前的位置…procedure TForm1.DBGrid1Mous ...

  4. BZOJ1093 ZJOI2007最大半连通子图(缩点+dp)

    发现所谓半连通子图就是缩点后的一条链之后就是个模板题了.注意缩点后的重边.写了1h+真是没什么救了. #include<iostream> #include<cstdio> # ...

  5. 【 Gym - 101138F 】GukiZ Height (数学)

    BUPT2017 wintertraining(15) #4 C Gym - 101138F 题意 初始高度0,目标值h,第i天目标值会下降i,当前高度会改变a[i%n],求高度不小于目标值的最早的时 ...

  6. 【POI每日题解 #8】DYN-Dynamite

    你问蒟蒻为什么一天写两篇每日题解? 难道每日坚果你不能一天吃两包吗? 题目链接 哇…这道题第一反应就是二分答案[太明显了 枚举答案 就那个“关键节点到这些点中距离的最小值的最大值”[蒟蒻读了好几遍…… ...

  7. 自学Linux Shell4.2-监测磁盘空间mount umount df du

    点击返回 自学Linux命令行与Shell脚本之路 4.2-监测磁盘空间mount umount  df du 1. 挂载存储媒体mount  移除存储媒体umount ls命令用于显示文件目录列表, ...

  8. [luogu1912][bzoj4196][NOI2015]软件管理器

    题解 树剖模板题,每次改变是\(1\)或者是\(0\),区间求和和区间修改就可了. ac代码 # include <cstdio> # include <cstring> # ...

  9. 算法--java实现将数字转换成人民币大写(迅雷面试题)

    今天去迅雷面试,是个数字转换成人民币的算法题: public class Rmb { /** * 人民币的基本信息和操作 * * @author soyoungboy * @version 1.0 * ...

  10. JavaScript表格插件库

    DataTables https://datatables.net/ Handsontable https://handsontable.com/ JsGrid http://js-grid.com/ ...