日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Building System之 get_abs_build_var() get_build_var()

發布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 plaincopy
  • #?Get?the?value?of?a?build?variable?as?an?absolute?path.??
  • function?get_abs_build_var()??
  • {??
  • ????T=$(gettop)??
  • ????if?[?!?"$T"?];?then??
  • ????????echo?"Couldn't?locate?the?top?of?the?tree.??Try?setting?TOP."?>&2??
  • ????????return??
  • ????fi??
  • ????(\cd?$T;?CALLED_FROM_SETUP=true?BUILD_SYSTEM=build/core?\??
  • ??????command?make?--no-print-directory?-f?build/core/config.mk?dumpvar-abs-$1)??
  • }??
  • ??
  • #?Get?the?exact?value?of?a?build?variable.??
  • function?get_build_var()??
  • {??
  • ????T=$(gettop)??
  • ????if?[?!?"$T"?];?then??
  • ????????echo?"Couldn't?locate?the?top?of?the?tree.??Try?setting?TOP."?>&2??
  • ????????return??
  • ????fi??
  • ????(\cd?$T;?CALLED_FROM_SETUP=true?BUILD_SYSTEM=build/core?\??
  • ??????command?make?--no-print-directory?-f?build/core/config.mk?dumpvar-$1)??
  • }??
  • 這兩個shell函數的實現很相似,都是通過make指定build/core/config.mk文件,唯一不同的地方是target目標不同。

    接下來我們分析config.mk文件。

    config.mk文件開頭的注釋:

    [cpp]?view plaincopy
  • #?This?is?included?by?the?top-level?Makefile.??
  • #?It?sets?up?standard?variables?based?on?the??
  • #?current?configuration?and?platform,?which??
  • #?are?not?specific?to?what?is?being?built.??
  • 根據注釋,我們可知config.mk文件主要是配置變量。

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


    接下來我們分析dumpvar.mk文件。

    [plain]?view plaincopy
  • #?---------------------------------------------------------------??
  • #?the?setpath?shell?function?in?envsetup.sh?uses?this?to?figure?out??
  • #?what?to?add?to?the?path?given?the?config?we?have?chosen.??
  • ifeq?($(CALLED_FROM_SETUP),true)?#?在get_abs_build_var()?和?get_build_var()函數中,CALLED_FROM_SETUP=true,走if分支。??
  • ??
  • ifneq?($(filter?/%,$(HOST_OUT_EXECUTABLES)),)???
  • #?HOST_OUT_EXECUTABLES變量是在envsetup.mk文件中設置的。??
  • ABP:=$(HOST_OUT_EXECUTABLES)??
  • else??
  • ABP:=$(PWD)/$(HOST_OUT_EXECUTABLES)??
  • endif??
  • ??
  • ANDROID_BUILD_PATHS?:=?$(ABP)???#?應該是?out/host/linux-x86/bin??
  • ANDROID_PREBUILTS?:=?prebuilt/$(HOST_PREBUILT_TAG)???
  • #?HOST_PREBUILT_TAG變量是在envsetup.mk文件中設置的。應該是?linux-x86??
  • ANDROID_GCC_PREBUILTS?:=?prebuilts/gcc/$(HOST_PREBUILT_TAG)??
  • ??
  • #?The?"dumpvar"?stuff?lets?you?say?something?like??
  • #??
  • #?????CALLED_FROM_SETUP=true?\??
  • #???????make?-f?config/envsetup.make?dumpvar-TARGET_OUT??
  • #?or??
  • #?????CALLED_FROM_SETUP=true?\??
  • #???????make?-f?config/envsetup.make?dumpvar-abs-HOST_OUT_EXECUTABLES??
  • #??
  • #?The?plain?(non-abs)?version?just?dumps?the?value?of?the?named?variable.??
  • #?The?"abs"?version?will?treat?the?variable?as?a?path,?and?dumps?an??
  • #?absolute?path?to?it.??
  • #??
  • dumpvar_goals?:=?\??
  • ????????$(strip?$(patsubst?dumpvar-%,%,$(filter?dumpvar-%,$(MAKECMDGOALS))))???
  • ????????#?MAKECMDGOALS?變量就是傳進來的目標dumpvar-abs-$1或?dumpvar-$1。??
  • ifdef?dumpvar_goals??
  • ??
  • ??ifneq?($(words?$(dumpvar_goals)),1)??
  • ????$(error?Only?one?"dumpvar-"?goal?allowed.?Saw?"$(MAKECMDGOALS)")??
  • ??endif??
  • ??
  • ??#?If?the?goal?is?of?the?form?"dumpvar-abs-VARNAME",?then??
  • ??#?treat?VARNAME?as?a?path?and?return?the?absolute?path?to?it.??
  • ??absolute_dumpvar?:=?$(strip?$(filter?abs-%,$(dumpvar_goals)))??
  • ??ifdef?absolute_dumpvar??
  • ????dumpvar_goals?:=?$(patsubst?abs-%,%,$(dumpvar_goals))??
  • ????ifneq?($(filter?/%,$($(dumpvar_goals))),)??
  • ??????DUMPVAR_VALUE?:=?$($(dumpvar_goals))??
  • ????else??
  • ??????DUMPVAR_VALUE?:=?$(PWD)/$($(dumpvar_goals))??
  • ????endif??
  • ????dumpvar_target?:=?dumpvar-abs-$(dumpvar_goals)??
  • ??else??
  • ????DUMPVAR_VALUE?:=?$($(dumpvar_goals))??
  • ????dumpvar_target?:=?dumpvar-$(dumpvar_goals)??
  • ??endif??
  • ??
  • .PHONY:?$(dumpvar_target)??
  • $(dumpvar_target):??
  • ????????@echo?$(DUMPVAR_VALUE)???
  • ????????#?DUMPVAR_VALE其實就是dumpvar-$1中的$1變量的值。??
  • ??
  • endif?#?dumpvar_goals??
  • ??
  • ifneq?($(dumpvar_goals),report_config)???
  • #?PRINT_BUILD_CONFIG?在envsetup.mk中被定義為true??
  • PRINT_BUILD_CONFIG:=??
  • endif??
  • ??
  • endif?#?CALLED_FROM_SETUP??
  • ??
  • ??
  • ifneq?($(PRINT_BUILD_CONFIG),)??
  • HOST_OS_EXTRA:=$(shell?python?-c?"import?platform;?print(platform.platform())")???
  • $(info?============================================)??
  • $(info???PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME))??
  • $(info???PLATFORM_VERSION=$(PLATFORM_VERSION))??
  • $(info???TARGET_PRODUCT=$(TARGET_PRODUCT))??
  • $(info???TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT))??
  • $(info???TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE))??
  • $(info???TARGET_BUILD_APPS=$(TARGET_BUILD_APPS))??
  • $(info???TARGET_ARCH=$(TARGET_ARCH))??
  • $(info???TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT))??
  • $(info???TARGET_CPU_VARIANT=$(TARGET_CPU_VARIANT))??
  • $(info???TARGET_2ND_ARCH=$(TARGET_2ND_ARCH))??
  • $(info???TARGET_2ND_ARCH_VARIANT=$(TARGET_2ND_ARCH_VARIANT))??
  • $(info???TARGET_2ND_CPU_VARIANT=$(TARGET_2ND_CPU_VARIANT))??
  • $(info???HOST_ARCH=$(HOST_ARCH))??
  • $(info???HOST_OS=$(HOST_OS))??
  • $(info???HOST_OS_EXTRA=$(HOST_OS_EXTRA))??
  • $(info???HOST_BUILD_TYPE=$(HOST_BUILD_TYPE))??
  • $(info???BUILD_ID=$(BUILD_ID))??
  • $(info???OUT_DIR=$(OUT_DIR))??
  • $(info?============================================)??
  • endif??

  • 小結

    大多數的變量配置都是在config.mk中設置的,尤其是其包含的envsetup.mk文件。所以,就在config.mk的最后包含dumpvar.mk文件,該文件執行@echo $(DUMPVAR_VALUE)輸出$1變量值。


    Examples:

    1、get_abs_build_var?ANDROID_GCC_PREBUILTS

    [plain]?view plaincopy
  • #####################???
  • #?file:envsetup.mk?#??
  • #####################??
  • ?34?#?---------------------------------------------------------------??
  • ?35?#?Set?up?configuration?for?host?machine.??We?don't?do?cross-??
  • ?36?#?compiles?except?for?arm/mips,?so?the?HOST?is?whatever?we?are??
  • ?37?#?running?on??
  • ?38???
  • ?39?UNAME?:=?$(shell?uname?-sm)??
  • ?40???
  • ?41?#?HOST_OS??
  • ?42?ifneq?(,$(findstring?Linux,$(UNAME)))??
  • ?43???<u><strong>HOST_OS</strong></u>?:=?linux??
  • ?44?endif??
  • ?45?ifneq?(,$(findstring?Darwin,$(UNAME)))??
  • ?46???HOST_OS?:=?darwin??
  • ?47?endif??
  • ?48?ifneq?(,$(findstring?Macintosh,$(UNAME)))??
  • ?49???HOST_OS?:=?darwin??
  • ?50?endif??
  • ?51?ifneq?(,$(findstring?CYGWIN,$(UNAME)))??
  • ?52???HOST_OS?:=?windows??
  • ?53?endif??
  • ??
  • 108?#?We?don't?want?to?move?all?the?prebuilt?host?tools?to?a?$(HOST_OS)-x86_64?dir.??
  • 109?HOST_PREBUILT_ARCH?:=?x86??
  • 110?#?This?is?the?standard?way?to?name?a?directory?containing?prebuilt?host??
  • 111?#?objects.?E.g.,?prebuilt/$(HOST_PREBUILT_TAG)/cc??
  • 112?ifeq?($(HOST_OS),windows)??
  • 113???HOST_PREBUILT_TAG?:=?windows??
  • 114?else??
  • 115???HOST_PREBUILT_TAG?:=?$(HOST_OS)-$(HOST_PREBUILT_ARCH)??
  • 116?endif??
  • ##############??
  • #?dumpvar.mk?#??
  • ##############??
  • ./dumpvar.mk:ANDROID_GCC_PREBUILTS?:=?prebuilts/gcc/$(HOST_PREBUILT_TAG)??
  • 2、get_abs_build_var?PRODUCT_OUT

    [plain]?view plaincopy
  • #####################???
  • #?file:envsetup.mk?#??
  • #####################??
  • 192?#?the?target?build?type?defaults?to?release??
  • 193?ifneq?($(TARGET_BUILD_TYPE),debug)??
  • 194?TARGET_BUILD_TYPE?:=?release??
  • 195?endif??
  • 196???
  • 197?#?---------------------------------------------------------------??
  • 198?#?figure?out?the?output?directories??
  • 199???
  • 200?ifeq?(,$(strip?$(OUT_DIR)))??
  • 201?ifeq?(,$(strip?$(OUT_DIR_COMMON_BASE)))??
  • 202?OUT_DIR?:=?$(TOPDIR)out??
  • 203?else??
  • 204?OUT_DIR?:=?$(OUT_DIR_COMMON_BASE)/$(notdir?$(PWD))??
  • 205?endif??
  • 206?endif207???
  • 208?DEBUG_OUT_DIR?:=?$(OUT_DIR)/debug??
  • 209??
  • 210?#?Move?the?host?or?target?under?the?debug/?directory??
  • 211?#?if?necessary.??
  • 212?TARGET_OUT_ROOT_release?:=?$(OUT_DIR)/target??
  • 213?TARGET_OUT_ROOT_debug?:=?$(DEBUG_OUT_DIR)/target??
  • 214?TARGET_OUT_ROOT?:=?$(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))??
  • ??
  • 227?TARGET_PRODUCT_OUT_ROOT?:=?$(TARGET_OUT_ROOT)/product??
  • ??
  • 232?PRODUCT_OUT?:=?$(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)??
  • ??
  • #####################??
  • #?product_config.mk?#??
  • #####################??
  • ./product_config.mk:TARGET_DEVICE?:=?$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)???
  • #?該變量的分析將獨立寫一篇文章介紹。??
  • 3、get_abs_build_var?HOST_OUT

    [javascript]?view plaincopy
  • ??#####################??
  • ??#?file:?envsetup.mk?#??
  • ??#####################??
  • ??1?#?Variables?we?check:??
  • ??2?#?????HOST_BUILD_TYPE?=?{?release?debug?}??
  • ??3?#?????TARGET_BUILD_TYPE?=?{?release?debug?}??
  • ??4?#?and?we?output?a?bunch?of?variables,?see?the?case?statement?at??
  • ??5?#?the?bottom?for?the?full?list??
  • ??6?#?????OUT_DIR?is?also?set?to?"out"?if?it's?not?already?set.??
  • ??7?#?????????this?allows?you?to?set?it?to?somewhere?else?if?you?like??
  • ??
  • ?97?#?the?host?build?defaults?to?release,?and?it?must?be?release?or?debug??
  • ?98?ifeq?($(HOST_BUILD_TYPE),)??
  • ?99?HOST_BUILD_TYPE?:=?release??
  • 100?endif??
  • 101???
  • 102?ifneq?($(HOST_BUILD_TYPE),release)??
  • 103?ifneq?($(HOST_BUILD_TYPE),debug)??
  • 104?$(error?HOST_BUILD_TYPE?must?be?either?release?or?debug,?not?'$(HOST_BUILD_TYPE)')??
  • 105?endif??
  • 106?endif??
  • ??
  • 216?HOST_OUT_ROOT_release?:=?$(OUT_DIR)/host?#?OUT_DIR?見2的分析。??
  • 217?HOST_OUT_ROOT_debug?:=?$(DEBUG_OUT_DIR)/host?#?DEBUG_OUT_DIR?見2的分析。??
  • ??
  • 220?#?We?want?to?avoid?two?host?bin?directories?in?multilib?build.??
  • 221?HOST_OUT_release?:=?$(HOST_OUT_ROOT_release)/$(HOST_OS)-$(HOST_PREBUILT_ARCH)???
  • ?????????????????????????????????????????????????#?HOST_OS?見?1?的分析。??
  • 222?HOST_OUT_debug?:=?$(HOST_OUT_ROOT_debug)/$(HOST_OS)-$(HOST_PREBUILT_ARCH)???
  • ????????????????????????????????????????????????#?HOST_PREBUILT_ARCH?見?1?的分析。??
  • 223?HOST_OUT?:=?$(HOST_OUT_$(HOST_BUILD_TYPE))??
  • 4、get_build_var?TARGET_DEVICE

    [plain]?view plaincopy
  • #####################??
  • #?product_config.mk?#??
  • #####################??
  • ./product_config.mk:TARGET_DEVICE?:=?$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)???
  • #?該變量的分析將獨立寫一篇文章介紹。??
  • 5、get_build_var TARGET_GCC_VERSION

    [plain]?view plaincopy
  • TARGET_GCC_VERSION是在combo/TARGET_linux-$(TARGET_ARCH).mk文件中賦的值。??
  • 而TARGET_linux-$(TARGET_ARCH).mk文件是有config.mk?->?combo/select.mk文件選擇性包含進來的。??
  • 6、get_build_var?2ND_TARGET_GCC_VERSION

    [plain]?view plaincopy
  • ./core/envsetup.mk:254:HOST_2ND_ARCH_VAR_PREFIX?:=?2ND_??
  • ./core/envsetup.mk:297:TARGET_2ND_ARCH_VAR_PREFIX?:=?$(HOST_2ND_ARCH_VAR_PREFIX)??
  • ??
  • ./core/config.mk:156:include?$(BUILD_SYSTEM)/envsetup.mk??
  • ./core/config.mk:230:combo_2nd_arch_prefix?:=??
  • ./core/config.mk:236:combo_2nd_arch_prefix?:=?$(HOST_2ND_ARCH_VAR_PREFIX)??
  • ./core/config.mk:244:combo_2nd_arch_prefix?:=??
  • ./core/config.mk:250:combo_2nd_arch_prefix?:=?$(TARGET_2ND_ARCH_VAR_PREFIX)??
  • ??
  • $(combo_2nd_arch_prefix)TARGET_GCC_VERSION的賦值是在combo/TARGET_linux-$(TARGET_ARCH).mk?文件中賦的值。??
  • 7、get_build_var?TARGET_ARCH

    [plain]?view plaincopy
  • TARGET_ARCH是在BoardConfig.mk文件中賦的值。??
  • BoardConfig.mk文件是由config.mk?->?envsetup.mk中的$(board_config_mk)變量包含進來的。??
  • 8、get_build_var?ANDROID_BUILD_PATHS

    [plain]?view plaincopy
  • ./core/envsetup.mk:238:HOST_OUT_EXECUTABLES?:=?$(HOST_OUT)/bin??
  • ?????????????????????????????????????????????#?HOST_OUT?見?3?的分析。??
  • ##############??
  • #?dumpvar.mk?#??
  • ##############??
  • ifneq?($(filter?/%,$(HOST_OUT_EXECUTABLES)),)??
  • ABP:=$(HOST_OUT_EXECUTABLES)??
  • else??
  • ABP:=$(PWD)/$(HOST_OUT_EXECUTABLES)??
  • endif??
  • ??
  • ANDROID_BUILD_PATHS?:=?$(ABP)??
  • 9、get_build_var?report_config

    [plain]?view plaincopy
  • 在dumpvar.mk中,目標是report_config的代碼流程如下:??
  • ??
  • ifneq?($(dumpvar_goals),report_config)??
  • PRINT_BUILD_CONFIG:=??
  • endif??
  • ??
  • endif?#?CALLED_FROM_SETUP??
  • ??
  • ifneq?($(PRINT_BUILD_CONFIG),)??
  • HOST_OS_EXTRA:=$(shell?python?-c?"import?platform;?print(platform.platform())")??
  • $(info?============================================)??
  • $(info???PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME))??
  • #?./core/version_defaults.mk:62:??PLATFORM_VERSION_CODENAME?:=?REL??
  • $(info???PLATFORM_VERSION=$(PLATFORM_VERSION))??
  • #?./core/version_defaults.mk:44:??PLATFORM_VERSION?:=?5.1??
  • ??
  • $(info???TARGET_PRODUCT=$(TARGET_PRODUCT))??
  • #?是lunch時選擇的<product_name>??
  • #?./envsetup.sh:????export?TARGET_PRODUCT=$product??
  • $(info???TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT))??
  • #?是lunch時選擇的<product_variant>??
  • #?./envsetup.sh:????export?TARGET_BUILD_VARIANT=$variant??
  • $(info???TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE))??
  • #?是lunch時默認指定的,release??
  • #?./envsetup.sh:????export?TARGET_BUILD_TYPE=release??
  • $(info???TARGET_BUILD_APPS=$(TARGET_BUILD_APPS))??
  • #?是lunch時默認指定的,空值??
  • #?./envsetup.sh:????export?TARGET_BUILD_APPS=??
  • $(info???TARGET_ARCH=$(TARGET_ARCH))?#?TARGET_ARCH?見?7?的分析。??
  • ??
  • $(info???TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT))??
  • #?是在$(board_config_mk)即?BoardConfig.mk文件中賦的值。??
  • $(info???TARGET_CPU_VARIANT=$(TARGET_CPU_VARIANT))??
  • #?是在$(board_config_mk)即?BoardConfig.mk文件中賦的值。??
  • $(info???TARGET_2ND_ARCH=$(TARGET_2ND_ARCH))??
  • #?是在$(board_config_mk)即?BoardConfig.mk文件中賦的值。??
  • $(info???TARGET_2ND_ARCH_VARIANT=$(TARGET_2ND_ARCH_VARIANT))??
  • #?是在$(board_config_mk)即?BoardConfig.mk文件中賦的值。??
  • $(info???TARGET_2ND_CPU_VARIANT=$(TARGET_2ND_CPU_VARIANT))??
  • #?是在$(board_config_mk)即?BoardConfig.mk文件中賦的值。??
  • ??
  • $(info???HOST_ARCH=$(HOST_ARCH))??
  • #?./core/envsetup.mk:79:??HOST_ARCH?:=?x86_64??
  • $(info???HOST_OS=$(HOST_OS))?#?HOST_OS?見?1?的分析。??
  • $(info???HOST_OS_EXTRA=$(HOST_OS_EXTRA))?#?ifneq?的第一行。??
  • $(info???HOST_BUILD_TYPE=$(HOST_BUILD_TYPE))?#?HOST_BUILD_TYPE?見?3?的分析。??
  • ??
  • $(info???BUILD_ID=$(BUILD_ID))??
  • #?./core/build_id.mk:21:export?BUILD_ID=LMY47D??
  • $(info???OUT_DIR=$(OUT_DIR))?#?OUT_DIR?見?2?的分析。??
  • $(info?============================================)??
  • endif??


  • 總結

    以上是生活随笔為你收集整理的Building System之 get_abs_build_var() get_build_var()的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。