1a513582eSopenharmony_ci#!/bin/bash
2a513582eSopenharmony_ci
3a513582eSopenharmony_ci# Copyright (c) 2022 Huawei Device Co., Ltd.
4a513582eSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
5a513582eSopenharmony_ci# you may not use this file except in compliance with the License.
6a513582eSopenharmony_ci# You may obtain a copy of the License at
7a513582eSopenharmony_ci#
8a513582eSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
9a513582eSopenharmony_ci#
10a513582eSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
11a513582eSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
12a513582eSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a513582eSopenharmony_ci# See the License for the specific language governing permissions and
14a513582eSopenharmony_ci#  limitations under the License.
15a513582eSopenharmony_ci
16a513582eSopenharmony_ciset -e
17a513582eSopenharmony_ci
18a513582eSopenharmony_ciCUR_PATH=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)
19a513582eSopenharmony_ciBASE_PATH=$(dirname ${CUR_PATH})
20a513582eSopenharmony_ciROOT_PATH=$(cd ${CUR_PATH}/../../.. && pwd) && cd -
21a513582eSopenharmony_ci
22a513582eSopenharmony_ciarg_project=""
23a513582eSopenharmony_ciarg_sdk_path=""
24a513582eSopenharmony_ciarg_build_sdk="false"
25a513582eSopenharmony_ciarg_help="0"
26a513582eSopenharmony_ciarg_url=""
27a513582eSopenharmony_ciarg_branch=""
28a513582eSopenharmony_ciarg_npm=""
29a513582eSopenharmony_ciarg_ohpm=""
30a513582eSopenharmony_ciarg_out_path="${ROOT_PATH}/out/hap"
31a513582eSopenharmony_ciarg_sign_tool="${ROOT_PATH}/developtools/hapsigner/dist"
32a513582eSopenharmony_ciarg_p7b=""
33a513582eSopenharmony_ciarg_apl="normal"
34a513582eSopenharmony_ciarg_feature="hos_normal_app"
35a513582eSopenharmony_ciarg_profile="UnsgnedReleasedProfileTemplate.json"
36a513582eSopenharmony_ciarg_bundle_name=""
37a513582eSopenharmony_ci
38a513582eSopenharmony_ciohos_sdk_path="${ROOT_PATH}/out/sdk/packages/ohos-sdk/linux"
39a513582eSopenharmony_ci
40a513582eSopenharmony_cifunction print_help() {
41a513582eSopenharmony_ci  cat <<EOF
42a513582eSopenharmony_ci  use assembleHap [options] <mainclass> [args...]
43a513582eSopenharmony_ci
44a513582eSopenharmony_ciEOF
45a513582eSopenharmony_ci}
46a513582eSopenharmony_ci
47a513582eSopenharmony_ci
48a513582eSopenharmony_cifunction clear_dir(){
49a513582eSopenharmony_ci        if [ ! -d "$1" ]; then
50a513582eSopenharmony_ci                mkdir -p $1
51a513582eSopenharmony_ci        fi
52a513582eSopenharmony_ci}
53a513582eSopenharmony_ci
54a513582eSopenharmony_ci
55a513582eSopenharmony_cifunction is_project_root(){
56a513582eSopenharmony_ci        if [ -f $1"/build-profile.json5" ]; then
57a513582eSopenharmony_ci                return 0
58a513582eSopenharmony_ci        else
59a513582eSopenharmony_ci                return 1
60a513582eSopenharmony_ci        fi
61a513582eSopenharmony_ci}
62a513582eSopenharmony_ci
63a513582eSopenharmony_cifunction build_sdk() {
64a513582eSopenharmony_ci	if [ -d ${ohos_sdk_path} ]; then
65a513582eSopenharmony_ci			echo "ohos-sdk exists."
66a513582eSopenharmony_ci			return 0
67a513582eSopenharmony_ci	fi
68a513582eSopenharmony_ci	SDK_PREBUILTS_PATH=${ROOT_PATH}/out/sdk/packages/ohos-sdk
69a513582eSopenharmony_ci	pushd ${ROOT_PATH}
70a513582eSopenharmony_ci		echo "building the latest ohos-sdk..."
71a513582eSopenharmony_ci		./build.py --product-name ohos-sdk --load-test-config=false --get-warning-list=false --stat-ccache=false --compute-overlap-rate=false --deps-guard=false --generate-ninja-trace=false --gn-args skip_generate_module_list_file=true sdk_platform=linux ndk_platform=linux use_cfi=false use_thin_lto=false enable_lto_O0=true sdk_check_flag=false enable_ndk_doxygen=false archive_ndk=false sdk_for_hap_build=true
72a513582eSopenharmony_ci		if [[ "$?" -ne 0 ]]; then
73a513582eSopenharmony_ci		echo "ohos-sdk build failed! You can try to use '--no-prebuilt-sdk' to skip the build of ohos-sdk."
74a513582eSopenharmony_ci		exit 1
75a513582eSopenharmony_ci		fi
76a513582eSopenharmony_ci		if [ -d "${SDK_PREBUILTS_PATH}/linux" ]; then
77a513582eSopenharmony_ci			rm -rf ${SDK_PREBUILTS_PATH}/linux
78a513582eSopenharmony_ci		fi
79a513582eSopenharmony_ci		mkdir -p ${SDK_PREBUILTS_PATH}
80a513582eSopenharmony_ci		mv ${ROOT_PATH}/out/sdk/ohos-sdk/linux ${SDK_PREBUILTS_PATH}/
81a513582eSopenharmony_ci		mkdir -p ${SDK_PREBUILTS_PATH}/linux/native
82a513582eSopenharmony_ci		mv ${ROOT_PATH}/out/sdk/sdk-native/os-irrelevant/* ${SDK_PREBUILTS_PATH}/linux/native/
83a513582eSopenharmony_ci		mv ${ROOT_PATH}/out/sdk/sdk-native/os-specific/linux/* ${SDK_PREBUILTS_PATH}/linux/native/
84a513582eSopenharmony_ci		pushd ${SDK_PREBUILTS_PATH}/linux
85a513582eSopenharmony_ci		api_version=$(grep apiVersion toolchains/oh-uni-package.json | awk '{print $2}' | sed -r 's/\",?//g') || api_version="11"
86a513582eSopenharmony_ci		mkdir -p $api_version
87a513582eSopenharmony_ci		for i in */; do
88a513582eSopenharmony_ci			if [ -d "$i" ] && [ "$i" != "$api_version/" ]; then
89a513582eSopenharmony_ci				mv $i $api_version
90a513582eSopenharmony_ci			fi
91a513582eSopenharmony_ci		done
92a513582eSopenharmony_ci		popd
93a513582eSopenharmony_ci	popd
94a513582eSopenharmony_ci}
95a513582eSopenharmony_ci
96a513582eSopenharmony_cifunction parse_arguments() {
97a513582eSopenharmony_ci	local helperKey="";
98a513582eSopenharmony_ci	local helperValue="";
99a513582eSopenharmony_ci	local current="";
100a513582eSopenharmony_ci
101a513582eSopenharmony_ci 	while [ "$1" != "" ]; do
102a513582eSopenharmony_ci		current=$1;
103a513582eSopenharmony_ci      		helperKey=${current#*--};
104a513582eSopenharmony_ci      		helperKey=${helperKey%%=*};
105a513582eSopenharmony_ci      		helperKey=$(echo "$helperKey" | tr '-' '_');
106a513582eSopenharmony_ci      		helperValue=${current#*=};
107a513582eSopenharmony_ci      		if [ "$helperValue" == "$current" ]; then
108a513582eSopenharmony_ci        		helperValue="1";
109a513582eSopenharmony_ci      		fi
110a513582eSopenharmony_ci      		#echo "eval arg_$helperKey=\"$helperValue\"";
111a513582eSopenharmony_ci
112a513582eSopenharmony_ci      		eval "arg_$helperKey=\"$helperValue\"";
113a513582eSopenharmony_ci      		shift
114a513582eSopenharmony_ci  	done
115a513582eSopenharmony_ci}
116a513582eSopenharmony_ci
117a513582eSopenharmony_ci
118a513582eSopenharmony_ciparse_arguments "${@}";
119a513582eSopenharmony_ci
120a513582eSopenharmony_ciif [ "$arg_help" != "0" ]; then
121a513582eSopenharmony_ci        print_help;
122a513582eSopenharmony_ci        exit 1;
123a513582eSopenharmony_cifi
124a513582eSopenharmony_ci
125a513582eSopenharmony_ci# Called in the warm-up process to ensure that the docker is the latest SDK every day
126a513582eSopenharmony_ci# Called like this: ./build.sh --build_sdk
127a513582eSopenharmony_ciif [ "$arg_build_sdk" == "1" ]; then
128a513582eSopenharmony_ci        rm -rf ${ohos_sdk_path}
129a513582eSopenharmony_ci        build_sdk
130a513582eSopenharmony_ci        exit 0;
131a513582eSopenharmony_cifi
132a513582eSopenharmony_ci
133a513582eSopenharmony_ciif [ "$arg_build_sdk" == "true" ]; then
134a513582eSopenharmony_ci	echo "start build sdk"
135a513582eSopenharmony_ci	build_sdk
136a513582eSopenharmony_ci	if [[ "$?" -ne 0 ]]; then
137a513582eSopenharmony_ci		echo "ohos-sdk build failed! You can try to use '--no-prebuilt-sdk' to skip the build of ohos-sdk."
138a513582eSopenharmony_ci		exit 1
139a513582eSopenharmony_ci	fi
140a513582eSopenharmony_ci	export OHOS_SDK_HOME=${ohos_sdk_path}
141a513582eSopenharmony_ci    echo "set OHOS_SDK_HOME to" ${OHOS_SDK_HOME}
142a513582eSopenharmony_cifi
143a513582eSopenharmony_ci
144a513582eSopenharmony_ci
145a513582eSopenharmony_ciexport PATH=/home/tools/command-line-tools/ohpm/bin:$PATH
146a513582eSopenharmony_cinpm config set registry https://repo.huaweicloud.com/repository/npm/
147a513582eSopenharmony_cinpm config set @ohos:registry https://repo.harmonyos.com/npm/
148a513582eSopenharmony_cinpm config set strict-ssl false
149a513582eSopenharmony_cinpm config set lockfile false
150a513582eSopenharmony_cicat $HOME/.npmrc | grep 'lockfile=false' || echo 'lockfile=false' >> $HOME/.npmrc
151a513582eSopenharmony_ciif [ -d ${ROOT_PATH}/prebuilts/ohos-sdk/linux/10 ]; then
152a513582eSopenharmony_ci    mkdir -p ${ohos_sdk_path}
153a513582eSopenharmony_ci    mv -n ${ROOT_PATH}/prebuilts/ohos-sdk/linux/10 ${ohos_sdk_path}
154a513582eSopenharmony_ci    pushd ${ohos_sdk_path}
155a513582eSopenharmony_ci	sdk_version=$(grep version 10/toolchains/oh-uni-package.json | awk '{print $2}' | sed -r 's/\",?//g')
156a513582eSopenharmony_ci	mkdir -p ets
157a513582eSopenharmony_ci	ln -nsf ../10/ets ets/$sdk_version
158a513582eSopenharmony_ci	mkdir -p js
159a513582eSopenharmony_ci	ln -nsf ../10/js js/$sdk_version
160a513582eSopenharmony_ci	mkdir -p toolchains
161a513582eSopenharmony_ci	ln -nsf ../10/toolchains toolchains/$sdk_version
162a513582eSopenharmony_ci	mkdir -p native
163a513582eSopenharmony_ci	ln -nsf ../10/native native/$sdk_version
164a513582eSopenharmony_ci	mkdir -p previewer
165a513582eSopenharmony_ci	ln -nsf ../10/previewer previewer/$sdk_version
166a513582eSopenharmony_ci    popd
167a513582eSopenharmony_cifi
168a513582eSopenharmony_ciif [ -d ${ROOT_PATH}/prebuilts/ohos-sdk/linux/11 ]; then
169a513582eSopenharmony_ci    mkdir -p ${ohos_sdk_path}
170a513582eSopenharmony_ci    mv -n ${ROOT_PATH}/prebuilts/ohos-sdk/linux/11 ${ohos_sdk_path}
171a513582eSopenharmony_ci    pushd ${ohos_sdk_path}
172a513582eSopenharmony_ci	sdk_version=$(grep version 11/toolchains/oh-uni-package.json | awk '{print $2}' | sed -r 's/\",?//g')
173a513582eSopenharmony_ci	mkdir -p ets
174a513582eSopenharmony_ci	ln -nsf ../11/ets ets/$sdk_version
175a513582eSopenharmony_ci	mkdir -p js
176a513582eSopenharmony_ci	ln -nsf ../11/js js/$sdk_version
177a513582eSopenharmony_ci	mkdir -p toolchains
178a513582eSopenharmony_ci	ln -nsf ../11/toolchains toolchains/$sdk_version
179a513582eSopenharmony_ci	mkdir -p native
180a513582eSopenharmony_ci	ln -nsf ../11/native native/$sdk_version
181a513582eSopenharmony_ci	mkdir -p previewer
182a513582eSopenharmony_ci	ln -nsf ../11/previewer previewer/$sdk_version
183a513582eSopenharmony_ci    popd
184a513582eSopenharmony_cifi
185a513582eSopenharmony_ciif [ -d ${ROOT_PATH}/prebuilts/ohos-sdk/linux/12 ]; then
186a513582eSopenharmony_ci    mkdir -p ${ohos_sdk_path}
187a513582eSopenharmony_ci    mv -n ${ROOT_PATH}/prebuilts/ohos-sdk/linux/12 ${ohos_sdk_path}
188a513582eSopenharmony_ci    pushd ${ohos_sdk_path}
189a513582eSopenharmony_ci	sdk_version=$(grep version 12/toolchains/oh-uni-package.json | awk '{print $2}' | sed -r 's/\",?//g')
190a513582eSopenharmony_ci	mkdir -p ets
191a513582eSopenharmony_ci	ln -nsf ../12/ets ets/$sdk_version
192a513582eSopenharmony_ci	mkdir -p js
193a513582eSopenharmony_ci	ln -nsf ../12/js js/$sdk_version
194a513582eSopenharmony_ci	mkdir -p toolchains
195a513582eSopenharmony_ci	ln -nsf ../12/toolchains toolchains/$sdk_version
196a513582eSopenharmony_ci	mkdir -p native
197a513582eSopenharmony_ci	ln -nsf ../12/native native/$sdk_version
198a513582eSopenharmony_ci	mkdir -p previewer
199a513582eSopenharmony_ci	ln -nsf ../12/previewer previewer/$sdk_version
200a513582eSopenharmony_ci    popd
201a513582eSopenharmony_cifi
202a513582eSopenharmony_ciif [ "${arg_project}" == "" -a "${arg_url}" == "" ]; then
203a513582eSopenharmony_ci        echo "--project or --url is not null"
204a513582eSopenharmony_ci        exit 1;
205a513582eSopenharmony_cifi
206a513582eSopenharmony_ci
207a513582eSopenharmony_ci
208a513582eSopenharmony_ciif [ ! -d "${arg_project}" ]; then
209a513582eSopenharmony_ci        echo "${arg_project} is not dir"
210a513582eSopenharmony_ci        exit 1;
211a513582eSopenharmony_cifi
212a513582eSopenharmony_ci
213a513582eSopenharmony_ci
214a513582eSopenharmony_ciif [[ ${arg_project} = */ ]]; then
215a513582eSopenharmony_ci	arg_project=${arg_project%/}
216a513582eSopenharmony_cifi
217a513582eSopenharmony_ci
218a513582eSopenharmony_ci
219a513582eSopenharmony_ciif [[ ${arg_sign_tool} = */ ]]; then
220a513582eSopenharmony_ci        arg_sign_tool=${arg_sign_tool%/}
221a513582eSopenharmony_cifi
222a513582eSopenharmony_ci
223a513582eSopenharmony_ciif [[ ${arg_p7b} = "" ]]; then
224a513582eSopenharmony_ci        arg_p7b=$(find ${arg_project} -name *.p7b | head -n 1)
225a513582eSopenharmony_ci        if [[ ${arg_p7b} = "" ]]; then
226a513582eSopenharmony_ci                arg_p7b=openharmony_sx.p7b
227a513582eSopenharmony_ci        fi
228a513582eSopenharmony_cifi
229a513582eSopenharmony_ci
230a513582eSopenharmony_ciclear_dir ${arg_out_path}
231a513582eSopenharmony_ci
232a513582eSopenharmony_ci
233a513582eSopenharmony_ciif [ "${arg_url}" != "" ]; then
234a513582eSopenharmony_ci	if [ "${arg_branch}" == "" ]; then
235a513582eSopenharmony_ci		echo "branch is not null"
236a513582eSopenharmony_ci		exit 1
237a513582eSopenharmony_ci	fi
238a513582eSopenharmony_ci	project_name=${arg_url##*/}
239a513582eSopenharmony_ci	project_name=${project_name%%.git*}
240a513582eSopenharmony_ci        if test -d ${BASE_PATH}/projects/${project_name}
241a513582eSopenharmony_ci        then
242a513582eSopenharmony_ci                echo "${project_name} exists,ready for update..."
243a513582eSopenharmony_ci                cd ${BASE_PATH}/projects/${project_name}
244a513582eSopenharmony_ci                git fetch origin ${arg_branch}
245a513582eSopenharmony_ci                git reset --hard origin/${arg_branch}
246a513582eSopenharmony_ci                git pull
247a513582eSopenharmony_ci        else
248a513582eSopenharmony_ci                echo "${project_name} dose not exist,ready to download..."
249a513582eSopenharmony_ci                cd ${BASE_PATH}/projects
250a513582eSopenharmony_ci                git clone -b ${arg_branch} ${arg_url} ${project_name}
251a513582eSopenharmony_ci        fi
252a513582eSopenharmony_ci	arg_project=${BASE_PATH}/projects/${project_name}
253a513582eSopenharmony_cifi
254a513582eSopenharmony_ci
255a513582eSopenharmony_ci
256a513582eSopenharmony_ciif ! is_project_root ${arg_project}; then
257a513582eSopenharmony_ci        echo "${arg_project} is not OpenHarmony Project"
258a513582eSopenharmony_ci        exit 1;
259a513582eSopenharmony_cifi
260a513582eSopenharmony_ci
261a513582eSopenharmony_ciif [ "${arg_sdk_path}" != "" ]; then
262a513582eSopenharmony_ci	export OHOS_SDK_HOME=${arg_sdk_path}
263a513582eSopenharmony_cifi
264a513582eSopenharmony_ciexport OHOS_BASE_SDK_HOME=${OHOS_SDK_HOME}
265a513582eSopenharmony_ci
266a513582eSopenharmony_ciecho "start build hap..."
267a513582eSopenharmony_cicd ${arg_project}
268a513582eSopenharmony_ciecho "sdk.dir=${OHOS_SDK_HOME}"  > ./local.properties
269a513582eSopenharmony_ciecho "nodejs.dir=${NODE_HOME}" >> ./local.properties
270a513582eSopenharmony_ci
271a513582eSopenharmony_ciecho "use sdk:"${OHOS_SDK_HOME}
272a513582eSopenharmony_ci
273a513582eSopenharmony_ciis_ohpm=true
274a513582eSopenharmony_cipackage_json_name="oh-package.json5"
275a513582eSopenharmony_ciif [ ! -f ${arg_project}/${package_json_name} ]; then
276a513582eSopenharmony_ci	is_ohpm=false
277a513582eSopenharmony_ci	package_json_name="package.json"
278a513582eSopenharmony_cifi
279a513582eSopenharmony_ci
280a513582eSopenharmony_ciif ${is_ohpm}; then
281a513582eSopenharmony_ci	if [ "${arg_ohpm}" == "" ]; then
282a513582eSopenharmony_ci		arg_ohpm="@ohos:registry https://ohpm.openharmony.cn/ohpm/"
283a513582eSopenharmony_ci	fi
284a513582eSopenharmony_ci	echo "ohpm config set ${arg_ohpm}"
285a513582eSopenharmony_ci	ohpm config set ${arg_ohpm}	
286a513582eSopenharmony_cielse
287a513582eSopenharmony_ci	if [ "${arg_npm}" == "" ]; then
288a513582eSopenharmony_ci		arg_npm="@ohos:registry=https://repo.harmonyos.com/npm/"
289a513582eSopenharmony_ci	fi
290a513582eSopenharmony_ci	echo "npm config set ${arg_npm}"
291a513582eSopenharmony_ci	npm config set ${arg_npm}
292a513582eSopenharmony_cifi
293a513582eSopenharmony_ci
294a513582eSopenharmony_cimodule_list=()
295a513582eSopenharmony_cimodule_name=()
296a513582eSopenharmony_ciout_module=()
297a513582eSopenharmony_cibundle_name=""
298a513582eSopenharmony_ci
299a513582eSopenharmony_ci
300a513582eSopenharmony_cifunction del_module_name(){
301a513582eSopenharmony_ci        name=${1}
302a513582eSopenharmony_ci        for i in "${!module_name[@]}"
303a513582eSopenharmony_ci        do
304a513582eSopenharmony_ci                if [[ "${module_name[i]}" == "${name}" ]]; then
305a513582eSopenharmony_ci                        unset module_name[i]
306a513582eSopenharmony_ci			echo "移除"${name}" , 剩余 : "${module_name[@]}
307a513582eSopenharmony_ci			return 0
308a513582eSopenharmony_ci                fi
309a513582eSopenharmony_ci        done
310a513582eSopenharmony_ci        return 1
311a513582eSopenharmony_ci}
312a513582eSopenharmony_ci
313a513582eSopenharmony_ci
314a513582eSopenharmony_cifunction load_dep(){
315a513582eSopenharmony_ci	local cur_m_n=${1}
316a513582eSopenharmony_ci	local cur_module
317a513582eSopenharmony_ci	for cur_module in ${module_list[@]}
318a513582eSopenharmony_ci	do
319a513582eSopenharmony_ci		if [[ "${cur_module}" =~ "${cur_m_n}" ]]; then
320a513582eSopenharmony_ci			del_module_name ${cur_m_n}
321a513582eSopenharmony_ci			for m_n_1 in ${module_name[@]}
322a513582eSopenharmony_ci			do
323a513582eSopenharmony_ci				rr=$(cat ${cur_module}"/${package_json_name}" | grep "${m_n_1}" || true)
324a513582eSopenharmony_ci				if [[ "${rr}" != "" ]]; then
325a513582eSopenharmony_ci					load_dep ${m_n_1}
326a513582eSopenharmony_ci				fi
327a513582eSopenharmony_ci			done
328a513582eSopenharmony_ci			cd ${cur_module}
329a513582eSopenharmony_ci			echo ${cur_module}" 执行npm/ohpm install"
330a513582eSopenharmony_ci			if ${is_ohpm}; then
331a513582eSopenharmony_ci				ohpm install
332a513582eSopenharmony_ci			else
333a513582eSopenharmony_ci				npm i
334a513582eSopenharmony_ci			fi
335a513582eSopenharmony_ci
336a513582eSopenharmony_ci		fi
337a513582eSopenharmony_ci	done
338a513582eSopenharmony_ci}
339a513582eSopenharmony_ci
340a513582eSopenharmony_ci
341a513582eSopenharmony_ciwhile read line
342a513582eSopenharmony_cido
343a513582eSopenharmony_ci	if [[ ${line} =~ "srcPath" ]]; then
344a513582eSopenharmony_ci		pa=${line%\"*}
345a513582eSopenharmony_ci		pa=${pa##*\".}
346a513582eSopenharmony_ci		module_list[${#module_list[*]}]=${arg_project}${pa}
347a513582eSopenharmony_ci		module_name[${#module_name[*]}]=${pa}
348a513582eSopenharmony_ci		if [ -d "${arg_project}/AppScope" ]; then
349a513582eSopenharmony_ci			cur_bundle_line=`cat ${arg_project}/AppScope/app.json5 | grep "\"bundleName\""`
350a513582eSopenharmony_ci			bundle_name=${cur_bundle_line%\"*}
351a513582eSopenharmony_ci			bundle_name=${bundle_name##*\"}
352a513582eSopenharmony_ci			# echo "bundleName : "${bundle_name}
353a513582eSopenharmony_ci			is_entry=`cat ${arg_project}${pa}/src/main/module.json5 | sed 's/ //g' | grep "\"type\":\"entry\"" || true`
354a513582eSopenharmony_ci			is_feature=`cat ${arg_project}${pa}/src/main/module.json5 | sed 's/ //g' | grep "\"type\":\"feature\"" || true`
355a513582eSopenharmony_ci			if [[ "${is_entry}" != "" || "${is_feature}" != "" ]]; then
356a513582eSopenharmony_ci				echo "hap输出module: "${arg_project}${pa}
357a513582eSopenharmony_ci				out_module[${#out_module[*]}]=${arg_project}${pa}
358a513582eSopenharmony_ci			fi
359a513582eSopenharmony_ci		else
360a513582eSopenharmony_ci			cur_bundle_line=`cat ${arg_project}${pa}/src/main/config.json | grep "\"bundleName\""`
361a513582eSopenharmony_ci                        bundle_name=${cur_bundle_line%\"*}
362a513582eSopenharmony_ci                        bundle_name=${bundle_name##*\"}
363a513582eSopenharmony_ci                        # echo "bundleName : "${bundle_name}
364a513582eSopenharmony_ci			is_entry=`cat ${arg_project}${pa}/src/main/config.json | sed 's/ //g' | grep "\"moduleType\":\"entry\"" || true`
365a513582eSopenharmony_ci                        is_feature=`cat ${arg_project}${pa}/src/main/config.json | sed 's/ //g' | grep "\"moduleType\":\"feature\"" || true`
366a513582eSopenharmony_ci                        if [[ "${is_entry}" != "" || "${is_feature}" != "" ]]; then
367a513582eSopenharmony_ci                                echo "hap输出module: "${arg_project}${pa}
368a513582eSopenharmony_ci                                out_module[${#out_module[*]}]=${arg_project}${pa}
369a513582eSopenharmony_ci                        fi
370a513582eSopenharmony_ci		fi
371a513582eSopenharmony_ci	fi
372a513582eSopenharmony_cidone < ${arg_project}"/build-profile.json5"
373a513582eSopenharmony_ci
374a513582eSopenharmony_ci
375a513582eSopenharmony_cifor module in ${module_list[@]}
376a513582eSopenharmony_cido
377a513582eSopenharmony_ci	if del_module_name ${module##${arg_project}}; then
378a513582eSopenharmony_ci		for m_n in ${module_name[@]}
379a513582eSopenharmony_ci		do
380a513582eSopenharmony_ci			rr=$(cat ${module}"/${package_json_name}" | grep "${m_n}" || true)
381a513582eSopenharmony_ci			if [[ "${rr}" != "" ]]; then
382a513582eSopenharmony_ci				load_dep ${m_n}
383a513582eSopenharmony_ci			fi
384a513582eSopenharmony_ci		done
385a513582eSopenharmony_ci		cd ${module}
386a513582eSopenharmony_ci		echo ${module}" 执行npm/ohpm install"
387a513582eSopenharmony_ci		if ${is_ohpm}; then
388a513582eSopenharmony_ci			ohpm install
389a513582eSopenharmony_ci		else
390a513582eSopenharmony_ci			npm i
391a513582eSopenharmony_ci		fi
392a513582eSopenharmony_ci	fi	
393a513582eSopenharmony_cidone
394a513582eSopenharmony_ci
395a513582eSopenharmony_ci
396a513582eSopenharmony_cicd ${arg_project}
397a513582eSopenharmony_ciecho ${arg_project}" 执行npm/ohpm install"
398a513582eSopenharmony_ciif ${is_ohpm}; then
399a513582eSopenharmony_ci	ohpm install
400a513582eSopenharmony_ci    chmod +x hvigorw
401a513582eSopenharmony_ci	# Historical reasons need to be compatible with NODE_HOME path issue
402a513582eSopenharmony_ci	if grep -q "\${NODE_HOME}/bin/node" hvigorw ; then
403a513582eSopenharmony_ci    	# node home path include "bin"
404a513582eSopenharmony_ci		if [ ! -x "${NODE_HOME}/bin/node" ];then
405a513582eSopenharmony_ci    		export NODE_HOME=$(dirname ${NODE_HOME})
406a513582eSopenharmony_ci		fi
407a513582eSopenharmony_ci	else
408a513582eSopenharmony_ci    	# node home path does not include "bin"
409a513582eSopenharmony_ci		if [ -x "${NODE_HOME}/bin/node" ];then
410a513582eSopenharmony_ci    		export NODE_HOME=${NODE_HOME}/bin
411a513582eSopenharmony_ci		fi
412a513582eSopenharmony_ci	fi
413a513582eSopenharmony_ci    ./hvigorw clean --no-daemon
414a513582eSopenharmony_ci    ./hvigorw assembleHap --mode module -p product=default -p debuggable=false --no-daemon
415a513582eSopenharmony_cielse
416a513582eSopenharmony_ci	npm install
417a513582eSopenharmony_ci	node ./node_modules/@ohos/hvigor/bin/hvigor.js clean
418a513582eSopenharmony_ci	node ./node_modules/@ohos/hvigor/bin/hvigor.js --mode module clean assembleHap -p debuggable=false
419a513582eSopenharmony_cifi
420a513582eSopenharmony_ci
421a513582eSopenharmony_ci
422a513582eSopenharmony_ci
423a513582eSopenharmony_cifor module in ${out_module[@]}
424a513582eSopenharmony_cido
425a513582eSopenharmony_ci	cur_out_module_name=${module##*/}
426a513582eSopenharmony_ci	is_sign=false
427a513582eSopenharmony_ci	echo "module = ${module} , cur_out_module_name=${cur_out_module_name}"
428a513582eSopenharmony_ci	if [ ! -d ${module}/build/default/outputs/default/ ]; then
429a513582eSopenharmony_ci		echo "module = ${module}, assembleHap error !!!"
430a513582eSopenharmony_ci		continue
431a513582eSopenharmony_ci	fi
432a513582eSopenharmony_ci	for out_file in `ls ${module}/build/default/outputs/default/`
433a513582eSopenharmony_ci	do
434a513582eSopenharmony_ci		if [[ "${out_file}" =~ "-signed.hap" ]]; then
435a513582eSopenharmony_ci			is_sign=true
436a513582eSopenharmony_ci			echo "发现signed包 : "${out_file}",直接归档"
437a513582eSopenharmony_ci			cp ${module}/build/default/outputs/default/${out_file} ${arg_out_path}/
438a513582eSopenharmony_ci			break
439a513582eSopenharmony_ci		fi
440a513582eSopenharmony_ci	done
441a513582eSopenharmony_ci	if test ${is_sign} = false
442a513582eSopenharmony_ci	then
443a513582eSopenharmony_ci		hap_name=${arg_project##*/}
444a513582eSopenharmony_ci		# echo "${hap_name},skip sign 'hap'. Invalid signingConfig is configured for 'default' product."
445a513582eSopenharmony_ci		for out_file in `ls ${module}/build/default/outputs/default/`
446a513582eSopenharmony_ci        	do
447a513582eSopenharmony_ci                	if [[ "${out_file}" =~ "-unsigned.hap" ]]; then
448a513582eSopenharmony_ci                        	echo "发现unsigned包 : "${out_file}",开始使用签名工具签名"
449a513582eSopenharmony_ci				nosign_hap_path=${module}/build/default/outputs/default/${out_file}
450a513582eSopenharmony_ci				sign_hap_path=${module}/build/default/outputs/default/${out_file/unsigned/signed}
451a513582eSopenharmony_ci				cp -r ${arg_sign_tool} ${arg_project}/
452a513582eSopenharmony_ci        			cd ${arg_project}/dist
453a513582eSopenharmony_ci				if [ ! -e ${arg_profile} ]; then
454a513582eSopenharmony_ci					echo "${arg_profile} not exist! ! !"
455a513582eSopenharmony_ci					exit 1
456a513582eSopenharmony_ci				fi
457a513582eSopenharmony_ci				if [ "${arg_bundle_name}" != "" ]; then
458a513582eSopenharmony_ci					sed -i "s/\"com.OpenHarmony.app.test\"/\"${arg_bundle_name}\"/g" ${arg_profile}
459a513582eSopenharmony_ci				else
460a513582eSopenharmony_ci					sed -i "s/\"com.OpenHarmony.app.test\"/\"${bundle_name}\"/g" ${arg_profile}
461a513582eSopenharmony_ci				fi
462a513582eSopenharmony_ci       		 		sed -i "s/\"normal\"/\"${arg_apl}\"/g" ${arg_profile}
463a513582eSopenharmony_ci        			sed -i "s/\"system_basic\"/\"${arg_apl}\"/g" ${arg_profile}
464a513582eSopenharmony_ci        			sed -i "s/\"system_core\"/\"${arg_apl}\"/g" ${arg_profile}
465a513582eSopenharmony_ci        			sed -i "s/\"hos_normal_app\"/\"${arg_feature}\"/g" ${arg_profile}
466a513582eSopenharmony_ci        			sed -i "s/\"hos_system_app\"/\"${arg_feature}\"/g" ${arg_profile}
467a513582eSopenharmony_ci        			java -jar hap-sign-tool.jar  sign-profile -keyAlias "openharmony application profile release" -signAlg "SHA256withECDSA" -mode "localSign" -profileCertFile "OpenHarmonyProfileRelease.pem" -inFile "${arg_profile}" -keystoreFile "OpenHarmony.p12" -outFile "openharmony_sx.p7b" -keyPwd "123456" -keystorePwd "123456"
468a513582eSopenharmony_ci        			java -jar hap-sign-tool.jar sign-app -keyAlias "openharmony application release" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "OpenHarmonyApplication.pem" -profileFile "${arg_p7b}" -inFile "${nosign_hap_path}" -keystoreFile "OpenHarmony.p12" -outFile "${sign_hap_path}" -keyPwd "123456" -keystorePwd "123456"
469a513582eSopenharmony_ci        			cp ${sign_hap_path} ${arg_out_path}/
470a513582eSopenharmony_ci				is_sign=true
471a513582eSopenharmony_ci                	fi
472a513582eSopenharmony_ci        	done
473a513582eSopenharmony_ci		if test ${is_sign} = false
474a513582eSopenharmony_ci		then
475a513582eSopenharmony_ci                	echo "${module} assembleHap error !!!"
476a513582eSopenharmony_ci                	rm -rf ${arg_project}/sign_helper
477a513582eSopenharmony_ci                	exit 1
478a513582eSopenharmony_ci        	fi
479a513582eSopenharmony_ci	fi
480a513582eSopenharmony_cidone
481a513582eSopenharmony_cirm -rf ${arg_project}/sign_helper
482a513582eSopenharmony_ci
483a513582eSopenharmony_ci# backup sourceMaps.json files for DFR
484a513582eSopenharmony_cicd ${arg_project}
485a513582eSopenharmony_cifind . -name "sourceMaps.json" -type f | while read file; do
486a513582eSopenharmony_ci    sourceMaps_path=$(echo ${file} | sed 's/^\.\///;s/\/sourceMaps.json$//')
487a513582eSopenharmony_ci    mkdir -p ${arg_out_path}/${sourceMaps_path}
488a513582eSopenharmony_ci    cp ${file} ${arg_out_path}/${sourceMaps_path}/
489a513582eSopenharmony_cidone
490a513582eSopenharmony_ci
491a513582eSopenharmony_ciexit 0
492