mirror of
https://github.com/SynologyOpenSource/pkgscripts-ng.git
synced 2025-07-25 17:10:06 +00:00
447 lines
8.5 KiB
Bash
447 lines
8.5 KiB
Bash
#!/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
|