1#!/usr/bin/env bash 2# Copyright (c) 2021-2024 Huawei Device Co., Ltd. 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15set -eo pipefail 16 17SCRIPT_DIR="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" 18ARK_ROOT="$SCRIPT_DIR/../.." 19 20BUILD_TYPE_RELEASE="Release" 21BUILD_TYPE_FAST_VERIFY="FastVerify" 22BUILD_TYPE_DEBUG="Debug" 23 24OHOS_SDK_NATIVE="$(realpath "$1")" 25SDK_BUILD_ROOT="$(realpath "$2")" 26PANDA_SDK_BUILD_TYPE="${3:-"$BUILD_TYPE_RELEASE"}" 27 28function usage() { 29 echo "$(basename "${BASH_SOURCE[0]}") path/to/ohos/sdk/native path/to/panda/sdk/destination build_type:[$BUILD_TYPE_RELEASE,$BUILD_TYPE_FAST_VERIFY,$BUILD_TYPE_DEBUG]" 30 exit 1 31} 32 33case "$PANDA_SDK_BUILD_TYPE" in 34"$BUILD_TYPE_RELEASE" | "$BUILD_TYPE_FAST_VERIFY" | "$BUILD_TYPE_DEBUG") ;; 35*) 36 echo "Invalid build_type option!" 37 usage 38 ;; 39esac 40 41if [ ! -d "$OHOS_SDK_NATIVE" ]; then 42 echo "Error: No such directory: $OHOS_SDK_NATIVE" 43 usage 44fi 45 46if [ -z "$SDK_BUILD_ROOT" ]; then 47 echo "Error: path to panda sdk destination is not provided" 48 usage 49fi 50 51PANDA_SDK_PATH="$SDK_BUILD_ROOT/sdk" 52 53# Arguments: build_dir, cmake_arguments, ninja_targets 54function build_panda() { 55 local build_dir="$1" 56 local cmake_arguments="$2" 57 local ninja_targets="$3" 58 59 local product_build="OFF" 60 if [ "$PANDA_SDK_BUILD_TYPE" = "$BUILD_TYPE_RELEASE" ]; then 61 product_build="ON" 62 fi 63 64 CONCURRENCY=${NPROC_PER_JOB:=$(nproc)} 65 COMMONS_CMAKE_ARGS="\ 66 -GNinja \ 67 -S$ARK_ROOT \ 68 -DCMAKE_BUILD_TYPE=$PANDA_SDK_BUILD_TYPE \ 69 -DPANDA_PRODUCT_BUILD=$product_build \ 70 -DPANDA_WITH_ECMASCRIPT=ON \ 71 -DPANDA_WITH_ETS=ON \ 72 -DPANDA_WITH_JAVA=OFF \ 73 -DPANDA_WITH_ACCORD=OFF \ 74 -DPANDA_WITH_CANGJIE=OFF" 75 76 # shellcheck disable=SC2086 77 cmake -B"$build_dir" ${COMMONS_CMAKE_ARGS[@]} $cmake_arguments 78 # shellcheck disable=SC2086 79 ninja -C"$build_dir" -j"${CONCURRENCY}" $ninja_targets 80} 81 82# Arguments: src, dst, file_list, include_pattern 83function copy_into_sdk() { 84 local src="$1" 85 local dst="$2" 86 local file_list="$3" 87 local include_pattern="$4" 88 local exclude_pattern='\(/tests/\|/test/\)' 89 90 # Below construction (cd + find + cp --parents) is used to copy 91 # all files listed in file_list with their relative paths 92 # Example: cd /path/to/panda && cp --parents runtime/include/cframe.h /dst 93 # Result: /dst/runtime/include/cframe.h 94 mkdir -p "$dst" 95 cd "$src" 96 for FILE in $(cat "$file_list"); do 97 for F in $(find "$FILE" -type f | grep "$include_pattern" | grep -v "$exclude_pattern"); do 98 cp --parents "$F" "$dst" 99 done 100 done 101} 102 103function linux_tools() { 104 echo "> Building linux tools..." 105 local linux_build_dir="$SDK_BUILD_ROOT/linux_host_tools" 106 local linux_cmake_args=" \ 107 -DPANDA_CROSS_AARCH64_TOOLCHAIN_FILE=cmake/toolchain/cross-ohos-musl-aarch64.cmake \ 108 -DTOOLCHAIN_SYSROOT=$OHOS_SDK_NATIVE/sysroot \ 109 -DTOOLCHAIN_CLANG_ROOT=$OHOS_SDK_NATIVE/llvm \ 110 -DPANDA_WITH_ECMASCRIPT=ON" 111 local linux_build_targets="ark ark_aot ark_disasm ark_link es2panda e2p_test_plugin etsnative" 112 build_panda "$linux_build_dir" "$linux_cmake_args" "$linux_build_targets" 113 copy_into_sdk "$linux_build_dir" "$PANDA_SDK_PATH/linux_host_tools" "$SCRIPT_DIR"/linux_host_tools.txt 114} 115 116function windows_tools() { 117 echo "> Building windows tools..." 118 local windows_build_dir="$SDK_BUILD_ROOT/windows_host_tools" 119 local windows_cmake_args="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain/cross-clang-14-x86_64-w64-mingw32-static.cmake" 120 local windows_build_targets="es2panda ark_link" 121 build_panda "$windows_build_dir" "$windows_cmake_args" "$windows_build_targets" 122 copy_into_sdk "$windows_build_dir" "$PANDA_SDK_PATH/windows_host_tools" "$SCRIPT_DIR"/windows_host_tools.txt 123} 124 125function ohos() { 126 echo "> Building runtime for OHOS ARM64..." 127 local ohos_build_dir="$SDK_BUILD_ROOT/ohos_arm64" 128 local taget_sdk_dir="$PANDA_SDK_PATH/ohos_arm64" 129 local target_cmake_args=" \ 130 -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain/cross-ohos-musl-aarch64.cmake \ 131 -DTOOLCHAIN_SYSROOT=$OHOS_SDK_NATIVE/sysroot \ 132 -DTOOLCHAIN_CLANG_ROOT=$OHOS_SDK_NATIVE/llvm \ 133 -DPANDA_ETS_INTEROP_JS=ON \ 134 -DPANDA_WITH_ECMASCRIPT=ON" 135 local ohos_build_targets="ark ark_aot arkruntime arkassembler ets_interop_js_napi e2p_test_plugin etsnative" 136 build_panda "$ohos_build_dir" "$target_cmake_args" "$ohos_build_targets" 137 copy_into_sdk "$ohos_build_dir" "$taget_sdk_dir" "$SCRIPT_DIR"/ohos_arm64.txt 138 139 echo "> Copying headers into SDK..." 140 local headers_dst="$taget_sdk_dir"/include 141 # Source headers 142 copy_into_sdk "$ARK_ROOT" "$headers_dst" "$SCRIPT_DIR"/headers.txt '\(\.h$\|\.inl$\|\.inc$\)' 143 # Generated headers 144 copy_into_sdk "$ohos_build_dir" "$headers_dst" "$SCRIPT_DIR"/gen_headers.txt '\(\.h$\|\.inl$\|\.inc$\)' 145 # Copy compiled etsstdlib into Panda SDK 146 mkdir -p "$PANDA_SDK_PATH"/ets 147 cp -r "$ohos_build_dir"/plugins/ets/etsstdlib.abc "$PANDA_SDK_PATH"/ets 148} 149 150function ts_linter() { 151 echo "> Building tslinter..." 152 local linter_root="$ARK_ROOT/tools/es2panda/linter" 153 (cd "$linter_root" && npm install) 154 local tgz="$(ls "$linter_root"/bundle/panda-tslinter*tgz)" 155 mkdir -p "$PANDA_SDK_PATH"/tslinter 156 tar -xf "$tgz" -C "$PANDA_SDK_PATH"/tslinter 157 mv "$PANDA_SDK_PATH"/tslinter/package/* "$PANDA_SDK_PATH"/tslinter/ 158 rm -rf "$PANDA_SDK_PATH"/tslinter/node_modules 159 rm -rf "$PANDA_SDK_PATH"/tslinter/package 160 161 # Clean up 162 rm "$tgz" 163 rm "$linter_root"/package-lock.json 164 rm -rf "$linter_root"/build 165 rm -rf "$linter_root"/bundle 166 rm -rf "$linter_root"/dist 167 rm -rf "$linter_root"/node_modules 168} 169 170function ets_std_lib() { 171 echo "> Copying ets std lib into SDK..." 172 mkdir -p "$PANDA_SDK_PATH"/ets 173 cp -r "$ARK_ROOT"/plugins/ets/stdlib "$PANDA_SDK_PATH"/ets 174} 175 176rm -r -f "$PANDA_SDK_PATH" 177ohos 178linux_tools 179windows_tools 180ts_linter 181ets_std_lib 182 183echo "> Packing NPM package..." 184cp "$SCRIPT_DIR"/package.json "$PANDA_SDK_PATH" 185cd "$PANDA_SDK_PATH" 186npm pack --pack-destination "$SDK_BUILD_ROOT" 187