# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# Setup for build cache

# Avoid duplication if the file happens to be included twice.
if test -z "$bucket"; then

read branch platform master <<EOF
$(python2.7 -c 'import json; p = json.loads(open("'"$topsrcdir"'/../buildprops.json").read())["properties"]; print p["branch"], p["platform"], p["master"]' 2> /dev/null)
EOF

bucket=
if test -z "$SCCACHE_DISABLE" -a -z "$no_sccache" -a -z "$MOZ_PGO_IS_SET" -a -z "$MOZ_PGO"; then
    case "${branch}" in
    try)
        case "${master}" in
        *scl1.mozilla.com*|*.scl3.mozilla.com*)
            bucket=mozilla-releng-s3-cache-us-west-1-try
            ;;
        *use1.mozilla.com*)
            bucket=mozilla-releng-s3-cache-us-east-1-try
            ;;
        *usw2.mozilla.com*)
            bucket=mozilla-releng-s3-cache-us-west-2-try
            ;;
        esac
        ;;
    b2g-inbound|mozilla-inbound|fx-team)
        case "${master}" in
        *use1.mozilla.com*)
            bucket=mozilla-releng-s3-cache-us-east-1-prod
            ;;
        *usw2.mozilla.com*)
            bucket=mozilla-releng-s3-cache-us-west-2-prod
            ;;
        esac
        ;;
    esac
fi

if test -z "$bucket"; then
    case "$platform" in
    win*) : ;;
    *)
        ac_add_options --with-ccache
    esac
else
    if ! test -e $topsrcdir/sccache/sccache.py; then
        echo "Sccache missing in the tooltool manifest" >&2
        exit 1
    fi
    mk_add_options "export SCCACHE_BUCKET=$bucket"
    case "$master" in
    *use1.mozilla.com*|*usw2.mozilla.com*)
        mk_add_options "export SCCACHE_NAMESERVER=169.254.169.253"
        ;;
    esac
    ac_add_options "--with-compiler-wrapper=python2.7 $topsrcdir/sccache/sccache.py"
    mk_add_options MOZ_PREFLIGHT_ALL+=build/sccache.mk
    mk_add_options MOZ_POSTFLIGHT_ALL+=build/sccache.mk
    mk_add_options "UPLOAD_EXTRA_FILES+=sccache.log.gz"
    case "$platform" in
    win*)
        # sccache supports a special flag to create depfiles.
        export _DEPEND_CFLAGS='-deps$(MDDEPDIR)/$(@F).pp'
        # Windows builds have a default wrapper that needs to be overridden
        mk_add_options "export CC_WRAPPER="
        mk_add_options "export CXX_WRAPPER="
        # For now, sccache doesn't support separate PDBs so force debug info to be
        # in object files.
        mk_add_options "export COMPILE_PDB_FLAG="
        mk_add_options "export HOST_PDB_FLAG="
        mk_add_options "export MOZ_DEBUG_FLAGS=-Z7"
        ;;
    esac
fi

fi
