#!/bin/bash
#set -x     #debug


printE() {
    echo "[1;31m$1[m"
}


printI() {
    echo "[1;33m$1[m"
}


printD() {
    echo "[0;33m$1[m"
}



setup_environment() {
    printI "Chipset: $SOC_NAME"
    case "$SOC_NAME" in
    #Kinibi family
        "mt6768kinibi")
            SOC_NAME=mt6768
            SECURE_OS_TYPE=mobicore
            SIGN_RUNTYPE_TAD=gd_mobicore410_trustlet
            SOC_ARCH=64
            ;;
        "exynos9810kinibi")
            SOC_NAME=exynos9810
            SECURE_OS_TYPE=mobicore
            SIGN_RUNTYPE_TAD=gd_mobicore400_trustlet
            SOC_ARCH=64
            TLC_NDK_VERSION=r23
            ;;
    #Qsee family
        "sdm845")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg40_tad
            QSEE_INTERNAL_SOC_NAME=sdm845
            QSEE_SECURE_NAME=SM-G965U_NA_VZW_USA0
            QSEE_BUILD_ID=WAXAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SDM845_ROOT_PATH}
            SOC_ARCH=64
            ;;
        "sm8150")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=sm8150
            QSEE_SECURE_NAME=SM-G975U_NA_VZW_USA0
            QSEE_BUILD_ID=YAQAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM8150_ROOT_PATH}
            SOC_ARCH=64
            ;;
        "sm6150"|"sm7150")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=sm6150
            QSEE_SECURE_NAME=SM-A705FN_EUR_XX_EUR0
            QSEE_BUILD_ID=PAZAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM6150_ROOT_PATH}
            SOC_ARCH=64
            ;;
        "sdm710")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg40_tad
            QSEE_INTERNAL_SOC_NAME=sdm670
            QSEE_SECURE_NAME=SM-T725_EUR_XX_EUR0
            QSEE_BUILD_ID=XAWAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SDM710_ROOT_PATH}
            SOC_ARCH=64
            ;;
        "sm8250")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=sm8250
            QSEE_SECURE_NAME=SM-G986U_NA_VZW_QKEY0
            QSEE_BUILD_ID=DARAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM8250_ROOT_PATH}
            SOC_ARCH=64
            ;;
        "sm7250")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=saipan
            QSEE_SECURE_NAME=SM-A716U_NA_TMB_QKEY1
            QSEE_BUILD_ID=JAFAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM7250_ROOT_PATH}
            SOC_ARCH=64
            ;;
        "sm7225")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=bitra
            QSEE_SECURE_NAME=SM-A426B_EUR_XX_QKEY0
            QSEE_BUILD_ID=SAJAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM7225_ROOT_PATH}
            SOC_ARCH=64
            ;;
        "sm8350")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=lahaina
            QSEE_SECURE_NAME=SM-G996U_NA_VZW_QKEY0
            QSEE_BUILD_ID=LAVAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM8350_ROOT_PATH}
            SOC_ARCH=64
            QSEE_TA_SIGNING_SCHEME=V2
            ;;
        "sm7125")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=rennell
            QSEE_SECURE_NAME=A525F_CIS_SER_QKEY0
            QSEE_BUILD_ID=MAUAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM7125_ROOT_PATH}
            SOC_ARCH=64
            ;;
        "sm7325")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=kodiak
            QSEE_SECURE_NAME=SM-A528B_EUR_XX_QKEY0
            QSEE_BUILD_ID=IAGAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM7325_ROOT_PATH}
            SOC_ARCH=64
            QSEE_TA_SIGNING_SCHEME=V2
            ;;
        "sm8450")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=waipio
            QSEE_SECURE_NAME=SM-S901U_NA_VZW_QKEY0
            QSEE_BUILD_ID=WAPIONAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM8450_ROOT_PATH}
            SOC_ARCH=64
            TLC_NDK_VERSION=r23
            QSEE_TA_SIGNING_SCHEME=V2
            QSEE_TA_SIGNING_ALGORITHM=ECDSA
            QSEE_TA_SDK_VERSION=latest
            QSEE_PYTHON_VERSION=3
            ;;
        "sm6225")
            SECURE_OS_TYPE=qsee
            SIGN_RUNTYPE_TAD=qc_secimg50_tzapp
            QSEE_INTERNAL_SOC_NAME=divar
            QSEE_SECURE_NAME=SM-A235F_CIS_SER_QKEY0
            QSEE_BUILD_ID=FATAANAA
            QSEE_TZ_BRANCH=TZ.XF.5.0
            QSEE_VER=5.0
            QSEE_ROOT_PATH=${SM6225_ROOT_PATH}
            SOC_ARCH=64
            TLC_NDK_VERSION=r23
            QSEE_TA_SIGNING_SCHEME=V2
            QSEE_TA_SDK_VERSION=1.1
            ;;
    #Teegris family
        "exynos9820")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_EXYNOS9820_SAMSUNG_TA
            TEEGRIS_VERSION=3.0
            SOC_ARCH=64
            ;;
        "exynos9610"|"exynos9611")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_EXYNOS9610_SAMSUNG_TA
            TEEGRIS_VERSION=3.0
            SOC_ARCH=64
            ;;
        "exynos7904")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_EXYNOS7904_SAMSUNG_TA
            TEEGRIS_VERSION=3.0
            SOC_ARCH=64
            ;;
        "exynos9830")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_EXYNOS9830_SAMSUNG_TA
            TEEGRIS_VERSION=4.1
            SOC_ARCH=64
            TEEGRIS_USE_RELRO=TRUE
            ;;
        "exynos9630")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_EXYNOS9630_SAMSUNG_TA
            TEEGRIS_VERSION=4.1
            SOC_ARCH=64
            TEEGRIS_USE_RELRO=TRUE
            ;;
        "exynos3830") #exynos850
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_EXYNOS3830_SAMSUNG_TA
            TEEGRIS_VERSION=4.1
            SOC_ARCH=64
            TEEGRIS_USE_RELRO=TRUE
            ;;
        "exynos9810")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_EXYNOS9810_SAMSUNG_TA
            TEEGRIS_VERSION=4.1
            SOC_ARCH=64
            TEEGRIS_USE_RELRO=TRUE
            ;;
        "exynos2100")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_EXYNOS2100_SAMSUNG_TA
            TEEGRIS_VERSION=4.2
            TEEGRIS_TA_SIGNING_SCHEME=V2
            SOC_ARCH=64
            TEEGRIS_USE_RELRO=TRUE
            ;;
        "mt6853")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_MT6853_SAMSUNG_TA
            TEEGRIS_VERSION=4.2
            TEEGRIS_TA_SIGNING_SCHEME=V2
            SOC_ARCH=64
            TEEGRIS_USE_RELRO=TRUE
            ;;
        "mt6769t")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_MT6769T_SAMSUNG_TA
            TEEGRIS_VERSION=4.2
            TEEGRIS_TA_SIGNING_SCHEME=V2
            SOC_ARCH=64
            TEEGRIS_USE_RELRO=TRUE
            ;;
        "s5e9925")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_S5E9925_SAMSUNG_TA
            TEEGRIS_VERSION=4.2.1
            TEEGRIS_TA_SIGNING_SCHEME=V2
            SOC_ARCH=64
            TLC_NDK_VERSION=r23
            TEEGRIS_USE_RELRO=TRUE
            TAD_TA_ARCH=64
            TEEGRIS_TA_TOOLCHAIN=CLANG
            ;;
        "s5e8825")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_S5E8825_SAMSUNG_TA
            TEEGRIS_VERSION=4.2.1
            TEEGRIS_TA_SIGNING_SCHEME=V2
            SOC_ARCH=64
            TLC_NDK_VERSION=r23
            TEEGRIS_USE_RELRO=TRUE
            TAD_TA_ARCH=64
            TEEGRIS_TA_TOOLCHAIN=CLANG
            ;;
        "mt6877")
            SECURE_OS_TYPE=teegris
            SIGN_MODEL=TEEGRIS_MT6877_SAMSUNG_TA
            TEEGRIS_VERSION=4.2.1
            TEEGRIS_TA_SIGNING_SCHEME=V2
            SOC_ARCH=64
            TLC_NDK_VERSION=r23
            TEEGRIS_USE_RELRO=TRUE
            TAD_TA_ARCH=64
            TEEGRIS_TA_TOOLCHAIN=CLANG
            ;;
        *)
            printE "-------------------------------------------------------------------------------------------------------------------------------"
            printE "Please check #1 parameter, SOC_NAME"
            printE "mobicore: exynos9810kinibi, mt6768kinibi"
            printE "qsee: sm8150, sm6150(=sm7150), sdm710, sm8250, sm7250, sm7225, sm8350, sm7125, sm7325, sm8450, sm6225"
            printE "teegris: exynos9820, exynos9610(=exynos9611), exynos7904, exynos9830(exynos990), exynos9630(exynos980), exynos3830(exynos850),"
            printE "         exynos9810, exynos2100, mt6853, mt6769t, s5e9925, s5e8825, mt6877"
            printE "-------------------------------------------------------------------------------------------------------------------------------"
            exit 1
            ;;
    esac

    printI "Module name: $MODULE_NAME"
    case "$MODULE_NAME" in
        "tad")
            SIGN_RUNTYPE=$SIGN_RUNTYPE_TAD
            ;;
        *)
            printE "------------------------------------------------------------------------------"
            printE "Please check #2 parameter, MODULE_NAME"
            printE "ex) tad"
            printE "-------------------------------------------------------------------------------"
            exit 1
    esac

    export COMP_PATH_BASE
    export MODULE_NAME
    export INPUT_SOC_NAME
    export SECURE_OS_TYPE
    export NDK_PATH
    export TLC_NDK_VERSION
    export SOC_ARCH
    export SOC_NAME
    export LOCAL_TA_SIGNER_PATH
    export TAD_TA_ARCH
}


