点击打开链接

1、get_abs_build_var() 和 get_build_var()的实现都在build/envsetup.sh中。

2、在buld目录下grep这两个函数可知:这两个函数只在build/envsetup.sh脚本中使用。

言归正传,贴代码

[plain] view plain copy
  1. # Get the value of a build variable as an absolute path.
  2. function get_abs_build_var()
  3. {
  4. T=$(gettop)
  5. if [ ! "$T" ]; then
  6. echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
  7. return
  8. fi
  9. (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
  10. command make --no-print-directory -f build/core/config.mk dumpvar-abs-$1)
  11. }
  12. # Get the exact value of a build variable.
  13. function get_build_var()
  14. {
  15. T=$(gettop)
  16. if [ ! "$T" ]; then
  17. echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
  18. return
  19. fi
  20. (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
  21. command make --no-print-directory -f build/core/config.mk dumpvar-$1)
  22. }

这两个shell函数的实现很相似,都是通过make指定build/core/config.mk文件,唯一不同的地方是target目标不同。

接下来我们分析config.mk文件。

config.mk文件开头的注释:

[cpp] view plain copy
  1. # This is included by the top-level Makefile.
  2. # It sets up standard variables based on the
  3. # current configuration and platform, which
  4. # are not specific to what is being built.

根据注释,我们可知config.mk文件主要是配置变量。

而且,config.mk 文件最后一行包含的$(BUILD_SYSTEM)/dumpvar.mk用于获取一些变量。

接下来我们分析dumpvar.mk文件。

[plain] view plain copy
  1. # ---------------------------------------------------------------
  2. # the setpath shell function in envsetup.sh uses this to figure out
  3. # what to add to the path given the config we have chosen.
  4. ifeq ($(CALLED_FROM_SETUP),true) # 在get_abs_build_var() 和 get_build_var()函数中,CALLED_FROM_SETUP=true,走if分支。
  5. ifneq ($(filter /%,$(HOST_OUT_EXECUTABLES)),)
  6. # HOST_OUT_EXECUTABLES变量是在envsetup.mk文件中设置的。
  7. ABP:=$(HOST_OUT_EXECUTABLES)
  8. else
  9. ABP:=$(PWD)/$(HOST_OUT_EXECUTABLES)
  10. endif
  11. ANDROID_BUILD_PATHS := $(ABP)   # 应该是 out/host/linux-x86/bin
  12. ANDROID_PREBUILTS := prebuilt/$(HOST_PREBUILT_TAG)
  13. # HOST_PREBUILT_TAG变量是在envsetup.mk文件中设置的。应该是 linux-x86
  14. ANDROID_GCC_PREBUILTS := prebuilts/gcc/$(HOST_PREBUILT_TAG)
  15. # The "dumpvar" stuff lets you say something like
  16. #
  17. #     CALLED_FROM_SETUP=true \
  18. #       make -f config/envsetup.make dumpvar-TARGET_OUT
  19. # or
  20. #     CALLED_FROM_SETUP=true \
  21. #       make -f config/envsetup.make dumpvar-abs-HOST_OUT_EXECUTABLES
  22. #
  23. # The plain (non-abs) version just dumps the value of the named variable.
  24. # The "abs" version will treat the variable as a path, and dumps an
  25. # absolute path to it.
  26. #
  27. dumpvar_goals := \
  28. $(strip $(patsubst dumpvar-%,%,$(filter dumpvar-%,$(MAKECMDGOALS))))
  29. # MAKECMDGOALS 变量就是传进来的目标dumpvar-abs-$1或 dumpvar-$1。
  30. ifdef dumpvar_goals
  31. ifneq ($(words $(dumpvar_goals)),1)
  32. $(error Only one "dumpvar-" goal allowed. Saw "$(MAKECMDGOALS)")
  33. endif
  34. # If the goal is of the form "dumpvar-abs-VARNAME", then
  35. # treat VARNAME as a path and return the absolute path to it.
  36. absolute_dumpvar := $(strip $(filter abs-%,$(dumpvar_goals)))
  37. ifdef absolute_dumpvar
  38. dumpvar_goals := $(patsubst abs-%,%,$(dumpvar_goals))
  39. ifneq ($(filter /%,$($(dumpvar_goals))),)
  40. DUMPVAR_VALUE := $($(dumpvar_goals))
  41. else
  42. DUMPVAR_VALUE := $(PWD)/$($(dumpvar_goals))
  43. endif
  44. dumpvar_target := dumpvar-abs-$(dumpvar_goals)
  45. else
  46. DUMPVAR_VALUE := $($(dumpvar_goals))
  47. dumpvar_target := dumpvar-$(dumpvar_goals)
  48. endif
  49. .PHONY: $(dumpvar_target)
  50. $(dumpvar_target):
  51. @echo $(DUMPVAR_VALUE)
  52. # DUMPVAR_VALE其实就是dumpvar-$1中的$1变量的值。
  53. endif # dumpvar_goals
  54. ifneq ($(dumpvar_goals),report_config)
  55. # PRINT_BUILD_CONFIG 在envsetup.mk中被定义为true
  56. PRINT_BUILD_CONFIG:=
  57. endif
  58. endif # CALLED_FROM_SETUP
  59. ifneq ($(PRINT_BUILD_CONFIG),)
  60. HOST_OS_EXTRA:=$(shell python -c "import platform; print(platform.platform())")
  61. $(info ============================================)
  62. $(info   PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME))
  63. $(info   PLATFORM_VERSION=$(PLATFORM_VERSION))
  64. $(info   TARGET_PRODUCT=$(TARGET_PRODUCT))
  65. $(info   TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT))
  66. $(info   TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE))
  67. $(info   TARGET_BUILD_APPS=$(TARGET_BUILD_APPS))
  68. $(info   TARGET_ARCH=$(TARGET_ARCH))
  69. $(info   TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT))
  70. $(info   TARGET_CPU_VARIANT=$(TARGET_CPU_VARIANT))
  71. $(info   TARGET_2ND_ARCH=$(TARGET_2ND_ARCH))
  72. $(info   TARGET_2ND_ARCH_VARIANT=$(TARGET_2ND_ARCH_VARIANT))
  73. $(info   TARGET_2ND_CPU_VARIANT=$(TARGET_2ND_CPU_VARIANT))
  74. $(info   HOST_ARCH=$(HOST_ARCH))
  75. $(info   HOST_OS=$(HOST_OS))
  76. $(info   HOST_OS_EXTRA=$(HOST_OS_EXTRA))
  77. $(info   HOST_BUILD_TYPE=$(HOST_BUILD_TYPE))
  78. $(info   BUILD_ID=$(BUILD_ID))
  79. $(info   OUT_DIR=$(OUT_DIR))
  80. $(info ============================================)
  81. endif

