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