build_mobicore() {
    export MOBICORE_ROOT_PATH
    export RUNTYPE=$SIGN_RUNTYPE

    if [ -z "$MOBICORE_ROOT_PATH" ]; then
        printE "Error: please set the Mobicore root path."
        exit 1
    elif [ ! -d "$MOBICORE_ROOT_PATH" ]; then
        printE "Error: MOBICORE_ROOT_PATH is not a directory: $MOBICORE_ROOT_PATH"
        exit 1
    fi
    printI "MOBICORE_ROOT_PATH : $MOBICORE_ROOT_PATH"
    
    rm -rf ${COMP_PATH_BASE}/${MODULE_NAME}/Out
    
    printD "##### TA BUILD #####"
    cd ${COMP_PATH_BASE}/${MODULE_NAME}/tl${MODULE_NAME}/build
    ./build.sh
    if [ "$?" != "0" ]; then
        printE "TA build fail."
        exit 1
    fi
    
    printD "##### CA BUILD #####"
    if [ "${TLC_NDK_VERSION}" = "r23" ]; then
        NDK_PATH="${NDK_R23_PATH}"
    fi
    
    cd ${COMP_PATH_BASE}/${MODULE_NAME}/tlc${MODULE_NAME}/build
    ./build_tlc.sh
    if [ "$?" != "0" ]; then
        printE "CA build fail."
        exit 1
    fi
    
    if [ "$SOC_ARCH" == 64 ]; then
        printD "##### 2nd CA BUILD #####"
        SOC_ARCH=32
        cd ${COMP_PATH_BASE}/${MODULE_NAME}/tlc${MODULE_NAME}/build
        ./build_tlc.sh
        if [ "$?" != "0" ]; then
            printE "2nd CA build fail."
            exit 1
        fi
    fi
}