小结

大多数的变量配置都是在config.mk中设置的,尤其是其包含的envsetup.mk文件。所以,就在config.mk的最后包含dumpvar.mk文件,该文件执行@echo $(DUMPVAR_VALUE)输出$1变量值。

Examples:

1、get_abs_build_var ANDROID_GCC_PREBUILTS

[plain] view plain copy
  1. #####################
  2. # file:envsetup.mk #
  3. #####################
  4. 34 # ---------------------------------------------------------------
  5. 35 # Set up configuration for host machine.  We don't do cross-
  6. 36 # compiles except for arm/mips, so the HOST is whatever we are
  7. 37 # running on
  8. 38
  9. 39 UNAME := $(shell uname -sm)
  10. 40
  11. 41 # HOST_OS
  12. 42 ifneq (,$(findstring Linux,$(UNAME)))
  13. 43   <u><strong>HOST_OS</strong></u> := linux
  14. 44 endif
  15. 45 ifneq (,$(findstring Darwin,$(UNAME)))
  16. 46   HOST_OS := darwin
  17. 47 endif
  18. 48 ifneq (,$(findstring Macintosh,$(UNAME)))
  19. 49   HOST_OS := darwin
  20. 50 endif
  21. 51 ifneq (,$(findstring CYGWIN,$(UNAME)))
  22. 52   HOST_OS := windows
  23. 53 endif
  24. 108 # We don't want to move all the prebuilt host tools to a $(HOST_OS)-x86_64 dir.
  25. 109 HOST_PREBUILT_ARCH := x86
  26. 110 # This is the standard way to name a directory containing prebuilt host
  27. 111 # objects. E.g., prebuilt/$(HOST_PREBUILT_TAG)/cc
  28. 112 ifeq ($(HOST_OS),windows)
  29. 113   HOST_PREBUILT_TAG := windows
  30. 114 else
  31. 115   HOST_PREBUILT_TAG := $(HOST_OS)-$(HOST_PREBUILT_ARCH)
  32. 116 endif
  33. ##############
  34. # dumpvar.mk #
  35. ##############
  36. ./dumpvar.mk:ANDROID_GCC_PREBUILTS := prebuilts/gcc/$(HOST_PREBUILT_TAG)

