15f9996aaSopenharmony_ci#!/bin/bash
25f9996aaSopenharmony_ci# Copyright (c) 2021 Huawei Device Co., Ltd.
35f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
45f9996aaSopenharmony_ci# you may not use this file except in compliance with the License.
55f9996aaSopenharmony_ci# You may obtain a copy of the License at
65f9996aaSopenharmony_ci#
75f9996aaSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
85f9996aaSopenharmony_ci#
95f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
105f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
115f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125f9996aaSopenharmony_ci# See the License for the specific language governing permissions and
135f9996aaSopenharmony_ci# limitations under the License.
145f9996aaSopenharmony_ciset -e
155f9996aaSopenharmony_ci
165f9996aaSopenharmony_ciscript_path=$(cd $(dirname $0);pwd)
175f9996aaSopenharmony_cicode_dir=$(dirname ${script_path})
185f9996aaSopenharmony_ci
195f9996aaSopenharmony_ciif [[ "${@}" =~ "--tool-repo" && -f "${code_dir}/prebuilts.sh" ]]; then
205f9996aaSopenharmony_ci    # prebuilts.sh should be a symbolic link to a prebuilts_download.sh created by oneself.
215f9996aaSopenharmony_ci    bash ${code_dir}/prebuilts.sh $@
225f9996aaSopenharmony_cielse
235f9996aaSopenharmony_ciwhile [ $# -gt 0 ]; do
245f9996aaSopenharmony_ci  case "$1" in
255f9996aaSopenharmony_ci    -skip-ssl|--skip-ssl) # wget、npm skip ssl check, which will allow
265f9996aaSopenharmony_ci                          # hacker to get and modify data stream between server and client!
275f9996aaSopenharmony_ci    SKIP_SSL=YES
285f9996aaSopenharmony_ci    ;;
295f9996aaSopenharmony_ci    -h|--help)
305f9996aaSopenharmony_ci    HELP=YES
315f9996aaSopenharmony_ci    ;;
325f9996aaSopenharmony_ci    --disable-rich)       # disable the rich module of python
335f9996aaSopenharmony_ci    DISABLE_RICH=YES
345f9996aaSopenharmony_ci    ;;
355f9996aaSopenharmony_ci    --enable-symlink)     # enable symlink while copying node_modules
365f9996aaSopenharmony_ci    ENABLE_SYMLINK=YES
375f9996aaSopenharmony_ci    ;;
385f9996aaSopenharmony_ci    --build-arkuix)
395f9996aaSopenharmony_ci    BUILD_ARKUIX=YES
405f9996aaSopenharmony_ci    ;;
415f9996aaSopenharmony_ci    --tool-repo)
425f9996aaSopenharmony_ci    TOOL_REPO="$2"
435f9996aaSopenharmony_ci    shift
445f9996aaSopenharmony_ci    ;;
455f9996aaSopenharmony_ci    --tool-repo=*)
465f9996aaSopenharmony_ci    TOOL_REPO="${1#--tool-repo=}"
475f9996aaSopenharmony_ci    ;;
485f9996aaSopenharmony_ci    --npm-registry)
495f9996aaSopenharmony_ci    NPM_REGISTRY="$2"
505f9996aaSopenharmony_ci    shift
515f9996aaSopenharmony_ci    ;;
525f9996aaSopenharmony_ci    --npm-registry=*)
535f9996aaSopenharmony_ci    NPM_REGISTRY="${1#--npm-registry=}"
545f9996aaSopenharmony_ci    ;;
555f9996aaSopenharmony_ci    --trusted-host)
565f9996aaSopenharmony_ci    TRUSTED_HOST="$2"
575f9996aaSopenharmony_ci    shift
585f9996aaSopenharmony_ci    ;;
595f9996aaSopenharmony_ci    --trusted-host=*)
605f9996aaSopenharmony_ci    TRUSTED_HOST="${1#--trusted-host=}"
615f9996aaSopenharmony_ci    ;;
625f9996aaSopenharmony_ci    --pypi-url)           # python package index url
635f9996aaSopenharmony_ci    PYPI_URL="$2"
645f9996aaSopenharmony_ci    shift
655f9996aaSopenharmony_ci    ;;
665f9996aaSopenharmony_ci    --pypi-url=*)
675f9996aaSopenharmony_ci    PYPI_URL="${1#--pypi-url=}"
685f9996aaSopenharmony_ci    ;;
695f9996aaSopenharmony_ci    --download-sdk)       # Download the SDK if this flag is set
705f9996aaSopenharmony_ci    DOWNLOAD_SDK=YES
715f9996aaSopenharmony_ci    ;;
725f9996aaSopenharmony_ci    *)
735f9996aaSopenharmony_ci    echo "$0: Warning: unsupported parameter: $1" >&2
745f9996aaSopenharmony_ci    ;;
755f9996aaSopenharmony_ci  esac
765f9996aaSopenharmony_ci  shift
775f9996aaSopenharmony_cidone
785f9996aaSopenharmony_ci
795f9996aaSopenharmony_cicase $(uname -s) in
805f9996aaSopenharmony_ci    Linux)
815f9996aaSopenharmony_ci
825f9996aaSopenharmony_ci        host_platform=linux
835f9996aaSopenharmony_ci        glibc_version=$(getconf GNU_LIBC_VERSION | grep -oE '[0-9].[0-9]{2}')
845f9996aaSopenharmony_ci        ;;
855f9996aaSopenharmony_ci    Darwin)
865f9996aaSopenharmony_ci        host_platform=darwin
875f9996aaSopenharmony_ci        ;;
885f9996aaSopenharmony_ci    *)
895f9996aaSopenharmony_ci        echo "Unsupported host platform: $(uname -s)"
905f9996aaSopenharmony_ci        exit 1
915f9996aaSopenharmony_ciesac
925f9996aaSopenharmony_ci
935f9996aaSopenharmony_cicase $(uname -m) in
945f9996aaSopenharmony_ci    arm64)
955f9996aaSopenharmony_ci
965f9996aaSopenharmony_ci        host_cpu=arm64
975f9996aaSopenharmony_ci        host_cpu_prefix=arm64
985f9996aaSopenharmony_ci        ;;
995f9996aaSopenharmony_ci    *)
1005f9996aaSopenharmony_ci        host_cpu=x86_64
1015f9996aaSopenharmony_ci        host_cpu_prefix=x86
1025f9996aaSopenharmony_ciesac
1035f9996aaSopenharmony_ci
1045f9996aaSopenharmony_ciif [ "X${SKIP_SSL}" == "XYES" ];then
1055f9996aaSopenharmony_ci    wget_ssl_check="--skip-ssl"
1065f9996aaSopenharmony_cielse
1075f9996aaSopenharmony_ci    wget_ssl_check=''
1085f9996aaSopenharmony_cifi
1095f9996aaSopenharmony_ci
1105f9996aaSopenharmony_ciif [ "X${HELP}" == "XYES" ];then
1115f9996aaSopenharmony_ci    help="-h"
1125f9996aaSopenharmony_cielse
1135f9996aaSopenharmony_ci    help=''
1145f9996aaSopenharmony_cifi
1155f9996aaSopenharmony_ci
1165f9996aaSopenharmony_ciif [ "X${ENABLE_SYMLINK}" == "XYES" ];then
1175f9996aaSopenharmony_ci    enable_symlink="--enable-symlink"
1185f9996aaSopenharmony_cielse
1195f9996aaSopenharmony_ci    enable_symlink=''
1205f9996aaSopenharmony_cifi
1215f9996aaSopenharmony_ci
1225f9996aaSopenharmony_ciif [ ! -z "$TOOL_REPO" ];then
1235f9996aaSopenharmony_ci    tool_repo="--tool-repo $TOOL_REPO"
1245f9996aaSopenharmony_cielse
1255f9996aaSopenharmony_ci    tool_repo=''
1265f9996aaSopenharmony_cifi
1275f9996aaSopenharmony_ci
1285f9996aaSopenharmony_ciif [ ! -z "$NPM_REGISTRY" ];then
1295f9996aaSopenharmony_ci    npm_registry="--npm-registry $NPM_REGISTRY"
1305f9996aaSopenharmony_cielse
1315f9996aaSopenharmony_ci    npm_registry=''
1325f9996aaSopenharmony_cifi
1335f9996aaSopenharmony_ci
1345f9996aaSopenharmony_ciif [ ! -z "$TRUSTED_HOST" ];then
1355f9996aaSopenharmony_ci    trusted_host=$TRUSTED_HOST
1365f9996aaSopenharmony_cielif [ ! -z "$PYPI_URL" ];then
1375f9996aaSopenharmony_ci    trusted_host=${PYPI_URL/#*:\/\//}       # remove prefix part such as http:// https:// etc.
1385f9996aaSopenharmony_ci    trusted_host=${trusted_host/%[:\/]*/}   # remove suffix part including the port number
1395f9996aaSopenharmony_cielse
1405f9996aaSopenharmony_ci    trusted_host='repo.huaweicloud.com'
1415f9996aaSopenharmony_cifi
1425f9996aaSopenharmony_ci
1435f9996aaSopenharmony_ciif [ ! -z "$PYPI_URL" ];then
1445f9996aaSopenharmony_ci    pypi_url=$PYPI_URL
1455f9996aaSopenharmony_cielse
1465f9996aaSopenharmony_ci    pypi_url='http://repo.huaweicloud.com/repository/pypi/simple'
1475f9996aaSopenharmony_cifi
1485f9996aaSopenharmony_ci
1495f9996aaSopenharmony_ciif [ $UID -ne 0 ]; then
1505f9996aaSopenharmony_ci    npm_para=''
1515f9996aaSopenharmony_cielse
1525f9996aaSopenharmony_ci    npm_para='--unsafe-perm'
1535f9996aaSopenharmony_cifi
1545f9996aaSopenharmony_ci
1555f9996aaSopenharmony_ciif [ "X${BUILD_ARKUIX}" == "XYES" ];then
1565f9996aaSopenharmony_ci    build_arkuix="--build-arkuix"
1575f9996aaSopenharmony_cielse
1585f9996aaSopenharmony_ci    build_arkuix=''
1595f9996aaSopenharmony_cifi
1605f9996aaSopenharmony_ci
1615f9996aaSopenharmony_ciif [ "X${DISABLE_RICH}" == "XYES" ];then
1625f9996aaSopenharmony_ci  disable_rich='--disable-rich'
1635f9996aaSopenharmony_cielse
1645f9996aaSopenharmony_ci  set +e
1655f9996aaSopenharmony_ci  pip3 install --trusted-host $trusted_host -i $pypi_url rich;
1665f9996aaSopenharmony_ci  if [ $? -eq 0 ];then
1675f9996aaSopenharmony_ci      echo "rich installed successfully"
1685f9996aaSopenharmony_ci  else
1695f9996aaSopenharmony_ci      disable_rich='--disable-rich'
1705f9996aaSopenharmony_ci  fi
1715f9996aaSopenharmony_ci  set -e
1725f9996aaSopenharmony_cifi
1735f9996aaSopenharmony_ci
1745f9996aaSopenharmony_cicpu="--host-cpu $host_cpu"
1755f9996aaSopenharmony_ciplatform="--host-platform $host_platform"
1765f9996aaSopenharmony_ciif [[ "${glibc_version}" < "2.35" ]]; then
1775f9996aaSopenharmony_ci    glibc_version="--glibc-version GLIBC2.27"
1785f9996aaSopenharmony_cielse
1795f9996aaSopenharmony_ci    glibc_version="--glibc-version GLIBC2.35"
1805f9996aaSopenharmony_cifi
1815f9996aaSopenharmony_ciecho "prebuilts_download start"
1825f9996aaSopenharmony_ciif [ -d "${code_dir}/prebuilts/build-tools/common/nodejs" ];then
1835f9996aaSopenharmony_ci    rm -rf "${code_dir}/prebuilts/build-tools/common/nodejs"
1845f9996aaSopenharmony_ci    echo "remove nodejs"
1855f9996aaSopenharmony_cifi
1865f9996aaSopenharmony_cipython3 "${code_dir}/build/prebuilts_download.py" $wget_ssl_check $tool_repo $npm_registry $help $cpu $platform $npm_para $disable_rich $enable_symlink $build_arkuix $glibc_version
1875f9996aaSopenharmony_ciif [ -f "${code_dir}/prebuilts/cmake/linux-x86/bin/ninja" ];then
1885f9996aaSopenharmony_ci    rm -rf "${code_dir}/prebuilts/cmake/linux-x86/bin/ninja"
1895f9996aaSopenharmony_cifi
1905f9996aaSopenharmony_ciif [ -f "${code_dir}/prebuilts/cmake/windows-x86/bin/ninja.exe" ];then
1915f9996aaSopenharmony_ci    rm -rf "${code_dir}/prebuilts/cmake/windows-x86/bin/ninja.exe"
1925f9996aaSopenharmony_cifi
1935f9996aaSopenharmony_ciif [ -f "${code_dir}/prebuilts/cmake/darwin-universal/bin/ninja" ];then
1945f9996aaSopenharmony_ci    rm -rf "${code_dir}/prebuilts/cmake/darwin-universal/bin/ninja"
1955f9996aaSopenharmony_cifi
1965f9996aaSopenharmony_ciecho "remove ninja in cmake"
1975f9996aaSopenharmony_ciecho "prebuilts_download end"
1985f9996aaSopenharmony_ci
1995f9996aaSopenharmony_ciPYTHON_PATH=$(realpath $code_dir/prebuilts/python/${host_platform}-${host_cpu_prefix}/*/bin | tail -1)
2005f9996aaSopenharmony_ci
2015f9996aaSopenharmony_ciif [[ "${host_platform}" == "linux" ]]; then
2025f9996aaSopenharmony_ci    sed -i "1s%.*%#!/usr/bin/env python3%" "${PYTHON_PATH}/pip3"
2035f9996aaSopenharmony_cielif [[ "${host_platform}" == "darwin" ]]; then
2045f9996aaSopenharmony_ci    sed -i "" "1s%.*%#!/usr/bin/env python3%" "${PYTHON_PATH}/pip3"
2055f9996aaSopenharmony_cifi
2065f9996aaSopenharmony_ciprebuild_python3_path="${PYTHON_PATH}/python3"
2075f9996aaSopenharmony_ciprebuild_pip3_path="${PYTHON_PATH}/pip3"
2085f9996aaSopenharmony_ci$prebuild_python3_path $prebuild_pip3_path install --trusted-host $trusted_host -i $pypi_url idna\>\=3.7 urllib3\>\=1.26.29 pyyaml requests\>\=2.32.1 prompt_toolkit\=\=1.0.14 asn1crypto cryptography json5\=\=0.9.6
2095f9996aaSopenharmony_ciif [[ "$DOWNLOAD_SDK" == "YES" ]] && [[ ! -d "${code_dir}/prebuilts/ohos-sdk-12" && ! -d "${code_dir}/prebuilts/ohos-sdk/12" ]]; then
2105f9996aaSopenharmony_ci  $prebuild_python3_path ${code_dir}/build/scripts/download_sdk.py --branch master --product-name ohos-sdk-full-api --api-version 12
2115f9996aaSopenharmony_ci  mkdir -p ${code_dir}/prebuilts/ohos-sdk-12
2125f9996aaSopenharmony_ci  mv ${code_dir}/prebuilts/ohos-sdk ${code_dir}/prebuilts/ohos-sdk-12
2135f9996aaSopenharmony_cifi
2145f9996aaSopenharmony_ci
2155f9996aaSopenharmony_ci# llvm_ndk is merged form llvm and libcxx-ndk for compiling the native of hap
2165f9996aaSopenharmony_cillvm_dir="${code_dir}/prebuilts/clang/ohos/linux-x86_64"
2175f9996aaSopenharmony_cillvm_dir_win="${code_dir}/prebuilts/clang/ohos/windows-x86_64"
2185f9996aaSopenharmony_cillvm_dir_mac_x86="${code_dir}/prebuilts/clang/ohos/darwin-x86_64"
2195f9996aaSopenharmony_cillvm_dir_mac_arm64="${code_dir}/prebuilts/clang/ohos/darwin-arm64"
2205f9996aaSopenharmony_cillvm_dir_ohos_arm64="${code_dir}/prebuilts/clang/ohos/ohos-arm64"
2215f9996aaSopenharmony_cillvm_dir_list=($llvm_dir $llvm_dir_win $llvm_dir_mac_x86 $llvm_dir_mac_arm64 $llvm_dir_ohos_arm64)
2225f9996aaSopenharmony_ci
2235f9996aaSopenharmony_ci# copy libcxx-ndk library outside c++
2245f9996aaSopenharmony_cifunction copy_inside_cxx(){
2255f9996aaSopenharmony_cifor i in ${llvm_dir_list[@]}
2265f9996aaSopenharmony_cido
2275f9996aaSopenharmony_ci    libcxx_dir="${i}/libcxx-ndk/lib"
2285f9996aaSopenharmony_ci    if [[ -d "${i}/libcxx-ndk" ]]; then
2295f9996aaSopenharmony_ci        for file in $(ls ${libcxx_dir})
2305f9996aaSopenharmony_ci        do
2315f9996aaSopenharmony_ci            if [ ! -d "${libcxx_dir}/${file}/c++" ];then
2325f9996aaSopenharmony_ci                $(mkdir -p ${libcxx_dir}/c++)
2335f9996aaSopenharmony_ci                $(cp -r ${libcxx_dir}/${file}/* ${libcxx_dir}/c++)
2345f9996aaSopenharmony_ci                $(mv ${libcxx_dir}/c++ ${libcxx_dir}/${file}/c++)
2355f9996aaSopenharmony_ci            fi
2365f9996aaSopenharmony_ci        done
2375f9996aaSopenharmony_ci    fi
2385f9996aaSopenharmony_cidone
2395f9996aaSopenharmony_ci}
2405f9996aaSopenharmony_ci
2415f9996aaSopenharmony_cifunction update_llvm_ndk(){
2425f9996aaSopenharmony_ciif [[ -e "${llvm_dir}/llvm_ndk" ]];then
2435f9996aaSopenharmony_ci  rm -rf "${llvm_dir}/llvm_ndk"
2445f9996aaSopenharmony_cifi
2455f9996aaSopenharmony_cimkdir -p "${llvm_dir}/llvm_ndk"
2465f9996aaSopenharmony_cicp -af "${llvm_dir}/llvm/include" "${llvm_dir}/llvm_ndk"
2475f9996aaSopenharmony_cicp -rfp "${llvm_dir}/libcxx-ndk/include" "${llvm_dir}/llvm_ndk"
2485f9996aaSopenharmony_ci}
2495f9996aaSopenharmony_ci
2505f9996aaSopenharmony_ciif [[ "${BUILD_ARKUIX}" != "YES" ]]; then
2515f9996aaSopenharmony_ci    copy_inside_cxx
2525f9996aaSopenharmony_ci    echo "======copy inside cxx finished!======"
2535f9996aaSopenharmony_ci    if [[ "${host_platform}" == "linux" ]]; then
2545f9996aaSopenharmony_ci        update_llvm_ndk
2555f9996aaSopenharmony_ci        echo "======update llvm ndk finished!======"
2565f9996aaSopenharmony_ci    fi
2575f9996aaSopenharmony_cifi
2585f9996aaSopenharmony_ciecho -e "\n"
2595f9996aaSopenharmony_cifi
260