|  | #!/bin/bash | 
|  | # | 
|  | # Copyright (C) 2018 The Android Open Source Project | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  |  | 
|  | # | 
|  | # !!! Keep up-to-date with var_cache.py | 
|  | # | 
|  |  | 
|  | # | 
|  | # Provide a soong-build variable query mechanism that is cached | 
|  | # in the current process and any other subchild process that knows | 
|  | # how to parse the exported variable: | 
|  | # | 
|  | # export ART_TOOLS_BUILD_VAR_CACHE="..." | 
|  | # | 
|  | # Of the format: | 
|  | # | 
|  | #   <key1>='<value1>'\n | 
|  | #   <key2>='<value2>'\n | 
|  | #   ... | 
|  | #   <keyN>='<valueN>' | 
|  | # | 
|  | # Note: This is intentionally the same output format as | 
|  | #     build/soong/soong_ui.bash --dumpvars-mode --vars "key1 key2 ... keyN" | 
|  | # | 
|  | # For example, this would be a valid var-cache: | 
|  | # | 
|  | # export ART_TOOLS_BUILD_VAR_CACHE="ART_APEX_JARS='core-oj core-libart'" | 
|  | # | 
|  | # Calling into soong repeatedly is very slow; whenever it needs to be done | 
|  | # more than once, the var_cache.py or var_cache.sh script should be used instead. | 
|  | # | 
|  |  | 
|  | # ------------------------------------------------------- | 
|  |  | 
|  | # Echoes the result of get_build_var <var_name>. | 
|  | # Var lookup is cached, subsequent var lookups in any child process | 
|  | # (that includes a var-cache is free). The var must be in 'var_list' | 
|  | # to participate in the cache. | 
|  | # | 
|  | # Example: | 
|  | #    local host_out="$(get_build_var HOST_OUT)" | 
|  | # | 
|  | # Note that build vars can often have spaces in them, | 
|  | # so the caller must take care to ensure space-correctness. | 
|  | get_build_var() { | 
|  | local var_name="$1" | 
|  |  | 
|  | _var_cache_populate | 
|  | _var_cache_build_dict | 
|  |  | 
|  | if [[ ${_VAR_CACHE_DICT[$var_name]+exists} ]]; then | 
|  | echo "${_VAR_CACHE_DICT[$var_name]}" | 
|  | return 0 | 
|  | else | 
|  | echo "[ERROR] get_build_var: The variable '$var_name' is not in 'var_list', can't lookup." >&2 | 
|  | return 1 | 
|  | fi | 
|  | } | 
|  |  | 
|  | # The above functions are "public" and are intentionally not exported. | 
|  | # User scripts must have "source var_cache.sh" to take advantage of caching. | 
|  |  | 
|  | # ------------------------------------------------------- | 
|  | # Below functions are "private"; | 
|  | # do not call them outside of this file. | 
|  |  | 
|  | _var_cache_populate() { | 
|  | if [[ -n $ART_TOOLS_BUILD_VAR_CACHE ]]; then | 
|  | _var_cache_debug "ART_TOOLS_BUILD_VAR_CACHE preset to (quotes added)..." | 
|  | _var_cache_debug \""$ART_TOOLS_BUILD_VAR_CACHE"\" | 
|  | return 0 | 
|  | fi | 
|  |  | 
|  | _var_cache_debug "Varcache missing... repopulate" | 
|  |  | 
|  | local this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" | 
|  | local top="$this_dir/../../.." | 
|  |  | 
|  | local interesting_vars=() | 
|  | while read -r line; do | 
|  | if [[ -z $line ]] || [[ $line == '#'* ]]; then | 
|  | continue; | 
|  | fi | 
|  | interesting_vars+=($line) | 
|  | done < "$this_dir"/var_list | 
|  |  | 
|  | _var_cache_debug "Interesting vars: " ${interesting_vars[@]} | 
|  |  | 
|  | local flat_vars="${interesting_vars[*]}" | 
|  |  | 
|  | local var_values | 
|  | _var_cache_show_command "$top"/build/soong/soong_ui.bash --dumpvars-mode -vars=\"${interesting_vars[*]}\" | 
|  |  | 
|  | # Invoke soong exactly once for optimal performance. | 
|  | # soong_ui.bash must be invoked from $ANDROID_BUILD_TOP or it gets confused and breaks. | 
|  | var_values="$(cd "$top" && "$top"/build/soong/soong_ui.bash --dumpvars-mode -vars="$flat_vars")" | 
|  |  | 
|  | # Export the ART_TOOLS_BUILD_VAR_CACHE in the same format as soong_ui.bash --dumpvars-mode. | 
|  | export ART_TOOLS_BUILD_VAR_CACHE="$var_values" | 
|  |  | 
|  | _var_cache_debug ART_TOOLS_BUILD_VAR_CACHE=\"$var_values\" | 
|  | } | 
|  |  | 
|  | _var_cache_build_dict() { | 
|  | if [[ ${#_VAR_CACHE_DICT[@]} -ne 0 ]]; then | 
|  | # Associative arrays cannot be exported, have | 
|  | # a separate step to reconstruct the associative | 
|  | # array from a flat variable. | 
|  | return 0 | 
|  | fi | 
|  |  | 
|  | # Parse $ART_TOOLS_BUILD_VAR_CACHE, e.g. | 
|  | #   ART_APEX_JARS='core-oj core-libart conscrypt okhttp bouncycastle apache-xml' | 
|  |  | 
|  | local var_name | 
|  | local var_value | 
|  | local strip_quotes | 
|  |  | 
|  | _var_cache_debug "_var_cache_build_dict()" | 
|  |  | 
|  | declare -g -A _VAR_CACHE_DICT  # global associative array. | 
|  | while IFS='=' read -r var_name var_value; do | 
|  | if [[ -z $var_name ]]; then | 
|  | # skip empty lines, e.g. blank newline at the end | 
|  | continue | 
|  | fi | 
|  | _var_cache_debug "Var_name was $var_name" | 
|  | _var_cache_debug "Var_value was $var_value" | 
|  | strip_quotes=${var_value//\'/} | 
|  | _VAR_CACHE_DICT["$var_name"]="$strip_quotes" | 
|  | done < <(echo "$ART_TOOLS_BUILD_VAR_CACHE") | 
|  |  | 
|  | _var_cache_debug ${#_VAR_CACHE_DICT[@]} -eq 0 | 
|  | } | 
|  |  | 
|  | _var_cache_debug() { | 
|  | if ((_var_cache_debug_enabled)); then | 
|  | echo "[DBG]: " "$@" >&2 | 
|  | fi | 
|  | } | 
|  |  | 
|  | _var_cache_show_command() { | 
|  | if (( _var_cache_show_commands || _var_cache_debug_enabled)); then | 
|  | echo "$@" >&2 | 
|  | fi | 
|  | } | 
|  |  | 
|  | while true; do | 
|  | case $1 in | 
|  | --help) | 
|  | echo "Usage: $0 [--debug] [--show-commands] [--dump-cache] [--var <name>] [--var <name2>...]" | 
|  | echo "" | 
|  | echo "Exposes a function 'get_build_var' which returns the result of" | 
|  | echo "a soong build variable." | 
|  | echo "" | 
|  | echo "Primarily intended to be used as 'source var_cache.sh'," | 
|  | echo "but also allows interactive command line usage for simplifying development." | 
|  | exit 0 | 
|  | ;; | 
|  | --var) | 
|  | echo -ne "$2=" | 
|  | get_build_var "$2" | 
|  | shift | 
|  | ;; | 
|  | --debug) | 
|  | _var_cache_debug_enabled=1 | 
|  | ;; | 
|  | --show-commands) | 
|  | _var_cache_show_commands=1 | 
|  | ;; | 
|  | --dump-cache) | 
|  | _var_cache_populate | 
|  | echo "ART_TOOLS_BUILD_VAR_CACHE=\"$ART_TOOLS_BUILD_VAR_CACHE\"" | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done |