2、get_abs_build_var PRODUCT_OUT

[plain] view plain copy
  1. #####################
  2. # file:envsetup.mk #
  3. #####################
  4. 192 # the target build type defaults to release
  5. 193 ifneq ($(TARGET_BUILD_TYPE),debug)
  6. 194 TARGET_BUILD_TYPE := release
  7. 195 endif
  8. 196
  9. 197 # ---------------------------------------------------------------
  10. 198 # figure out the output directories
  11. 199
  12. 200 ifeq (,$(strip $(OUT_DIR)))
  13. 201 ifeq (,$(strip $(OUT_DIR_COMMON_BASE)))
  14. 202 OUT_DIR := $(TOPDIR)out
  15. 203 else
  16. 204 OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD))
  17. 205 endif
  18. 206 endif207
  19. 208 DEBUG_OUT_DIR := $(OUT_DIR)/debug
  20. 209
  21. 210 # Move the host or target under the debug/ directory
  22. 211 # if necessary.
  23. 212 TARGET_OUT_ROOT_release := $(OUT_DIR)/target
  24. 213 TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
  25. 214 TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))
  26. 227 TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product
  27. 232 PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)
  28. #####################
  29. # product_config.mk #
  30. #####################
  31. ./product_config.mk:TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)
  32. # 该变量的分析将独立写一篇文章介绍。

3、get_abs_build_var HOST_OUT

[javascript] view plain copy
  1. #####################
  2. # file: envsetup.mk #
  3. #####################
  4. 1 # Variables we check:
  5. 2 #     HOST_BUILD_TYPE = { release debug }
  6. 3 #     TARGET_BUILD_TYPE = { release debug }
  7. 4 # and we output a bunch of variables, see the case statement at
  8. 5 # the bottom for the full list
  9. 6 #     OUT_DIR is also set to "out" if it's not already set.
  10. 7 #         this allows you to set it to somewhere else if you like
  11. 97 # the host build defaults to release, and it must be release or debug
  12. 98 ifeq ($(HOST_BUILD_TYPE),)
  13. 99 HOST_BUILD_TYPE := release
  14. 100 endif
  15. 101
  16. 102 ifneq ($(HOST_BUILD_TYPE),release)
  17. 103 ifneq ($(HOST_BUILD_TYPE),debug)
  18. 104 $(error HOST_BUILD_TYPE must be either release or debug, not '$(HOST_BUILD_TYPE)')
  19. 105 endif
  20. 106 endif
  21. 216 HOST_OUT_ROOT_release := $(OUT_DIR)/host # OUT_DIR 见2的分析。
  22. 217 HOST_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/host # DEBUG_OUT_DIR 见2的分析。
  23. 220 # We want to avoid two host bin directories in multilib build.
  24. 221 HOST_OUT_release := $(HOST_OUT_ROOT_release)/$(HOST_OS)-$(HOST_PREBUILT_ARCH)
  25. # HOST_OS 见 1 的分析。
  26. 222 HOST_OUT_debug := $(HOST_OUT_ROOT_debug)/$(HOST_OS)-$(HOST_PREBUILT_ARCH)
  27. # HOST_PREBUILT_ARCH 见 1 的分析。
  28. 223 HOST_OUT := $(HOST_OUT_$(HOST_BUILD_TYPE))

4、get_build_var TARGET_DEVICE

[plain] view plain copy
  1. #####################
  2. # product_config.mk #
  3. #####################
  4. ./product_config.mk:TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)
  5. # 该变量的分析将独立写一篇文章介绍。

5、get_build_var TARGET_GCC_VERSION

[plain] view plain copy
  1. TARGET_GCC_VERSION是在combo/TARGET_linux-$(TARGET_ARCH).mk文件中赋的值。
  2. 而TARGET_linux-$(TARGET_ARCH).mk文件是有config.mk -> combo/select.mk文件选择性包含进来的。

6、get_build_var 2ND_TARGET_GCC_VERSION

