xref: /aosp_15_r20/art/tools/build/var_cache.py (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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