#!/bin/bash # # SPDX-License-Identifier: LicenseRef-Unisoc-General-1.0 # # Copyright 2016-2023 Unisoc (Shanghai) Technologies Co., Ltd # # Licensed under the Unisoc General Software License, version 1.0 (the License); # you may not use this file except in compliance with the License. You may obtain a copy of the License at # # https://www.unisoc.com/en_us/license/UNISOC_GENERAL_LICENSE_V1.0-EN_US # # Software distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OF ANY KIND, either express or implied. # See the Unisoc General Software License, version 1.0 for more details. # build_time=$(date "+%Y%m%d%H%M%S") timename=$1+$2+${build_time}+timemsg.log timedir=${PWD}/prebuilts/scripts echo "" >> ${timedir}/${timename} echo "---------------- hardware info ----------------" >> ${timedir}/${timename} cat /proc/meminfo | grep MemFree >> ${timedir}/${timename} cat /proc/meminfo | grep MemAvailable >> ${timedir}/${timename} physical_id=`cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l` processor=`cat /proc/cpuinfo |grep "processor"|wc -l` echo "physical CPU: ${physical_id}" >> ${timedir}/${timename} echo "processor CPU: ${processor}" >> ${timedir}/${timename} cat /proc/cpuinfo |grep "cores"|uniq >> ${timedir}/${timename} echo "" >> ${timedir}/${timename} echo "---------------- service info ----------------" >> ${timedir}/${timename} echo "USERNAME: ${USER}" >> ${timedir}/${timename} echo "HOSTNAME: ${HOSTNAME}" >> ${timedir}/${timename} echo "ip info" >> ${timedir}/${timename} ifconfig >> ${timedir}/${timename} echo "" >> ${timedir}/${timename} echo "---------------- build info ------------------" >> ${timedir}/${timename} echo "pac name: $1 $2" >> ${timedir}/${timename} echo "" >> ${timedir}/${timename} echo "----------------- time info ------------------" >> ${timedir}/${timename} echo "BUILD BEGIN: $(date "+%Y-%m-%d %H:%M:%S")" >> ${timedir}/${timename} BEGIN_TIME=`date +%s` btime=`date +%s` long_help_message=" build.sh help message as below: -h, --help, ? report help message -m, MACHINE print MACHINENAME list -d, DISTRO print DISTRONAME list -i, IMAGE print IMAGENAME list -u, USER print USERNAME list, [userdebug as default] ##--------------------------------------------------------------------## ## build.sh arguments include: ## ## MACHINENAME, DISTRONAME, IMAGENAME, USERNAME ## ## ## ## build modle: ## ## ./build.sh MACHINENAME+DISTRONAME+IMAGENAME USERNAME ## ## ## ## build sample: ## ## ./build.sh sl8563-cpe-2h10+initgc+console userdebug ## ##------------------------------------------------------------------- ## " machinelist=(s9863a-1h10 ums9620-2h10 ums9620-2h10-k515) distrolist=(wayland initgc) imagelist=(console docker minimal tiny prerootfs wayland) userlist=(userdebug user) func_build_list () { names=$1 echo "$2 list:" for ((i=0; i<${#names[*]}; i++)) { echo ${names[$i]} } exit 0; } func_long_help_messge () { echo "$long_help_message" exit 0 } func_help() { for loop in $@ do case $loop in ?|-h|*help) func_long_help_messge break ;; -m|MACHINE) func_build_list "${machinelist[*]}" "MACHINENAME" break ;; -d|DISTRO) func_build_list "${distrolist[*]}" "DISTRONAME" break ;; -i|IMAGE) func_build_list "${imagelist[*]}" "IMAGENAME" break ;; -u|USER) func_build_list "${userlist[*]}" "USERNAME" break ;; *) break ;; esac done } fun_change_image_rootfs_dir(){ if [ ! -e "${ROOTFS_EXT4_GZ}" ];then echo "${ROOTFS_EXT4_GZ} is not exsit" return 1 fi echo "begin mount ext4 for IMAGE_ROOTFS make has less difference" if [ ! -d "${EXT4_MOUNT_POINT}" ];then mkdir -p ${EXT4_MOUNT_POINT} rm -rf ${ROOTFS_EXT4_DIR} mkdir -p ${ROOTFS_EXT4_DIR} else echo "${EXT4_MOUNT_POINT} is exsit ,so umout and rm it first!" ext4fsdir="${SOURCEROOT}/${EXT4_MOUNT_POINT}" dirmountinfo=`df -h | grep ${ext4fsdir}` if [ -n "${dirmountinfo}" ];then echo "sudo umount ${EXT4_MOUNT_POINT}" sudo umount ${EXT4_MOUNT_POINT} if [ $? != 0 ]; then echo "The procedure of fun_make_image_rootfs_point is failed, shell error line: $LINENO" return 1 fi fi echo "rm -rf ${EXT4_MOUNT_POINT}" rm -rf ${EXT4_MOUNT_POINT} if [ $? != 0 ]; then echo "The procedure of fun_make_image_rootfs_point is failed, shell error line: $LINENO" return 1 fi mkdir -p ${EXT4_MOUNT_POINT} rm -rf ${ROOTFS_EXT4_DIR} mkdir -p ${ROOTFS_EXT4_DIR} fi FILE_USER=`ls -l | grep "${EXT4_MOUNT_POINT}" | awk '{print $3}'` echo "FILE_USER is ${FILE_USER}" FILE_USER_GROUP=`ls -l | grep "${EXT4_MOUNT_POINT}" | awk '{print $4}'` echo "FILE_USER_GROUP is ${FILE_USER_GROUP}" cp ${ROOTFS_EXT4_GZ} ${ROOTFS_EXT4}.gz gzip -d ${ROOTFS_EXT4}.gz chmod 777 ${ROOTFS_EXT4} echo "sudo mount -o loop ${ROOTFS_EXT4} ${EXT4_MOUNT_POINT}" sudo mount -o loop ${ROOTFS_EXT4} ${EXT4_MOUNT_POINT} if [ $? != 0 ]; then echo "The procedure of fun_make_image_rootfs_point is failed, shell error line: $LINENO" sudo umount ${EXT4_MOUNT_POINT} return 1 fi if [ $? != 0 ]; then echo "The procedure of fun_make_image_rootfs_point is failed, shell error line: $LINENO" sudo umount ${EXT4_MOUNT_POINT} if [ $? != 0 ]; then echo "failed to umount ${EXT4_MOUNT_POINT},please umount it in manual: $LINENO" return 1 fi return 1 fi echo "sudo chown "${FILE_USER}" ${EXT4_MOUNT_POINT}" sudo chown "${FILE_USER}" ${EXT4_MOUNT_POINT} if [ $? != 0 ]; then echo "The procedure of fun_make_image_rootfs_point is failed, shell error line: $LINENO" sudo umount ${EXT4_MOUNT_POINT} if [ $? != 0 ]; then echo "failed to umount ${EXT4_MOUNT_POINT},please umount it in manual: $LINENO" return 1 fi return 1 fi echo `ls -l | grep "${EXT4_MOUNT_POINT}"` return 0 } fun_change_image_rootfs_in_localconf(){ echo "sed -i ${EXT4_MOUNT_POINT} to $SOURCEROOT/prebuilts/scripts/conf/local.conf" sed -i "/${EXT4_MOUNT_POINT}/d" $SOURCEROOT/prebuilts/scripts/conf/local.conf echo "IMAGE_ROOTFS=\"${NEW_IMAGE_ROOTFS_DIR}\"" >> conf/local.conf return 0 } fun_post_change_image_rootfs_dir(){ sed -i "/${EXT4_MOUNT_POINT}/d" $SOURCEROOT/prebuilts/scripts/conf/local.conf echo `pwd` cd ${SOURCEROOT} echo "sudo umount ${EXT4_MOUNT_POINT}" sudo umount ${EXT4_MOUNT_POINT} if [ $? != 0 ]; then echo "The procedure of fun_make_image_rootfs_point is failed, shell error line: $LINENO" fi echo "rm -rf ${EXT4_MOUNT_POINT}" rm -rf ${EXT4_MOUNT_POINT} if [ $? != 0 ]; then echo "The procedure of fun_make_image_rootfs_point is failed, shell error line: $LINENO" fi rm -rf ${ROOTFS_EXT4_DIR} cd - } fun_sign2(){ cd ${SOURCEROOT} ext4fsdir="${SOURCEROOT}/${EXT4_MOUNT_POINT}" dirmountinfo=`df -h | grep ${ext4fsdir}` if [ -n "${dirmountinfo}" ];then echo "sudo umount ${EXT4_MOUNT_POINT} before crtl c " sudo umount ${EXT4_MOUNT_POINT} fi sed -i '/BB_NO_NETWORK=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf # when build pac. touch ctrl c or else, reset /prebuilts/scripts/conf/local.conf sed -i '/USERDEBUG=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf sed -i '/ENG_IT=/d' $SOURCEROOT/prebuilts/scripts/conf/bblayers.conf sed -i '/SECBOOT_ENABLE=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf sed -i '/DATE_BUILD=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf exit 0 } func_help $1 $2 if [ "$(whoami)" = "root" ]; then echo "ERROR: do not use the BSP as root. Exiting..." exit 1 fi DISTROSUFFIX=`echo $1 | awk -F+ '{print $2}'` DISTRONAME=unisoc-`echo $1 | awk -F+ '{print $2}'` IMAGESUFFIX=`echo $1 | awk -F+ '{print $3}'` IMAGENAME=unisoc-`echo $1 | awk -F+ '{print $3}'`-image TMP1=`echo $1 | awk -F+ '{print $1}'` MACHINENAME=`echo $TMP1 | sed 's/_/-/g'` MACHINESUFFIX=`echo ${MACHINENAME} | awk -F- '{print $1}'` if [ "$IMAGENAME" == "" ]; then IMAGENAME=unisoc-console-image fi TMP4=`echo $1 | awk -F+ '{print $4}'` if [[ $2 == "" ]] || [[ $2 == "userdebug" ]] || [[ $2 == "default" ]]; then USERDEBUG="userdebug" elif [ $2 == "user" ]; then USERDEBUG="user" elif [ $2 == "eng" ]; then USERDEBUG="eng" else IMAGENAME=unisoc-`echo $1 | awk -F+ '{print $3}'`-$2 fi export USERDEBUG=${USERDEBUG} # PRODUCT type UNISOC_PRODUCT=`echo $1 | awk -F+ '{print $5}'` if [[ $UNISOC_PRODUCT == "" ]]; then UNISOC_PRODUCT="default" # ubuntu distro, use ubuntu product type if [[ ${DISTRONAME} == "unisoc-ubuntu" ]]; then UNISOC_PRODUCT="ubuntu" fi fi UNISOC_PRODUCT=`echo $UNISOC_PRODUCT | sed 's/_/-/g'` BB_NO_NETWORK_FLAG="0" # control if build sdk esdk and ota BUILD_SDK_FLAG="0" BUILD_ESDK_FLAG="0" BUILD_OTA_FLAG="0" param_count=$# for ((i=1;i<=${param_count};i++)); do eval j=\$$i if [[ $j == "offline" ]]; then BB_NO_NETWORK_FLAG="1" fi if [[ $j == "sdk" ]]; then BUILD_SDK_FLAG="1" fi if [[ $j == "esdk" ]]; then BUILD_ESDK_FLAG="1" fi if [[ $j == "ota" ]]; then BUILD_OTA_FLAG="1" fi done # ubuntu pac,dont build sdk/esdk and not build idh if [[ ${IMAGENAME} == "unisoc-prerootfs-image" ]] || [[ ${DISTRONAME} == "unisoc-ubuntu" ]]; then BUILD_SDK_FLAG="0" BUILD_ESDK_FLAG="0" fi echo "FLAG is : BUILD_SDK_FLAG=${BUILD_SDK_FLAG} BUILD_ESDK_FLAG=${BUILD_ESDK_FLAG} BUILD_OTA_FLAG=${BUILD_OTA_FLAG}" if [[ ${TMP4} == "" ]] || [[ ${TMP4} == "sec" ]] || [[ ${TMP4} == "default" ]]; then SECBOOT_ENABLE="sec" elif [ ${TMP4} == "nosec" ]; then SECBOOT_ENABLE="nosec" else echo "Error: sec or nosec ?" exit 1 fi export SECBOOT_ENABLE=${SECBOOT_ENABLE} SOURCEROOT=$(pwd) cd ${SOURCEROOT} echo "Check ubuntu toolchain..." ./prebuilts/scripts/ubuntu_scripts/setup_toolchain_for_ubuntu.sh ./prebuilts/toolchains/ubuntu20.04 ./prebuilts/scripts/ubuntu_scripts/setup_toolchain_for_ubuntu.sh ./prebuilts/toolchains/ubuntu18.04 echo "Cleaning old built folder..." rm -rf sstate-cache build-* out/target/product/${MACHINENAME} out/*timemsg.log EXT4_MOUNT_IMAGE_ROOTFS_NAME=${MACHINENAME}-${SECBOOT_ENABLE}-${USERDEBUG}.ext4 EXT4_MOUNT_POINT="ext4mountpoint" ROOTFS_EXT4_GZ_DIR="./prebuilts/pac-binary/${MACHINESUFFIX}" ROOTFS_EXT4_GZ="${ROOTFS_EXT4_GZ_DIR}/${EXT4_MOUNT_IMAGE_ROOTFS_NAME}.gz" ROOTFS_EXT4_DIR="ext4fs" ROOTFS_EXT4="${ROOTFS_EXT4_DIR}/rootfs.ext4" NEW_IMAGE_ROOTFS_DIR="${SOURCEROOT}/${EXT4_MOUNT_POINT}/rootfs" trap "fun_sign2" 1 2 fun_change_image_rootfs_dir flag_change_image_rootfs_dir=$? echo "MACHINENAME=${MACHINENAME} ,DISTRO=${DISTRONAME}, USERDEBUG=${USERDEBUG}, SECBOOT_ENABLE=${SECBOOT_ENABLE} UNISOC_PRODUCT=${UNISOC_PRODUCT}" export MACHINE=${MACHINENAME} && export DISTRO=${DISTRONAME} && export IMAGESUFFIX=${IMAGESUFFIX} && export USERDEBUG=${USERDEBUG} && export UNISOC_PRODUCT=${UNISOC_PRODUCT} && source setup-environment build-${DISTRONAME} sed -i '/USERDEBUG=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf sed -i '/DATE_BUILD=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf sed -i '/SECBOOT_ENABLE=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf sed -i '/BB_NO_NETWORK=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf if [ "${flag_change_image_rootfs_dir}" = 0 ];then echo "do fun_change_image_rootfs_in_localconf" fun_change_image_rootfs_in_localconf else echo "no do fun_change_image_rootfs_in_localconf" fi if [ "$USERDEBUG" == "userdebug" ]; then echo 'USERDEBUG="userdebug"' >> conf/local.conf echo 'ENG_IT="userdebug"' >> conf/bblayers.conf elif [ "$USERDEBUG" == "user" ]; then echo 'USERDEBUG="user"' >> conf/local.conf echo 'ENG_IT="user"' >> conf/bblayers.conf elif [ "$USERDEBUG" == "eng" ]; then echo 'USERDEBUG="userdebug"' >> conf/local.conf echo 'ENG_IT="eng"' >> conf/bblayers.conf fi if [ "$SECBOOT_ENABLE" == "sec" ]; then echo 'SECBOOT_ENABLE="sec"' >> conf/local.conf elif [ "$SECBOOT_ENABLE" == "nosec" ]; then echo 'SECBOOT_ENABLE="nosec"' >> conf/local.conf fi if [ "$BB_NO_NETWORK_FLAG" == "1" ]; then echo 'BB_NO_NETWORK="1"' >> conf/local.conf $SOURCEROOT/prebuilts/scripts/offline-monitor.sh $$ $SOURCEROOT/prebuilts/scripts/conf/local.conf & elif [ "$BB_NO_NETWORK_FLAG" == "0" ]; then echo 'BB_NO_NETWORK="0"' >> conf/local.conf fi YEAR=`date +%g` WEEK=`date +%V` DAY=`date +%u` HOUR=`date +%H` MINUTE=`date +%M` SECOND=`date +%S` WEEK=$((10#$WEEK)) WEEK=$(printf "%02d" $WEEK) DATE="W${YEAR}.${WEEK}.${DAY}:${HOUR}.${MINUTE}.${SECOND}" echo $DATE TMP2="DATE_BUILD="\"$DATE"\"" echo $TMP2 >> conf/local.conf sed -i '/^DATE_BUILD=/s/:/-/' conf/local.conf bitbake_assert() { if [ $? != 0 ]; then echo "The procedure of bitbake is failed, shell error line: $1" sed -i '/BB_NO_NETWORK=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf exit 1 fi } bitbake_assert_change_image_rootfs_dir() { if [ $? != 0 ]; then echo "The procedure of bitbake is failed, shell error line: $1" if [ "${flag_change_image_rootfs_dir}" = 0 ];then echo "do fun_post_change_image_rootfs_dir" fun_post_change_image_rootfs_dir else echo "no no fun_post_change_image_rootfs_dir" fi sed -i '/BB_NO_NETWORK=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf exit 1 fi } check_offline_building() { if [ "$BB_NO_NETWORK_FLAG" == "1" ]; then bitbake $2 --runall=fetch if [ $? != 0 ]; then sed -i '/BB_NO_NETWORK=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf echo -e "\e[1;31m The offline building failed, please upload tarballs to source/tarballs. shell error line: $1\e[0m" exit 1 fi fi } building_image() { check_offline_building $1 $2 bitbake $2 bitbake_assert $1 } echo "Build preparation: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` echo "Start building process...${IMAGENAME}..." building_image $LINENO ${IMAGENAME} echo "Build ${IMAGENAME}: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` if [ "${flag_change_image_rootfs_dir}" = 0 ];then echo "do fun_post_change_image_rootfs_dir" fun_post_change_image_rootfs_dir else echo "no no fun_post_change_image_rootfs_dir" fi if [[ ${BUILD_SDK_FLAG} == "1" ]]; then echo "Build sdk!" # DATE_BUILD need modify for build SDK (from DATE_BUILD="W22.17.1:14.14.16" to DATE_BUILD="W22.17.1-14.14.16") echo "modify DATE_BUILD for build sdk" if [ $? != 0 ]; then echo "modify DATE_BUILD ERROR!!!" exit 1 fi check_offline_building $LINENO ${IMAGENAME} bitbake ${IMAGENAME} -c populate_sdk bitbake_assert $LINENO sed -i '/^DATE_BUILD=/s/-/:/' $SOURCEROOT/prebuilts/scripts/conf/local.conf echo "Build populate_sdk: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` fi if [[ ${BUILD_ESDK_FLAG} == "1" ]]; then echo "Build esdk!" # DATE_BUILD need modify for build eSDK (from DATE_BUILD="W22.17.1:14.14.16" to DATE_BUILD="W22.17.1-14.14.16") echo "modify DATE_BUILD for build esdk" if [ $? != 0 ]; then echo "modify DATE_BUILD ERROR!!!" exit 1 fi check_offline_building $LINENO ${IMAGENAME} bitbake ${IMAGENAME} -c populate_sdk_ext bitbake_assert $LINENO echo "Build populate_esdk: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` fi # 1. build prodnv building_image $LINENO prodnv echo "Build prodnv: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` # 2. build userdata building_image $LINENO userdata echo "Build userdata: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` # 3. build recovery-image building_image $LINENO recovery-image echo "Build recovery-image: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` # 4. build recovery-img building_image $LINENO recovery-img echo "Build recovery-img: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` cd ${SOURCEROOT}/prebuilts/scripts sed -i '/BB_NO_NETWORK=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf source pac.sh $1 $USERDEBUG echo "Exac pac: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` # build ota pac if [[ ${BUILD_OTA_FLAG} == "1" ]]; then sed -i '/BB_NO_NETWORK=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf echo OTA START cd ${SOURCEROOT}/prebuilts/scripts source ota.sh "fullota" "auto" echo "ota.sh: $(expr $(date +%s) - $btime)" >> ${timedir}/${timename} && btime=`date +%s` fi sed -i '/BB_NO_NETWORK=/d' $SOURCEROOT/prebuilts/scripts/conf/local.conf echo "Build END: $(date "+%Y-%m-%d %H:%M:%S")" >> ${timedir}/${timename} END_TIME=`date +%s` TOTAL_TIME_SEC=`expr $END_TIME - $BEGIN_TIME` echo "TOTAL_TIME: $TOTAL_TIME_SEC" >> ${timedir}/${timename} cd ${SOURCEROOT}/out/target/product/${MACHINENAME} pac_size=`find . -name *.pac | xargs ls -sh` echo "pac size: ${pac_size}" >> ${timedir}/${timename} mv -f ${timedir}/${timename} ${SOURCEROOT}/out/ rm -rf ${timedir}/*timemsg.log cat ${SOURCEROOT}/out/${timename}