[plain] view plain copy
  1. ./core/envsetup.mk:254:HOST_2ND_ARCH_VAR_PREFIX := 2ND_
  2. ./core/envsetup.mk:297:TARGET_2ND_ARCH_VAR_PREFIX := $(HOST_2ND_ARCH_VAR_PREFIX)
  3. ./core/config.mk:156:include $(BUILD_SYSTEM)/envsetup.mk
  4. ./core/config.mk:230:combo_2nd_arch_prefix :=
  5. ./core/config.mk:236:combo_2nd_arch_prefix := $(HOST_2ND_ARCH_VAR_PREFIX)
  6. ./core/config.mk:244:combo_2nd_arch_prefix :=
  7. ./core/config.mk:250:combo_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)
  8. $(combo_2nd_arch_prefix)TARGET_GCC_VERSION的赋值是在combo/TARGET_linux-$(TARGET_ARCH).mk 文件中赋的值。

7、get_build_var TARGET_ARCH

[plain] view plain copy
  1. TARGET_ARCH是在BoardConfig.mk文件中赋的值。
  2. BoardConfig.mk文件是由config.mk -> envsetup.mk中的$(board_config_mk)变量包含进来的。

8、get_build_var ANDROID_BUILD_PATHS

[plain] view plain copy
  1. ./core/envsetup.mk:238:HOST_OUT_EXECUTABLES := $(HOST_OUT)/bin
  2. # HOST_OUT 见 3 的分析。
  3. ##############
  4. # dumpvar.mk #
  5. ##############
  6. ifneq ($(filter /%,$(HOST_OUT_EXECUTABLES)),)
  7. ABP:=$(HOST_OUT_EXECUTABLES)
  8. else
  9. ABP:=$(PWD)/$(HOST_OUT_EXECUTABLES)
  10. endif
  11. ANDROID_BUILD_PATHS := $(ABP)

9、get_build_var report_config

[plain] view plain copy
  1. 在dumpvar.mk中,目标是report_config的代码流程如下:
  2. ifneq ($(dumpvar_goals),report_config)
  3. PRINT_BUILD_CONFIG:=
  4. endif
  5. endif # CALLED_FROM_SETUP
  6. ifneq ($(PRINT_BUILD_CONFIG),)
  7. HOST_OS_EXTRA:=$(shell python -c "import platform; print(platform.platform())")
  8. $(info ============================================)
  9. $(info   PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME))
  10. # ./core/version_defaults.mk:62:  PLATFORM_VERSION_CODENAME := REL
  11. $(info   PLATFORM_VERSION=$(PLATFORM_VERSION))
  12. # ./core/version_defaults.mk:44:  PLATFORM_VERSION := 5.1
  13. $(info   TARGET_PRODUCT=$(TARGET_PRODUCT))
  14. # 是lunch时选择的<product_name>
  15. # ./envsetup.sh:    export TARGET_PRODUCT=$product
  16. $(info   TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT))
  17. # 是lunch时选择的<product_variant>
  18. # ./envsetup.sh:    export TARGET_BUILD_VARIANT=$variant
  19. $(info   TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE))
  20. # 是lunch时默认指定的,release
  21. # ./envsetup.sh:    export TARGET_BUILD_TYPE=release
  22. $(info   TARGET_BUILD_APPS=$(TARGET_BUILD_APPS))
  23. # 是lunch时默认指定的,空值
  24. # ./envsetup.sh:    export TARGET_BUILD_APPS=
  25. $(info   TARGET_ARCH=$(TARGET_ARCH)) # TARGET_ARCH 见 7 的分析。
  26. $(info   TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT))
  27. # 是在$(board_config_mk)即 BoardConfig.mk文件中赋的值。
  28. $(info   TARGET_CPU_VARIANT=$(TARGET_CPU_VARIANT))
  29. # 是在$(board_config_mk)即 BoardConfig.mk文件中赋的值。
  30. $(info   TARGET_2ND_ARCH=$(TARGET_2ND_ARCH))
  31. # 是在$(board_config_mk)即 BoardConfig.mk文件中赋的值。
  32. $(info   TARGET_2ND_ARCH_VARIANT=$(TARGET_2ND_ARCH_VARIANT))
  33. # 是在$(board_config_mk)即 BoardConfig.mk文件中赋的值。
  34. $(info   TARGET_2ND_CPU_VARIANT=$(TARGET_2ND_CPU_VARIANT))
  35. # 是在$(board_config_mk)即 BoardConfig.mk文件中赋的值。
  36. $(info   HOST_ARCH=$(HOST_ARCH))
  37. # ./core/envsetup.mk:79:  HOST_ARCH := x86_64
  38. $(info   HOST_OS=$(HOST_OS)) # HOST_OS 见 1 的分析。
  39. $(info   HOST_OS_EXTRA=$(HOST_OS_EXTRA)) # ifneq 的第一行。
  40. $(info   HOST_BUILD_TYPE=$(HOST_BUILD_TYPE)) # HOST_BUILD_TYPE 见 3 的分析。
  41. $(info   BUILD_ID=$(BUILD_ID))
  42. # ./core/build_id.mk:21:export BUILD_ID=LMY47D
  43. $(info   OUT_DIR=$(OUT_DIR)) # OUT_DIR 见 2 的分析。
  44. $(info ============================================)
  45. endif

