Building System之 get_abs_build_var() && get_build_var()

点击打开链接

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.   
  13. # Get the exact value of a build variable.  
  14. function get_build_var()  
  15. {  
  16.     T=$(gettop)  
  17.     if [ ! "$T" ]; then  
  18.         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2  
  19.         return  
  20.     fi  
  21.     (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \  
  22.       command make --no-print-directory -f build/core/config.mk dumpvar-$1)  
  23. }  

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

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

config.mk文件开头的注释:

  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.   
  6. ifneq ($(filter /%,$(HOST_OUT_EXECUTABLES)),)   
  7. # HOST_OUT_EXECUTABLES变量是在envsetup.mk文件中设置的。  
  8. ABP:=$(HOST_OUT_EXECUTABLES)  
  9. else  
  10. ABP:=$(PWD)/$(HOST_OUT_EXECUTABLES)  
  11. endif  
  12.   
  13. ANDROID_BUILD_PATHS := $(ABP)   # 应该是 out/host/linux-x86/bin  
  14. ANDROID_PREBUILTS := prebuilt/$(HOST_PREBUILT_TAG)   
  15. # HOST_PREBUILT_TAG变量是在envsetup.mk文件中设置的。应该是 linux-x86  
  16. ANDROID_GCC_PREBUILTS := prebuilts/gcc/$(HOST_PREBUILT_TAG)  
  17.   
  18. # The "dumpvar" stuff lets you say something like  
  19. #  
  20. #     CALLED_FROM_SETUP=true \  
  21. #       make -f config/envsetup.make dumpvar-TARGET_OUT  
  22. # or  
  23. #     CALLED_FROM_SETUP=true \  
  24. #       make -f config/envsetup.make dumpvar-abs-HOST_OUT_EXECUTABLES  
  25. #  
  26. # The plain (non-abs) version just dumps the value of the named variable.  
  27. # The "abs" version will treat the variable as a path, and dumps an  
  28. # absolute path to it.  
  29. #  
  30. dumpvar_goals := \  
  31.         $(strip $(patsubst dumpvar-%,%,$(filter dumpvar-%,$(MAKECMDGOALS))))   
  32.         # MAKECMDGOALS 变量就是传进来的目标dumpvar-abs-$1或 dumpvar-$1。  
  33. ifdef dumpvar_goals  
  34.   
  35.   ifneq ($(words $(dumpvar_goals)),1)  
  36.     $(error Only one "dumpvar-" goal allowed. Saw "$(MAKECMDGOALS)")  
  37.   endif  
  38.   
  39.   # If the goal is of the form "dumpvar-abs-VARNAME", then  
  40.   # treat VARNAME as a path and return the absolute path to it.  
  41.   absolute_dumpvar := $(strip $(filter abs-%,$(dumpvar_goals)))  
  42.   ifdef absolute_dumpvar  
  43.     dumpvar_goals := $(patsubst abs-%,%,$(dumpvar_goals))  
  44.     ifneq ($(filter /%,$($(dumpvar_goals))),)  
  45.       DUMPVAR_VALUE := $($(dumpvar_goals))  
  46.     else  
  47.       DUMPVAR_VALUE := $(PWD)/$($(dumpvar_goals))  
  48.     endif  
  49.     dumpvar_target := dumpvar-abs-$(dumpvar_goals)  
  50.   else  
  51.     DUMPVAR_VALUE := $($(dumpvar_goals))  
  52.     dumpvar_target := dumpvar-$(dumpvar_goals)  
  53.   endif  
  54.   
  55. .PHONY: $(dumpvar_target)  
  56. $(dumpvar_target):  
  57.         @echo $(DUMPVAR_VALUE)   
  58.         # DUMPVAR_VALE其实就是dumpvar-$1中的$1变量的值。  
  59.   
  60. endif # dumpvar_goals  
  61.   
  62. ifneq ($(dumpvar_goals),report_config)   
  63. # PRINT_BUILD_CONFIG 在envsetup.mk中被定义为true  
  64. PRINT_BUILD_CONFIG:=  
  65. endif  
  66.   
  67. endif # CALLED_FROM_SETUP  
  68.   
  69.   
  70. ifneq ($(PRINT_BUILD_CONFIG),)  
  71. HOST_OS_EXTRA:=$(shell python -c "import platform; print(platform.platform())")   
  72. $(info ============================================)  
  73. $(info   PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME))  
  74. $(info   PLATFORM_VERSION=$(PLATFORM_VERSION))  
  75. $(info   TARGET_PRODUCT=$(TARGET_PRODUCT))  
  76. $(info   TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT))  
  77. $(info   TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE))  
  78. $(info   TARGET_BUILD_APPS=$(TARGET_BUILD_APPS))  
  79. $(info   TARGET_ARCH=$(TARGET_ARCH))  
  80. $(info   TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT))  
  81. $(info   TARGET_CPU_VARIANT=$(TARGET_CPU_VARIANT))  
  82. $(info   TARGET_2ND_ARCH=$(TARGET_2ND_ARCH))  
  83. $(info   TARGET_2ND_ARCH_VARIANT=$(TARGET_2ND_ARCH_VARIANT))  
  84. $(info   TARGET_2ND_CPU_VARIANT=$(TARGET_2ND_CPU_VARIANT))  
  85. $(info   HOST_ARCH=$(HOST_ARCH))  
  86. $(info   HOST_OS=$(HOST_OS))  
  87. $(info   HOST_OS_EXTRA=$(HOST_OS_EXTRA))  
  88. $(info   HOST_BUILD_TYPE=$(HOST_BUILD_TYPE))  
  89. $(info   BUILD_ID=$(BUILD_ID))  
  90. $(info   OUT_DIR=$(OUT_DIR))  
  91. $(info ============================================)  
  92. 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.   
  25. 108 # We don't want to move all the prebuilt host tools to a $(HOST_OS)-x86_64 dir.  
  26. 109 HOST_PREBUILT_ARCH := x86  
  27. 110 # This is the standard way to name a directory containing prebuilt host  
  28. 111 # objects. E.g., prebuilt/$(HOST_PREBUILT_TAG)/cc  
  29. 112 ifeq ($(HOST_OS),windows)  
  30. 113   HOST_PREBUILT_TAG := windows  
  31. 114 else  
  32. 115   HOST_PREBUILT_TAG := $(HOST_OS)-$(HOST_PREBUILT_ARCH)  
  33. 116 endif  
  34. ##############  
  35. # dumpvar.mk #  
  36. ##############  
  37. ./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.   
  27. 227 TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product  
  28.   
  29. 232 PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)  
  30.   
  31. #####################  
  32. # product_config.mk #  
  33. #####################  
  34. ./product_config.mk:TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)   
  35. # 该变量的分析将独立写一篇文章介绍。  

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.   
  12.  97 # the host build defaults to release, and it must be release or debug  
  13.  98 ifeq ($(HOST_BUILD_TYPE),)  
  14.  99 HOST_BUILD_TYPE := release  
  15. 100 endif  
  16. 101   
  17. 102 ifneq ($(HOST_BUILD_TYPE),release)  
  18. 103 ifneq ($(HOST_BUILD_TYPE),debug)  
  19. 104 $(error HOST_BUILD_TYPE must be either release or debug, not '$(HOST_BUILD_TYPE)')  
  20. 105 endif  
  21. 106 endif  
  22.   
  23. 216 HOST_OUT_ROOT_release := $(OUT_DIR)/host # OUT_DIR 见2的分析。  
  24. 217 HOST_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/host # DEBUG_OUT_DIR 见2的分析。  
  25.   
  26. 220 # We want to avoid two host bin directories in multilib build.  
  27. 221 HOST_OUT_release := $(HOST_OUT_ROOT_release)/$(HOST_OS)-$(HOST_PREBUILT_ARCH)   
  28.                                                  # HOST_OS 见 1 的分析。  
  29. 222 HOST_OUT_debug := $(HOST_OUT_ROOT_debug)/$(HOST_OS)-$(HOST_PREBUILT_ARCH)   
  30.                                                 # HOST_PREBUILT_ARCH 见 1 的分析。  
  31. 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.   
  4. ./core/config.mk:156:include $(BUILD_SYSTEM)/envsetup.mk  
  5. ./core/config.mk:230:combo_2nd_arch_prefix :=  
  6. ./core/config.mk:236:combo_2nd_arch_prefix := $(HOST_2ND_ARCH_VAR_PREFIX)  
  7. ./core/config.mk:244:combo_2nd_arch_prefix :=  
  8. ./core/config.mk:250:combo_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)  
  9.   
  10. $(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.   
  12. ANDROID_BUILD_PATHS := $(ABP)  
9、get_build_var report_config

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


posted on 2016-09-27 12:41  王亮1  阅读(611)  评论(0编辑  收藏  举报

导航