zoukankan      html  css  js  c++  java
  • 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  


  • 相关阅读:
    bzoj3675 [Apio2014]序列分割
    bzoj3437 小P的牧场
    bzoj3156 防御准备
    bzoj1911 [Apio2010]特别行动队
    Codeforces 937.D Sleepy Game
    Codeforces 937.C Save Energy!
    Codeforces 937.B Vile Grasshoppers
    bzoj1597 [Usaco2008 Mar]土地购买
    DDA画线算法
    实验九
  • 原文地址:https://www.cnblogs.com/liang123/p/6325151.html
Copyright © 2011-2022 走看看