Building System之 get_abs_build_var() && get_build_var()的更多相关文章

  1. 【转】Android Building System 总结 - 一醉千年 - CSDN博客

    原文网址:http://www.360doc.com/content/15/0314/23/1709014_455175716.shtml  Android Building System 总结 收藏 ...

  2. building system busy, pls wait !!

    编译ca是可能会报这个错误,是189服务器上的/home/pub-work/.android_build_lock这个文件的问题,删除即可.

  3. 【Java心得总结四】Java泛型下——万恶的擦除

    一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...

  4. Thinking in Java from Chapter 15

    From Thinking in Java 4th Edition. 泛型实现了:参数化类型的概念,使代码可以应用于多种类型.“泛型”这个术语的意思是:“适用于许多许多的类型”. 如果你了解其他语言( ...

  5. Android开发的技术层次

    任何一种移动开发生态系统其技术人员都是呈现金字塔式分布的.我借此也说说Developer和Programmer的区别: Programmer是真正意义上的程序员,写程序的.灵魂级 Developer是 ...

  6. JAVA虚拟机学习笔记(一)Windows10下编译OpenJDK8

    转载请注明源地址:http://www.cnblogs.com/lighten/p/5906359.html 1. 编译环境的准备 1.1 JDK源码下载 OpenJDK是JAVA发展史中的一个开源项 ...

  7. sublime搭建Java编译平台及编码问题

    Sublime自带Java编译功能,当时只能编译不能运行,我们做一下小小的修改就可以让sublime一步完成编译运行的功能,实现sublime搭建Java编译平台. 使用Ctrl + B 编译时,所编 ...

  8. AsciiDoc

    AsciiDoc Text based document generation AsciiDoc Home Page Table of Contents Introduction Overview a ...

  9. 关于sublime text

    Sublime text2 C/C++ 编译环境设置 (2014-04-10 20:51:16) 转载▼ 标签: sublime c语言 程序设计 gcc cpp 分类: 记录与分享 sublime ...

随机推荐

  1. [SDOI2017]数字表格

    Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师 ...

  2. bzoj1877

    1877: [SDOI2009]晨跑 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2660  Solved: 1424[Submit][Status][ ...

  3. Ubuntu 16.04 Vim安装及配置

    安装VIM 默认已经安装了VIM-tiny acewu@acewu-computer:~$ locate vi | grep 'vi$' |xargs ls -al lrwxrwxrwx 1 root ...

  4. Triangle(动态规划)

    题目描述 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjac ...

  5. C语言预备作业

    一.关于师生关系 第一种:我认为师生关系不是仅仅的餐馆与食客的关系,因为食客可以给餐馆评分,也可以选择是否继续在这里吃,但是学生却不可以选择老师,因为老师是传授知识的,无法由自己来选择.而学生是需要完 ...

  6. Gethub readme 撰写

    大标题=== 小标题----- #一级标题 ##二级标题 ###三级标题 ####四级标题 #####五级标题 ######六级标题 插入圆点* 昵称:果冻虾仁 * 别名:隔壁老王 * 英文名:Jel ...

  7. 详解Tomcat配置JVM参数步骤

    这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ...

  8. Spring Boot 参数校验

    1.背景介绍 开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码 这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已. 接下来,用Validation来改写这段 2.Spr ...

  9. Lock锁子类了解一下

    前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 Java锁机制了解一下 AQS简简单单过一遍 只有光头才能变强! 上一篇已经将Loc ...

  10. 单页应用动态设置页面title

    1.适用场景:所有通过router路由的单页应用. 2.示例代码:本文以vue-router为例. 在router.js中: let router = new Router({ routes: [ { ...