1*795d594fSAndroid Build Coastguard Worker# Copyright 2018, The Android Open Source Project 2*795d594fSAndroid Build Coastguard Worker# 3*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*795d594fSAndroid Build Coastguard Worker# 7*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*795d594fSAndroid Build Coastguard Worker# 9*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*795d594fSAndroid Build Coastguard Worker# limitations under the License. 14*795d594fSAndroid Build Coastguard Worker 15*795d594fSAndroid Build Coastguard Worker# 16*795d594fSAndroid Build Coastguard Worker# !!! Keep up-to-date with var_cache.sh 17*795d594fSAndroid Build Coastguard Worker# 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker# 20*795d594fSAndroid Build Coastguard Worker# Provide a soong-build variable query mechanism that is cached 21*795d594fSAndroid Build Coastguard Worker# in the current process and any other subchild process that knows 22*795d594fSAndroid Build Coastguard Worker# how to parse the exported variable: 23*795d594fSAndroid Build Coastguard Worker# 24*795d594fSAndroid Build Coastguard Worker# export ART_TOOLS_BUILD_VAR_CACHE="..." 25*795d594fSAndroid Build Coastguard Worker# 26*795d594fSAndroid Build Coastguard Worker# Of the format: 27*795d594fSAndroid Build Coastguard Worker# 28*795d594fSAndroid Build Coastguard Worker# <key1>='<value1>'\n 29*795d594fSAndroid Build Coastguard Worker# <key2>='<value2>'\n 30*795d594fSAndroid Build Coastguard Worker# ... 31*795d594fSAndroid Build Coastguard Worker# <keyN>='<valueN>' 32*795d594fSAndroid Build Coastguard Worker# 33*795d594fSAndroid Build Coastguard Worker# Note: This is intentionally the same output format as 34*795d594fSAndroid Build Coastguard Worker# build/soong/soong_ui.bash --dumpvars-mode --vars "key1 key2 ... keyN" 35*795d594fSAndroid Build Coastguard Worker# 36*795d594fSAndroid Build Coastguard Worker# For example, this would be a valid var-cache: 37*795d594fSAndroid Build Coastguard Worker# 38*795d594fSAndroid Build Coastguard Worker# export ART_TOOLS_BUILD_VAR_CACHE="ART_APEX_JARS='core-oj core-libart'" 39*795d594fSAndroid Build Coastguard Worker# 40*795d594fSAndroid Build Coastguard Worker# Calling into soong repeatedly is very slow; whenever it needs to be done 41*795d594fSAndroid Build Coastguard Worker# more than once, the var_cache.py or var_cache.sh script should be used instead. 42*795d594fSAndroid Build Coastguard Worker# 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Workerimport os 45*795d594fSAndroid Build Coastguard Workerimport subprocess 46*795d594fSAndroid Build Coastguard Workerimport sys 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Workerdef get_build_var(name): 49*795d594fSAndroid Build Coastguard Worker """ 50*795d594fSAndroid Build Coastguard Worker Query soong build for a variable value and return it as a string. 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker Var lookup is cached, subsequent var lookups in any child process 53*795d594fSAndroid Build Coastguard Worker (that includes a var-cache is free). The var must be in 'var_list' 54*795d594fSAndroid Build Coastguard Worker to participate in the cache. 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker Example: 57*795d594fSAndroid Build Coastguard Worker host_out = var_cache.get_build_var('HOST_OUT') 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker Note that build vars can often have spaces in them, 60*795d594fSAndroid Build Coastguard Worker so the caller must take care to ensure space-correctness. 61*795d594fSAndroid Build Coastguard Worker 62*795d594fSAndroid Build Coastguard Worker Raises KeyError if the variable name is not in 'var_list'. 63*795d594fSAndroid Build Coastguard Worker """ 64*795d594fSAndroid Build Coastguard Worker _populate() 65*795d594fSAndroid Build Coastguard Worker _build_dict() 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker value = _var_cache_dict.get(name) 68*795d594fSAndroid Build Coastguard Worker if value is None: 69*795d594fSAndroid Build Coastguard Worker _debug(_var_cache_dict) 70*795d594fSAndroid Build Coastguard Worker raise KeyError("The variable '%s' is not in 'var_list', can't lookup" %(name)) 71*795d594fSAndroid Build Coastguard Worker 72*795d594fSAndroid Build Coastguard Worker return value 73*795d594fSAndroid Build Coastguard Worker 74*795d594fSAndroid Build Coastguard Worker_var_cache_dict = None 75*795d594fSAndroid Build Coastguard Worker_THIS_DIR = os.path.dirname(os.path.realpath(__file__)) 76*795d594fSAndroid Build Coastguard Worker_TOP = os.path.join(_THIS_DIR, "../../..") 77*795d594fSAndroid Build Coastguard Worker_VAR_LIST_PATH = os.path.join(_THIS_DIR, "var_list") 78*795d594fSAndroid Build Coastguard Worker_SOONG_UI_SCRIPT = os.path.join(_TOP, "build/soong/soong_ui.bash") 79*795d594fSAndroid Build Coastguard Worker_DEBUG = False 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Workerdef _populate(): 82*795d594fSAndroid Build Coastguard Worker if os.environ.get('ART_TOOLS_BUILD_VAR_CACHE'): 83*795d594fSAndroid Build Coastguard Worker return 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker _debug("Varcache missing (PY)... repopulate") 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker interesting_vars=[] 88*795d594fSAndroid Build Coastguard Worker with open(_VAR_LIST_PATH) as f: 89*795d594fSAndroid Build Coastguard Worker for line in f.readlines(): 90*795d594fSAndroid Build Coastguard Worker line = line.strip() 91*795d594fSAndroid Build Coastguard Worker if not line or line.startswith('#'): 92*795d594fSAndroid Build Coastguard Worker continue 93*795d594fSAndroid Build Coastguard Worker 94*795d594fSAndroid Build Coastguard Worker _debug(line) 95*795d594fSAndroid Build Coastguard Worker 96*795d594fSAndroid Build Coastguard Worker interesting_vars.append(line) 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker _debug("Interesting vars: ", interesting_vars) 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker # Invoke soong exactly once for optimal performance. 101*795d594fSAndroid Build Coastguard Worker var_values = subprocess.check_output([ 102*795d594fSAndroid Build Coastguard Worker _SOONG_UI_SCRIPT, '--dumpvars-mode', '-vars', " ".join(interesting_vars)], 103*795d594fSAndroid Build Coastguard Worker cwd=_TOP) 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker # Export the ART_TOOLS_BUILD_VAR_CACHE in the same format as soong_ui.bash --dumpvars-mode. 106*795d594fSAndroid Build Coastguard Worker os.environb[b'ART_TOOLS_BUILD_VAR_CACHE'] = var_values 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker _debug("Soong output: ", var_values) 109*795d594fSAndroid Build Coastguard Worker 110*795d594fSAndroid Build Coastguard Workerdef _build_dict(): 111*795d594fSAndroid Build Coastguard Worker global _var_cache_dict 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker if _var_cache_dict: 114*795d594fSAndroid Build Coastguard Worker return 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker _debug("_var_cache_build_dict()") 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker _var_cache_dict = {} 119*795d594fSAndroid Build Coastguard Worker 120*795d594fSAndroid Build Coastguard Worker # Parse $ART_TOOLS_BUILD_VAR_CACHE, e.g. 121*795d594fSAndroid Build Coastguard Worker # ART_APEX_JARS='core-oj core-libart conscrypt okhttp bouncycastle apache-xml' 122*795d594fSAndroid Build Coastguard Worker 123*795d594fSAndroid Build Coastguard Worker for line in os.environ['ART_TOOLS_BUILD_VAR_CACHE'].splitlines(): 124*795d594fSAndroid Build Coastguard Worker _debug(line) 125*795d594fSAndroid Build Coastguard Worker var_name, var_value = line.split("=") 126*795d594fSAndroid Build Coastguard Worker var_value = var_value.strip("'") 127*795d594fSAndroid Build Coastguard Worker 128*795d594fSAndroid Build Coastguard Worker _debug("Var name =", var_name) 129*795d594fSAndroid Build Coastguard Worker _debug("Var value =", var_value) 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker _var_cache_dict[var_name] = var_value 132*795d594fSAndroid Build Coastguard Worker 133*795d594fSAndroid Build Coastguard Worker _debug("Num entries in dict: ", len(_var_cache_dict)) 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Workerdef _debug(*args): 136*795d594fSAndroid Build Coastguard Worker if _DEBUG: 137*795d594fSAndroid Build Coastguard Worker print(*args, file=sys.stderr) 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker# Below definitions are for interactive use only, e.g. 140*795d594fSAndroid Build Coastguard Worker# python -c 'import var_cache; var_cache._dump_cache()' 141*795d594fSAndroid Build Coastguard Worker 142*795d594fSAndroid Build Coastguard Workerdef _dump_cache(): 143*795d594fSAndroid Build Coastguard Worker _populate() 144*795d594fSAndroid Build Coastguard Worker print(os.environ['ART_TOOLS_BUILD_VAR_CACHE']) 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker#get_build_var("xyz") 147