#!/bin/bash # Copyright (c) 2000-2020 Synology Inc. All rights reserved. if [ -z "$__INCLUDE_CHECK__" ]; then __INCLUDE_CHECK__=defined . "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"/init Source include/variable Source include/virtualProject Source include/config Source include/platforms GetProjectPath() { local project="$1" if [ "$(basename "$SynoBase")" = "ds.base" ]; then echo "$SourceDir/$(GetVirtualProjectName "$(GetVirInstProjectName "$project")")" else echo "$SourceDir/$(GetVirInstProjectName "$project")" fi } CheckScript() { local projName="$1" local type=$2 local findScript= local virtualName=$(GetVirtualProjectExtension $projName) local projPath="$(GetProjectPath "$projName")" if [ -f "$projPath/$ConfDir/$type$virtualName" ]; then findScript="$projPath/$ConfDir/$type$virtualName" fi echo $findScript return 0 } FindScript() { local projName=$1 local type=$2 local script= script="$(CheckScript "$projName" "$type")" if [ -n "$script" ]; then echo "$script" return 0 else return 1 fi } findBuildScript() { local projName=$1 FindScript "$projName" "build" } findBuildFlagsScript() { local projName=$1 FindScript "$projName" "buildflags" } findInstallDevScript() { local projName=$1 FindScript "$projName" "install-dev" } findInstallScript() { local projName=$1 FindScript "$projName" "install" } findDependConf() { local projName="$1" FindScript "$projName" "depends" } FindConflictConf() { local projName="$1" FindScript "$projName" "conflict" } findErrorScript() { local projName=$1 FindScript "$projName" "error" } CheckPermission() { # Only root can run this id | grep "uid=0" >/dev/null if [ $? != "0" ]; then echo "ERROR: This script must be run as root"; echo ""; exit 1; fi # Stop!! If /root/.chroot does not exit if [ ! -f /root/.chroot ]; then echo "ERROR: Please chroot first!!" echo "" exit 1; fi } # $1: target to find, else: list to search CheckInList() { [ $# -lt 1 ] && CheckErrorOut 1 "Wrong number of parameters to $FUNCNAME()." local target="$1" proj= shift for proj in $@; do [ $proj = $target ] && return 0 done return 1 } CheckProjectStatus() { $ScriptsDir/include/errors.py $1 $2 } CheckErrorLog() { local errors local warns local logFile local warnCount blocked blockedList local allProjCount=0 local errProjCount=0 local warnProjCount=0 local blockProjCount=0 local ret= local logType=$1 shift local projectList=$@ local errorFile="${LogDir}/error.$logType" if [ -r "$errorFile" ]; then mv -f $errorFile ${errorFile}.old fi for proj in $projectList; do logFile="${LogDir}/${proj}.$logType" result=$(CheckProjectStatus $logType $proj) ret=$? if [ $ret -eq 1 ]; then echo "Result file $logFile doesn't exist or isn't readable." 2>&1 | tee -a $errorFile echo "Cannot check any information about compiling error(s)." echo "" errors="Y" else if [ $ret -ne 0 ]; then echo "I got the following error:" >> $logFile echo -e "$result" >> $logFile echo "########################################################" echo " Error(s) occurred on project \"$proj\"" 2>&1 | tee -a $errorFile echo "########################################################" errors="Y" errProjCount=$(( $errProjCount + 1 )) fi if [ "$1" = "build" ]; then warnCount=`grep -s "warning:" $logFile | wc -l` if [ 0 -ne $warnCount ]; then printf "%-40s:\t%4d warning(s)\n" $proj $warnCount warns="Y" warnProjCount=$(( $warnProjCount + 1 )) fi fi blocked="$(grep -s "^\[Blocked\]" $logFile)" if [ -n "$blocked" ]; then blockedList="$blockedList $proj" blockProjCount=$(( $blockProjCount + 1 )) fi fi allProjCount=$(( $allProjCount + 1 )) done [ -n "$blockedList" ] && echo -e "\nBlocked projects:$blockedList\n" echo -n "$allProjCount projects, $errProjCount failed" if [ "$1" = "build" ]; then echo -n ", $warnProjCount have warnings" fi echo ", $blockProjCount blocked." echo "" if [ "$errors" = "Y" ]; then ERROR "Check [${errorFile}] for fixing errors." return 1 fi return 0 } # check error code, if error code != 0, print message and exit # Usages: # CheckErrorOut ErrorCode Message CheckErrorOut() { if [ $1 != 0 ]; then echo "$2" >&2; exit $1; fi } INFO(){ local std_dest [ "$ShowDebug" = "yes" ] && std_dest=">&3" if [ $# -lt 2 ]; then eval echo -e "[INFO] $1" $std_dest else if [ -z "$1" ]; then eval echo -e "[INFO] $2" "$std_dest" else eval echo -e "[$1] $2" "$std_dest" fi fi } ERROR(){ if [ $# -lt 2 ]; then echo -e "[Error] $1" >&2 else if [ -z "$1" ]; then echo -e "[Error] $2" >&2 else echo -e "[$1] $2" >&2 fi fi } WARNING() { echo -e "\033[93m[WARNING] $1\033[0m" >&2 } ShowTimeCost() { TAG_INTERNAL="" #echo $* if [ -n "$3" ]; then TAG_INTERNAL="[$3]" fi D_INT0=$1 D_INT1=$2 DIFF_INT=$((${D_INT1}-${D_INT0})) DIFF_SEC=$((${DIFF_INT}%60)) DIFF_MIN=$(((${DIFF_INT}/60)%60)) DIFF_HOUR=$(((${DIFF_INT}/3600)%60)) printf "Time cost: %02d:%02d:%02d %s\n" ${DIFF_HOUR} ${DIFF_MIN} ${DIFF_SEC} "${TAG_INTERNAL}" } CheckTimeCostLog() { local logType=$1 shift local projectList=$@ local logFile= local result= echo -e "\n----------------- Time cost statistics -----------------" for proj in $projectList; do logFile="${LogDir}/${proj}.$logType" if [ -r "$logFile" ]; then #echo "file: ${logFile}" result=`grep "Time cost:" $logFile` [ -n "$result" ] && echo "$result" fi done echo "" } GetBaseDirs() { # by default, the BASEDIR should be /synosrc or /synosrc.xxx # get dir path of scripts for following inclusion of other scripts CurDir=`pwd` BASEDIR=`dirname $1` BASEDIR=`dirname ${BASEDIR}` #echo "file: $0" #echo "CurDir: ${CurDir}" #echo "ScriptDir: ${ScriptsDir}" echo "BASEDIR: ${BASEDIR}" } # FIXME for test Debug() { return 0 [ $# -ne 2 ] && return 0 echo -e "\033[$1m$2\033[0m" } _get_key_value() { local key="$1" local file="$2" local val= if [ -z "$key" -o ! -f "$file" ]; then echo "Error: _get_key_value failed. key is empty or file not found." return 1 fi val="$(grep "^$key=" "$file" | cut -d'"' -f2)" echo "$val" } GetDSMCriticalUpdateNumber() { _get_key_value "smallfixnumber" "$VERSION_FILE" } GetDSMBuildNumber() { _get_key_value "buildnumber" "$VERSION_FILE" } GetDSMPacking() { _get_key_value "packing" "$VERSION_FILE" } GetDSMPackingID() { _get_key_value "packing_id" "$VERSION_FILE" } GetDSMMajorNumber() { _get_key_value "majorversion" "$VERSION_FILE" } GetDSMMinorNumber() { _get_key_value "minorversion" "$VERSION_FILE" } GetSmallFixNumber() { _get_key_value "smallfixnumber" "$VERSION_FILE" } GetProductVersion() { _get_key_value "productversion" "$VERSION_FILE" } GetBuildTime() { _get_key_value "buildtime" "$VERSION_FILE" } GetBuildDate() { _get_key_value "builddate" "$VERSION_FILE" } Is64BitProject() { local Proj=$1 local ProjExt= if [ "$DefaultBuild32Bit" = "yes" ]; then ProjExt=`GetVirtualProjectExtension $Proj` HasSubStr "$ProjExt" "64$" return fi Is32BitProject $Proj && return 1 return 0 } Is32BitProject() { #{{{ local ProjExt="" local Proj="$1" if ! Is64BitPlatform; then return 0 fi ProjExt=`GetVirtualProjectExtension $Proj` HasSubStr "$ProjExt" "32$" } #}}} getPlatformExcludeProjs() { local platformExcludeProj= if [ "$DefaultBuild32Bit" = "yes" ]; then platformExcludeProj=".*-virtual-64$" else platformExcludeProj=".*-virtual-32$" fi if ! Is64BitPlatform; then echo $platformExcludeProj return fi return } ExcludeList() { local list="$1" local excludeList="$2" if [ -z "${excludeList}" ]; then echo $list return 0 fi local excludeArgument="^(`echo $excludeList | sed 's/ /|/g'`)\$" echo $list | sed 's/ /\n/g' | grep -vE "${excludeArgument}" return 0 } SetupDSMBuildNumber() { unset DSM_BUILD_NUM DSM_SHLIB_MAJOR DSM_SHLIB_MINOR SMALLFIX_NUM DSM_STAGE PRODUCT_VERSION PACKING PACKING_ID local file=${1:-$VERSION_FILE} DSM_BUILD_NUM=$(GetDSMBuildNumber "$file") DSM_SHLIB_MAJOR=$(GetDSMMajorNumber "$file") DSM_SHLIB_MINOR=$(GetDSMMinorNumber "$file") SMALLFIX_NUM=$(GetSmallFixNumber "$file") PRODUCT_VERSION=$(GetProductVersion "$file") PACKING=$(GetDSMPacking "$file") PACKING_ID=$(GetDSMPackingID "$file") if [ $? -ne 0 ]; then ERROR "cannot get build stage" exit 1 fi if [ -z "$DSM_BUILD_NUM" ]; then DSM_BUILD_NUM=`date "+%Y%m%d"` fi [ -z "$DSM_SHLIB_MAJOR" ] && DSM_SHLIB_MAJOR=0 [ -z "$DSM_SHLIB_MINOR" ] && DSM_SHLIB_MINOR=0 export DSM_BUILD_NUM DSM_SHLIB_MAJOR DSM_SHLIB_MINOR SMALLFIX_NUM PRODUCT_VERSION PACKING PACKING_ID } fi # vim:ft=sh