点击打开链接

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. [测试题]gentree

    Description 给你一个有向连通图G,每点有个权值Di(0<Di),要求生成一棵树根为1号节点的有根树T.对于树中边E,E的代价为所有从根出发的且包含E的路径的终点权值的和.现求生成树T ...

  2. 亲戚(relative)

    [题目背景] Y 家是世界上最大的家族,HJZ 是其中一员. 现在 Y 家人想要拍一张全家福,却发现这是一个十分复杂的问题. . . . . . [题目描述] Y 家一共有 n 人 其中每个人最多有一 ...

  3. reserve的使用

    reserve: 强迫容器将它的容量变成n 可以避免不必要的重新分配 如果n大于当前容量,那么正常. 如果n小于当前容量,vector会忽略,string则是减小为 max(size(),n). 如果 ...

  4. 51 nod 1766 树上的最远点对(线段树+lca)

    1766 树上的最远点对 基准时间限制:3 秒 空间限制:524288 KB 分值: 80 难度:5级算法题   n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个 ...

  5. 2015 多校联赛 ——HDU5414()

    Problem Description CRB has two strings s and t. In each step, CRB can select arbitrary character c  ...

  6. 腾讯笔试题:小Q硬币组合

    腾讯有一道机试题: 大概意思是: 小Q非常富有,拥有非常多的硬币,小Q的拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好> 各有两个数值为2^k,的硬币,所以小Q拥有的硬币是1,1,2,2, ...

  7. 《Java技术》第二次作业--面向对象基础

    (一)学习总结 1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么? public class Test { public static void main(String a ...

  8. c语言程序设计第四次作业——顺序结构

    (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...

  9. 31. Next Permutation(中等,搞清楚啥是 next permutation)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  10. Microsoft Visual Studio 2017 编译最新版 libuv 1.x

    步骤很简单 1 下载最新版的 libuv(地址:https://github.com/libuv 2 安装Git,Python 2.7 ,cmake(这里使用的是 3.11.0-win64-x64 版 ...