#!/bin/bash -e

#
#    Copyright (c) 2020 Project CHIP Authors
#    All rights reserved.
#
#    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.
#

# This script connects Xcode's "Run Script" build phase to a build of CHIP for Apple's environments.
#
# Conventions used in this script:
#  * Variables in upper case supplied by Xcode (or other executor), are exported to subprocesses, or
#      are upper-case elsewhere in CHIP scripts (e.g. CHIP_ROOT is only used locally,
#      but is all uppper). Variables defined herein and used locally are lower-case
#

CHIP_ROOT=$(cd "$(dirname "$0")/../../.." && pwd)

function format_gn_str() {
    local val="$1"
    val="${val//\\/\\\\}"         # escape '\'
    val="${val//\$/\\\$}"         # escape '$'
    echo -n "\"${val//\"/\\\"}\"" # escape '"'
}

function format_gn_list() {
    local val sep=
    echo -n "["
    for val in "$@"; do
        echo -n "$sep"
        format_gn_str "$val"
        sep=", "
    done
    echo "]"
}

# We only have work to do for the `installapi` and `build` phases
[[ "$ACTION" == installhdrs ]] && exit 0

mkdir -p "$TEMP_DIR"

# For debugging, save off environment that Xcode gives us, can source it to
# retry/repro failures from a bash terminal
#export >"$TEMP_DIR/env.sh"
#set -x

# Forward defines from Xcode (GCC_PREPROCESSOR_DEFINITIONS)
declare -a target_defines=()
read -r -a xcode_defines <<<"$GCC_PREPROCESSOR_DEFINITIONS"
for define in "${xcode_defines[@]}"; do
    # skip over those that GN does for us
    case "$define" in
        CHIP_HAVE_CONFIG_H) continue ;;
    esac
    target_defines+=("$define")
done

# Forward C/C++ flags (OTHER_C*FLAGS)
declare -a target_cflags=()
read -r -a target_cflags_c <<<"$OTHER_CFLAGS"
read -r -a target_cflags_cc <<<"$OTHER_CPLUSPLUSFLAGS"

# Handle target OS and arch
declare target_arch=
declare target_cpu=
declare target_cflags=
declare current_arch="$(uname -m)"

read -r -a archs <<<"$ARCHS"
for arch in "${archs[@]}"; do
    if [ -z "$target_arch" ] || [ "$arch" = "$current_arch" ]; then
        target_arch="$arch"
        case "$arch" in
            x86_64) target_cpu="x64" ;;
            *) target_cpu="$arch" ;;
        esac
    fi
    target_cflags+=(-arch "$arch")
done

# Translate other options
[[ $CHIP_ENABLE_ENCODING_SENTINEL_ENUM_VALUES == YES ]] && target_defines+=("CHIP_CONFIG_IM_ENABLE_ENCODING_SENTINEL_ENUM_VALUES=1")
[[ $ENABLE_BITCODE == YES ]] && target_cflags+=("-flto")

declare -a args=(
    'default_configs_cosmetic=[]' # suppress colorization
    'chip_crypto="boringssl"'
    'chip_build_controller_dynamic_server=false'
    'chip_build_tools=false'
    'chip_build_tests=false'
    'chip_enable_wifi=false'
    'chip_enable_python_modules=false'
    'chip_device_config_enable_dynamic_mrp_config=true'
    'chip_log_message_max_size=4096' # might as well allow nice long log messages
    'chip_disable_platform_kvs=true'
    'enable_fuzz_test_targets=false'
    "target_cpu=\"$target_cpu\""
    "mac_target_arch=\"$target_arch\""
    "mac_deployment_target=\"$LLVM_TARGET_TRIPLE_OS_VERSION$LLVM_TARGET_TRIPLE_SUFFIX\""
    "target_defines=$(format_gn_list "${target_defines[@]}")"
    "target_cflags=$(format_gn_list "${target_cflags[@]}")"
    "target_cflags_c=$(format_gn_list "${target_cflags_c[@]}")"
    "target_cflags_cc=$(format_gn_list "${target_cflags_cc[@]}")"
)

case "$CONFIGURATION" in
    Debug) args+=('is_debug=true') ;;
    Release) args+=('is_debug=false') ;;
esac

[[ $PLATFORM_FAMILY_NAME != macOS ]] && {
    args+=(
        'target_os="ios"'
        'import("//config/ios/args.gni")'
    )
}

[[ $PLATFORM_FAMILY_NAME == macOS ]] && {
    args+=(
        'target_os="mac"'
    )
}

[[ $CHIP_INET_CONFIG_ENABLE_IPV4 == NO ]] && {
    args+=(
        'chip_inet_config_enable_ipv4=false'
    )
}

[[ $CHIP_IS_ASAN == YES || $ENABLE_ADDRESS_SANITIZER == YES ]] && {
    args+=(
        'is_asan=true'
    )
}

[[ $CHIP_IS_UBSAN == YES || $ENABLE_UNDEFINED_BEHAVIOR_SANITIZER == YES ]] && {
    args+=(
        'is_ubsan=true'
    )
}

[[ $CHIP_IS_TSAN == YES || $ENABLE_THREAD_SANITIZER == YES ]] && {
    args+=(
        'is_tsan=true'
        # The system stats stuff races on the stats in various ways,
        # so just disable it when using TSan.
        'chip_system_config_provide_statistics=false'
    )
}

[[ $CHIP_IS_CLANG == YES ]] && {
    args+=(
        'is_clang=true'
    )
}

[[ $CHIP_IS_BLE == NO ]] && {
    args+=(
        'chip_config_network_layer_ble=false'
    )
}

[[ $CHIP_ENABLE_ENCODING_SENTINEL_ENUM_VALUES == YES ]] && {
    args+=(
        'enable_encoding_sentinel_enum_values=true'
    )
}

# search current (or $2) and its parent directories until
#  a name match is found, which is output on stdout
find_in_ancestors() {
    declare to_find="${1}"
    declare dir="${2:-$(pwd)}"

    while [[ ! -e ${dir}/${to_find} && -n ${dir} ]]; do
        dir=${dir%/*}
    done

    if [[ ! -e ${dir}/${to_find} ]]; then
        printf 'error: find_in_ancestors: %s not found\n' "$to_find" >&2
        return 1
    fi
    printf '%s\n' "$dir/$to_find"
}

# actual build stuff
{
    cd "$CHIP_ROOT"

    if ENV=$(find_in_ancestors chip_xcode_build_connector_env.sh 2>/dev/null); then
        . "$ENV"
    fi

    # there are environments where these bits are unwanted, unnecessary, or impossible
    [[ -n $CHIP_NO_SUBMODULES ]] || scripts/checkout_submodules.py --shallow --platform darwin
    if [[ -z $CHIP_NO_ACTIVATE ]]; then
        # first run bootstrap/activate in an external env to build everything
        env -i PW_ENVSETUP_NO_BANNER=1 PW_ENVSETUP_QUIET=1 bash -c '. scripts/activate.sh'
        # now source activate for env vars
        opts="$(set +o)"
        set +ex
        PW_ENVSETUP_NO_BANNER=1 PW_ENVSETUP_QUIET=1 . scripts/activate.sh
        eval "$opts"
    fi

    # put build intermediates in TEMP_DIR
    cd "$TEMP_DIR"

    # generate and build
    set -x
    gn --root="$CHIP_ROOT" gen --check out --args="${args[*]}"
    exec ninja -v -C out
}
