1#!/usr/bin/env bash 2# Copyright (c) 2021-2022 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 28usage() { 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 54build_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 cmake -B"$build_dir" ${COMMONS_CMAKE_ARGS[@]} $cmake_arguments 77 ninja -C"$build_dir" -j${CONCURRENCY} $ninja_targets 78} 79 80# Arguments: src, dst, file_list, include_pattern 81copy_into_sdk() { 82 local src="$1" 83 local dst="$2" 84 local file_list="$3" 85 local include_pattern="$4" 86 local exclude_pattern='\(/tests/\|/test/\)' 87 88 # Below construction (cd + find + cp --parents) is used to copy 89 # all files listed in file_list with their relative paths 90 # Example: cd /path/to/panda && cp --parents runtime/include/cframe.h /dst 91 # Result: /dst/runtime/include/cframe.h 92 mkdir -p "$dst" 93 cd "$src" 94 for FILE in $(cat "$file_list"); do 95 for F in $(find "$FILE" -type f | grep "$include_pattern" | grep -v "$exclude_pattern"); do 96 cp --parents "$F" "$dst" 97 done 98 done 99} 100 101linux_tools() { 102 echo "> Building linux tools..." 103 local linux_build_dir="$SDK_BUILD_ROOT/linux_host_tools" 104 local LINUX_CMAKE_ARGS=" \ 105 -DPANDA_CROSS_AARCH64_TOOLCHAIN_FILE=cmake/toolchain/cross-ohos-musl-aarch64.cmake \ 106 -DTOOLCHAIN_SYSROOT=$OHOS_SDK_NATIVE/sysroot \ 107 -DTOOLCHAIN_CLANG_ROOT=$OHOS_SDK_NATIVE/llvm \ 108 -DPANDA_WITH_ECMASCRIPT=ON" 109 local linux_build_targets="ark ark_aot ark_disasm ark_link es2panda e2p_test_plugin" 110 build_panda "$linux_build_dir" "$LINUX_CMAKE_ARGS" "$linux_build_targets" 111 copy_into_sdk "$linux_build_dir" "$PANDA_SDK_PATH/linux_host_tools" "$SCRIPT_DIR"/linux_host_tools.txt 112} 113 114windows_tools() { 115 echo "> Building windows tools..." 116 local windows_build_dir="$SDK_BUILD_ROOT/windows_host_tools" 117 local windows_cmake_args="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain/cross-clang-14-x86_64-w64-mingw32-static.cmake" 118 local windows_build_targets="es2panda ark_link" 119 build_panda "$windows_build_dir" "$windows_cmake_args" "$windows_build_targets" 120 copy_into_sdk "$windows_build_dir" "$PANDA_SDK_PATH/windows_host_tools" "$SCRIPT_DIR"/windows_host_tools.txt 121} 122 123ohos() { 124 echo "> Building runtime for OHOS ARM64..." 125 local ohos_build_dir="$SDK_BUILD_ROOT/ohos_arm64" 126 local taget_sdk_dir="$PANDA_SDK_PATH/ohos_arm64" 127 local TARGET_CMAKE_ARGS=" \ 128 -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain/cross-ohos-musl-aarch64.cmake \ 129 -DTOOLCHAIN_SYSROOT=$OHOS_SDK_NATIVE/sysroot \ 130 -DTOOLCHAIN_CLANG_ROOT=$OHOS_SDK_NATIVE/llvm \ 131 -DPANDA_ETS_INTEROP_JS=ON \ 132 -DPANDA_WITH_ECMASCRIPT=ON" 133 local ohos_build_targets="ark ark_aot arkruntime arkassembler ets_interop_js_napi e2p_test_plugin" 134 build_panda "$ohos_build_dir" "$TARGET_CMAKE_ARGS" "$ohos_build_targets" 135 copy_into_sdk "$ohos_build_dir" "$taget_sdk_dir" "$SCRIPT_DIR"/ohos_arm64.txt 136 137 echo "> Copying headers into SDK..." 138 local headers_dst="$taget_sdk_dir"/include 139 # Source headers 140 copy_into_sdk "$ARK_ROOT" "$headers_dst" "$SCRIPT_DIR"/headers.txt '\(\.h$\|\.inl$\|\.inc$\)' 141 # Generated headers 142 copy_into_sdk "$ohos_build_dir" "$headers_dst" "$SCRIPT_DIR"/gen_headers.txt '\(\.h$\|\.inl$\|\.inc$\)' 143 # Copy compiled etsstdlib into Panda SDK 144 mkdir -p "$PANDA_SDK_PATH"/ets 145 cp -r "$ohos_build_dir"/plugins/ets/etsstdlib.abc "$PANDA_SDK_PATH"/ets 146} 147 148ts_linter() { 149 echo "> Building tslinter..." 150 local linter_root="$ARK_ROOT/tools/es2panda/linter" 151 (cd "$linter_root" && npm install) 152 local tgz="$(ls "$linter_root"/bundle/panda-tslinter*tgz)" 153 mkdir -p "$PANDA_SDK_PATH"/tslinter 154 tar -xf "$tgz" -C "$PANDA_SDK_PATH"/tslinter 155 mv "$PANDA_SDK_PATH"/tslinter/package/* "$PANDA_SDK_PATH"/tslinter/ 156 rm -rf "$PANDA_SDK_PATH"/tslinter/node_modules 157 rm -rf "$PANDA_SDK_PATH"/tslinter/package 158 159 # Clean up 160 rm "$tgz" 161 rm "$linter_root"/package-lock.json 162 rm -rf "$linter_root"/build 163 rm -rf "$linter_root"/bundle 164 rm -rf "$linter_root"/dist 165 rm -rf "$linter_root"/node_modules 166} 167 168ets_std_lib() { 169 echo "> Copying ets std lib into SDK..." 170 mkdir -p "$PANDA_SDK_PATH"/ets 171 cp -r "$ARK_ROOT"/plugins/ets/stdlib "$PANDA_SDK_PATH"/ets 172} 173 174rm -r -f "$PANDA_SDK_PATH" 175ohos 176linux_tools 177windows_tools 178ts_linter 179ets_std_lib 180 181echo "> Packing NPM package..." 182cp "$SCRIPT_DIR"/package.json "$PANDA_SDK_PATH" 183cd "$PANDA_SDK_PATH" 184npm pack --pack-destination "$SDK_BUILD_ROOT" 185