build_qsee() {
    if [ "$QSEE_TA_SIGNING_SCHEME" == "V2" ]; then
        if [ -z "$LOCAL_TA_SIGNER_PATH" ]; then
            printE "Error: please set the path to LocalTASigner.jar for new TA signing scheme"
            exit 1
        elif [ -d "$LOCAL_TA_SIGNER_PATH" ]; then
            printE "Error: LOCAL_TA_SIGNER_PATH can't be a directory: $LOCAL_TA_SIGNER_PATH"
            exit 1
        fi
    fi

    if [ -z "$QSEE_ROOT_PATH" ]; then
        printE "Error: please set the android root path. For example for msm8998, export MSM8998_ROOT_PATH=/data/DREAM2QLTE"
        exit 1
    elif [ ! -d "$QSEE_ROOT_PATH" ]; then
        printE "Error: QSEE_ROOT_PATH is not a directory: $QSEE_ROOT_PATH"
        exit 1
    fi
    printI "QSEE_ROOT_PATH : $QSEE_ROOT_PATH"

    rm -rf ${COMP_PATH_BASE}/${MODULE_NAME}/Out

    if [ "$QSEE_TA_SDK_VERSION" ]; then
        BUILD_ROOT=$QSEE_ROOT_PATH/nhlos/qtee_tas
        SDK_ROOT=$BUILD_ROOT/sdk/$QSEE_TA_SDK_VERSION/external
        cp -r $COMP_PATH_BASE/$MODULE_NAME/env/$INPUT_SOC_NAME/qtee_tas/* $BUILD_ROOT/ || exit 1
        cd $BUILD_ROOT
        source ./buildss_env.sh || exit 1
    else
        BUILD_ROOT=$QSEE_ROOT_PATH/nhlos/trustzone_images
        cd $BUILD_ROOT/build/ms
    fi

    if [ "$QSEE_TA_SDK_VERSION" ]; then
        OBJECT_PATH=$BUILD_ROOT/apps/bsp/trustzone/qsapps/$MODULE_NAME
        SOURCE_PATH=$BUILD_ROOT/apps/securemsm/trustzone/qsapps/$MODULE_NAME
        BUILD_COMMAND="$SCONS -C $SOURCE_PATH/build -j8 qtee_sdk_version=$QSEE_TA_SDK_VERSION"
        printI "COMMON SDK BUILD COMMAND : $BUILD_COMMAND"
    elif [ "$QSEE_VER" == "5.0" ]; then
        OBJECT_PATH=../../ssg/bsp/trustzone/qsapps/$MODULE_NAME
        SOURCE_PATH=../../ssg/securemsm/trustzone/qsapps/$MODULE_NAME
        BUILD_COMMAND="python build_all.py --branch $QSEE_TZ_BRANCH --config=build_config_deploy.xml"
    elif [ "$QSEE_VER" == "4.0" ]; then
        OBJECT_PATH=../../core/bsp/trustzone/qsapps/$MODULE_NAME
        SOURCE_PATH=../../core/securemsm/trustzone/qsapps/$MODULE_NAME
        if [ -n "$QSEE_TZ_BRANCH" ]; then
            BUILD_COMMAND="python build_all.py --branch $QSEE_TZ_BRANCH"
        else
            BUILD_COMMAND="./build.sh"
        fi
    else    #QSEE 3.0
        OBJECT_PATH=../../core/bsp/trustzone/qsapps/$MODULE_NAME
        SOURCE_PATH=../../core/securemsm/trustzone/qsapps/$MODULE_NAME
        BUILD_COMMAND=./build_qsapps.sh
    fi

    rm -rf $OBJECT_PATH
    rm -rf $SOURCE_PATH
    cp -r $COMP_PATH_BASE/$MODULE_NAME/tl$MODULE_NAME/ $SOURCE_PATH

    if [ "$INPUT_SOC_NAME" ] && [ -z "$QSEE_TA_SDK_VERSION" ]; then
        find $BUILD_ROOT/core \
            \( -name "*.xml" -o -name "SConscript" \) -exec chmod a+w {} \;
        cp -r $COMP_PATH_BASE/$MODULE_NAME/env/$INPUT_SOC_NAME/tl/* ../../ || exit 1
        if [ "$QSEE_REMOVE_SCONSCRIPT" == "true" ]; then
            rm -rf $BUILD_ROOT/core/securemsm/trustzone/qsapps/${MODULE_NAME}/build/SConscript
        fi
    fi

    if [ -f ./buildss_env.sh ] && [ -z "$QSEE_TA_SDK_VERSION" ]; then
        source ./buildss_env.sh || exit 1
    fi

    printD "##### TA BUILD #####"
    $BUILD_COMMAND CHIPSET=$QSEE_INTERNAL_SOC_NAME $MODULE_NAME -c
    $BUILD_COMMAND CHIPSET=$QSEE_INTERNAL_SOC_NAME $MODULE_NAME
    if [ "$?" != "0" ]; then
        printE "TA build fail."
        exit 1
    fi

    printD "##### SIGNING #####"
    if [ "$SIGN_FLAG" != "unsign" ]; then
        if [ "$QSEE_TA_SIGNING_SCHEME" == "V2" ]; then
            SIGNER=$LOCAL_TA_SIGNER_PATH
            if [ "$QSEE_TA_SIGNING_ALGORITHM" == "ECDSA" ]; then
                SIGNING_ALGORITHM_OPTION="-alg ECDSA"
            fi
        else
            SIGNER=${QSEE_ROOT_PATH}/nhlos/common/build/signclient.jar
        fi

        UNSIGNED_TA=$BUILD_ROOT/build/ms/bin/${QSEE_BUILD_ID}/unsigned/${MODULE_NAME}.mbn
        if [ ! -f ${UNSIGNED_TA} ]; then
            UNSIGNED_TA=$BUILD_ROOT/build/ms/bin/${QSEE_BUILD_ID}/${MODULE_NAME}.mbn
        fi
        SIGNED_TA=${BUILD_ROOT}/build/ms/bin/${QSEE_BUILD_ID}/signed_${MODULE_NAME}.mbn

        java -jar ${SIGNER} -model ${QSEE_SECURE_NAME} -runtype ${SIGN_RUNTYPE} -input ${UNSIGNED_TA} -output ${SIGNED_TA} ${SIGNING_ALGORITHM_OPTION}
        if [ "$?" != "0" ]; then
            printE "Signing fail."
            exit 1
        fi
    else
        printD "skip"
    fi

    printD "##### SPLIT #####"
    PYTHON_VERSION=python
    if [ "$QSEE_PYTHON_VERSION" == "3" ]; then
        PYTHON_VERSION=python3
    fi

    if [ "$QSEE_TA_SDK_VERSION" ]; then
        PIL_SPLITTER_PATH=$SDK_ROOT/scripts/pil_splitter.py
    else
        PIL_SPLITTER_PATH=$BUILD_ROOT/ssg/bsp/build/scripts/pil_splitter.py
    fi

    SPLITTED_TA=${BUILD_ROOT}/build/ms/bin/PIL_IMAGES/SPLITBINS_${QSEE_BUILD_ID}/${MODULE_NAME}
    if [ "$SIGN_FLAG" != "unsign" ]; then
        $PYTHON_VERSION $PIL_SPLITTER_PATH ${SIGNED_TA} ${SPLITTED_TA}
    else
        $PYTHON_VERSION $PIL_SPLITTER_PATH ${UNSIGNED_TA} ${SPLITTED_TA}
    fi

    TEMP_SOC_ARCH=$SOC_ARCH

    printD "##### CA BUILD #####"
    if [ "${TLC_NDK_VERSION}" = "r23" ]; then
        NDK_PATH="${NDK_R23_PATH}"
    fi

    cd $COMP_PATH_BASE/$MODULE_NAME/tlc$MODULE_NAME/build
    ./build_tlc.sh
    if [ "$?" != "0" ]; then
        printE "CA build fail."
        exit 1
    fi

    if [ "$SOC_ARCH" == 64 ]; then
        printD "##### 2nd CA BUILD #####"
        SOC_ARCH=32
        cd $COMP_PATH_BASE/$MODULE_NAME/tlc$MODULE_NAME/build
        ./build_tlc.sh
        if [ "$?" != "0" ]; then
            printE "2nd CA build fail."
            exit 1
        fi
    fi

    export OS_VERSION=_overQ
    OTHER_CA_PATH=${COMP_PATH_BASE}/${MODULE_NAME}/env/${INPUT_SOC_NAME}/tlc${OS_VERSION}
    if [ -d "$OTHER_CA_PATH" ]; then
        SOC_ARCH=$TEMP_SOC_ARCH
        printD "##### CA BUILD$OS_VERSION #####"
        cd $COMP_PATH_BASE/$MODULE_NAME/tlc$MODULE_NAME/build
        ./build_tlc.sh
        if [ "$?" != "0" ]; then
            printE "CA build fail."
            exit 1
        fi

        if [ "$SOC_ARCH" == 64 ]; then
            printD "##### 2nd CA BUILD$OS_VERSION #####"
            SOC_ARCH=32
            cd $COMP_PATH_BASE/$MODULE_NAME/tlc$MODULE_NAME/build
            ./build_tlc.sh
            if [ "$?" != "0" ]; then
                printE "2nd CA build fail."
                exit 1
            fi
        fi
    fi
}


build_teegris() {
    export TEEGRIS_SDK_PATH
    export SIGN_MODEL
    export TEEGRIS_USE_RELRO
    export TEEGRIS_TA_SIGNING_SCHEME
    export TEEGRIS_TA_TOOLCHAIN

    if [ "$TEEGRIS_VERSION" == "3.0" ]; then
        TEEGRIS_SDK_PATH=${TEEGRIS_SDK3_PATH}
    elif [ "$TEEGRIS_VERSION" == "4.1" ]; then
        TEEGRIS_SDK_PATH=${TEEGRIS_SDK4_PATH}
    elif [ "$TEEGRIS_VERSION" == "4.2" ]; then
        TEEGRIS_SDK_PATH=${TEEGRIS_SDK4_2_PATH}
    elif [ "$TEEGRIS_VERSION" == "4.2.1" ]; then
        TEEGRIS_SDK_PATH=${TEEGRIS_SDK4_2_1_PATH}
    else
        printE "Error: please set the TEEGRIS SDK path, e.g. export TEEGRIS_SDK3_PATH=/opt/TOOLS/teegris_sdk_3.0 or export TEEGRIS_SDK4_PATH=/opt/TOOLS/teegris_sdk_4.1 or export TEEGRIS_SDK4_2_PATH=/opt/TOOLS/teegris_sdk_4.2"
        exit 1
    fi
    printI "TEEGRIS_SDK_PATH: $TEEGRIS_SDK_PATH"

    rm -rf ${COMP_PATH_BASE}/${MODULE_NAME}/Out

    printD "##### TA BUILD #####"
    cd ${COMP_PATH_BASE}/$MODULE_NAME/tl$MODULE_NAME/build/ || exit 1
    make clean
    make all
    if [ "$?" != "0" ]; then
        printE "TA build fail."
        exit 1
    fi
    
    printD "##### CA BUILD #####"
    if [ "${TLC_NDK_VERSION}" = "r23" ]; then
        NDK_PATH="${NDK_R23_PATH}"
    fi

    cd ${COMP_PATH_BASE}/${MODULE_NAME}/tlc${MODULE_NAME}/build
    ./build_tlc.sh
    if [ "$?" != "0" ]; then
        printE "CA build fail."
        exit 1
    fi

    if [ "$SOC_ARCH" == 64 ]; then
        printD "##### 2nd CA BUILD #####"
        SOC_ARCH=32
        cd ${COMP_PATH_BASE}/${MODULE_NAME}/tlc${MODULE_NAME}/build
        ./build_tlc.sh
        if [ "$?" != "0" ]; then
            printE "2nd CA build fail."
            exit 1
        fi
    fi
}


run_build() {
    if [ "$SECURE_OS_TYPE" == "mobicore" ]; then
        build_mobicore
    elif [ "$SECURE_OS_TYPE" == "qsee" ]; then
        build_qsee
    elif [ "$SECURE_OS_TYPE" == "teegris" ]; then
        build_teegris
    fi
}


publish() {
    rm -rf ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/
    mkdir -p ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/
    cp ${COMP_PATH_BASE}/${MODULE_NAME}/Out/local/arm64-v8a/lib${MODULE_NAME}_arm64.so ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/ || exit 1
    cp ${COMP_PATH_BASE}/${MODULE_NAME}/Out/local/armeabi-v7a/lib${MODULE_NAME}_arm.so ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/ || exit 1

    if [ -d "$OTHER_CA_PATH" ]; then
        cp ${COMP_PATH_BASE}/${MODULE_NAME}/Out/local/arm64-v8a/lib${MODULE_NAME}${OS_VERSION}_arm64.so ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/ || exit 1
        cp ${COMP_PATH_BASE}/${MODULE_NAME}/Out/local/armeabi-v7a/lib${MODULE_NAME}${OS_VERSION}_arm.so ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/ || exit 1
    fi

    if [ "$SECURE_OS_TYPE" == "mobicore" ]; then
        if [ -d "${COMP_PATH_BASE}/${MODULE_NAME}/Out/Bin/GNU/" ]; then
            TL_PATH=${COMP_PATH_BASE}/${MODULE_NAME}/Out/Bin/GNU/Debug/*.tlbin
        else
            TL_PATH=${COMP_PATH_BASE}/${MODULE_NAME}/Out/Bin/Debug/*.tlbin
        fi
        cp ${TL_PATH} ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/ || exit 1
    elif [ "$SECURE_OS_TYPE" == "qsee" ]; then
        cp ${UNSIGNED_TA} ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/unsigned_${MODULE_NAME}.mbn || exit 1
        cp ${SIGNED_TA} ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/ || exit 1
        cp ${SPLITTED_TA}* ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/
    elif [ "$SECURE_OS_TYPE" == "teegris" ]; then
        cp ${COMP_PATH_BASE}/${MODULE_NAME}/Out/ta/signed/* ${COMP_PATH_BASE}/Output/${INPUT_SOC_NAME}/ || exit 1
	fi
}

########
# main #
########
COMP_PATH_BASE=$PWD/../
SOC_NAME=$1
MODULE_NAME=$2
INPUT_SOC_NAME=$SOC_NAME

source setup.mk
if [ -z "$NDK_PATH" ]; then
    printE "Error: please set the NDK path, e.g. export NDK_PATH=/opt/android-ndk-r10e"
    exit 1
elif [ ! -d "$NDK_PATH" ]; then
    printE "Error: NDK_PATH is not a directory: $NDK_PATH"
    exit 1
fi
printI "NDK_PATH : $NDK_PATH"

if [ -z "$NDK_R23_PATH" ]; then
    printE "Error: please set the NDK R23 path, e.g. export NDK_R23_PATH=/opt/android-ndk-r23"
    exit 1
elif [ ! -d "$NDK_R23_PATH" ]; then
    printE "Error: NDK_R23_PATH is not a directory: $NDK_R23_PATH"
    exit 1
fi
printI "NDK_R23_PATH : $NDK_R23_PATH"

setup_environment
if [ "$?" != "0" ]; then
    printE "env setup fail."
    exit 1
fi

run_build
if [ "$?" != "0" ]; then
    printE "build fail."
    exit 1
fi

publish
if [ "$?" != "0" ]; then
    printE "publish fail."
    exit 1
fi

printI "Build complete. " $(date)
