• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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