# Copyright 2015 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.

# Functions used to manage --aosp-prebuilts-dir=<dir> and
# --no-aosp-prebuilts options.

shell_import utils/option_parser.shi

aosp_prebuilts_dir_register_options () {
    AOSP_PREBUILTS_DIR=
    OPT_AOSP_PREBUILTS_DIR=
    option_register_var "--aosp-prebuilts-dir=<dir>" OPT_AOSP_PREBUILTS_DIR \
            "Set location of AOSP prebuilt toolchain root [autodetect]"

    OPT_NO_AOSP_PREBUILTS=
    option_register_var "--no-aosp-prebuilts" OPT_NO_AOSP_PREBUILTS \
            "Do not use prebuilt AOSP toolchain"
}

_shu_is_aosp_prebuilts_dir () {
    [ -d "$1"/gcc -a -d "$1"/clang ]
}

# Probe a given directory path $2 to see if it matches an $AOSP/prebuilts/
# directory. And if it does, set variable name $1 to its path.
# $1: Variable name
# $2: Directory to probe
_shu_probe_aosp_prebuilts_dir () {
    log2 "Probing AOSP prebuilts dir: $2"
    if [ -d "$2"/gcc -a -d "$2"/clang ]; then
        var_assign $1 "$2"
    fi
}

aosp_prebuilts_dir_parse_options () {
    if [ "$OPT_AOSP_PREBUILTS_DIR" ]; then
        if [ "$OPT_NO_AOSP_PREBUILTS" ]; then
            panic "One cannot use --aosp-prebuilts-dir and --no-aosp-prebuilts at the same time!"
        fi
        AOSP_PREBUILTS_DIR=$OPT_AOSP_PREBUILTS_DIR
        if [ ! -d "$AOSP_PREBUILTS_DIR" ]; then
            panic "Directory does not exist: $AOSP_PREBUILTS_DIR"
        fi
    elif [ -z "$OPT_NO_AOSP_PREBUILTS" ]; then
        if [ "$AOSP_DIR" ]; then
            _shu_probe_aosp_prebuilts_dir AOSP_PREBUILTS_DIR \
                    "$AOSP_DIR"/prebuilts
        else
            _shu_probe_aosp_prebuilts_dir AOSP_PREBUILTS_DIR \
                    "$(program_directory)"/../../../../prebuilts
        fi
        if [ -z "$AOSP_PREBUILTS_DIR" ]; then
            panic "Can't find <AOSP>/prebuilts/ dir, please use --aosp-prebuilts-dir=<dir> or --no-aosp-prebuilts."
        fi
        log "Auto-config: --aosp-prebuilts-dir=$AOSP_PREBUILTS_DIR  [default]"
    fi
}
