OpenSDE Framework (without history before r20070)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

295 lines
8.8 KiB

#!/bin/bash
# --- SDE-COPYRIGHT-NOTE-BEGIN ---
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
#
# Filename: scripts/Build-Target
# Copyright (C) 2006 - 2012 The OpenSDE Project
# Copyright (C) 2004 - 2006 The T2 SDE Project
# Copyright (C) 1998 - 2003 Clifford Wolf
#
# More information can be found in the files COPYING and README.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License. A copy of the
# GNU General Public License can be found in the file COPYING.
# --- SDE-COPYRIGHT-NOTE-END ---
#
# Run this command from the ROCK directory as ./scripts/Build-Target
# after running the ./scripts/Config and ./scripts/Download commands.
#
# It compiles/builds all the packages and stores them tar balls suitable
# for distribution.
#
# This script is the ROCK work-horse. It builds in a chroot environment
# (stage 2..9) and goes through a number of build stages:
#
config=default
build_only_this_job=
daemon_mode=0
autodownload=1
options="$*"
downloadopt="-q"
build_parallel=
build_debug=
while [ $# -gt 0 ] ; do
case "$1" in
-cfg) config=$2 ; shift ;;
-job) build_only_this_job=$2 ; shift ;;
-j) build_parallel=$2 ; shift ;;
-d) build_debug=1 ;;
-daemon) daemon_mode=1 ;;
-nodaemon) daemon_mode=0 ;;
-nodownload) autodownload=0 ;;
*) echo "Usage: $0 [ -daemon ] [ -nodownload ] [ -cfg config ]" \
" [ -j <n> ] [-d] " \
"[ -job <stage>-<package> ]" ; exit 1 ;;
esac
shift
done
./lib/sde-config/migrate.sh "$config" || exit 1
if [ "$daemon_mode" = 1 ] ; then
. config/$config/config
echo "Running $0 in the background (messages go to logfile only).."
echo "Logfile: build/$SDECFG_ID/TOOLCHAIN/logs/build_target.log"
nohup $0 $options -nodaemon > /dev/null 2> /dev/null < /dev/null &
exit 0
fi
. lib/functions.in
. lib/parse-config
build_root="$base/build/$SDECFG_ID"
build_toolchain="$base/build/$SDECFG_ID/TOOLCHAIN"
build_logs="$build_toolchain/logs" ; mkdir -p "${build_logs}"
build_pkgs="$build_toolchain/pkgs" ; mkdir -p "${build_root}"
if [ "$SDECFG_PARANOIA_CHECK" = 1 ] ; then
./bin/sde-check-system || exit 1
fi
# Package Build loop - executed by build-target
#
pkgloop() {
local x= y=
if [ "$SDECFG_NOBROKENDEPS" = 1 ]; then
nobrokendeps="-nobrokendeps"
else
nobrokendeps=
fi
if [ -z "$build_only_this_job" ]; then
if [ "`ls ${build_root}/var/adm/logs/*.err 2> /dev/null`" ] ; then
echo_header "Removing old error logs ..."
for y in 0 1 2 3 4 5 6 7 8 9; do
if [ "$SDECFG_RETRY_BROKEN" -eq 1 -o $y -le "$SDECFG_CONTINUE_ON_ERROR_AFTER" ]; then
for x in ${build_root}/var/adm/logs/$y-*.err ; do
if [ -f $x ]; then
echo_status "Removing ${x#$build_root/} ..."
rm -f $x
fi
done
fi
done
fi
if [ "`ls ${build_root}/var/adm/logs/*.out 2> /dev/null`" ] ; then
echo_header "Removing old output logs ..."
for x in ${build_root}/var/adm/logs/*.out ; do
echo_status "Removing ${x#$build_root/} ..."
rm -f $x
done
fi
while
next="`./scripts/Create-PkgQueue \
-cfg "$config" -single $nobrokendeps`"
[ "$next" ]
do
pkgloop_package $next
done
else
rm -f "${build_root}"/var/adm/logs/${build_only_this_job}.log"
rm -f "${build_root}"/var/adm/logs/${build_only_this_job}.err"
next="$( awk 'BEGIN { FS=" "; }
$5 == "'${build_only_this_job#*-}'" && \
$2 ~ /'${build_only_this_job%%-*}'/ \
{ $1="'${build_only_this_job%%-*}' 0";
print; exit; }' < config/$config/packages )"
[ "$next" ] && pkgloop_package $next
exit 0
fi
local invalidfiles="tmp/invalid-files-$config.lst"
local pkglst=`mktemp` errors=0; rm -f "$invalidfiles"
echo_header "Searching for old lingering files ..."
sed '/^[^X]/d ; s,.*=,,' config/$config/packages | cut -d' ' -f5 |
if [ $SDECFG_PKGFILE_VER = 1 ] ; then
while read p; do
v=$( grep '^Package Name and Version:' \
build/$SDECFG_ID/var/adm/packages/$p \
2>/dev/null | cut -f6 -d' ' )
echo "$p-$v"
done
else
cat
fi > $pkglst
for file in $( ls build/$SDECFG_ID/TOOLCHAIN/pkgs/ 2> /dev/null ) ; do
x="$file"
case $SDECFG_PKGFILE_TYPE in
tar.*) x=${x%.$SDECFG_PKGFILE_TYPE} ;;
none) : ;;
esac
if ! grep -qx "$x" $pkglst && ! test "$x" = packages.db ; then
file="build/$SDECFG_ID/TOOLCHAIN/pkgs/$file"
echo_error "$file should not be present (now in $invalidfiles)!"
mkdir -p tmp; echo "$file" >> "$invalidfiles"
errors=1
fi
done
for dir in build/$SDECFG_ID/var/adm/{cache,cksums,dependencies,descs,flists,md5sums,packages} ; do
for file in $( ls $dir 2> /dev/null ) ; do
if [ $SDECFG_PKGFILE_VER = 1 ] ; then
x="$file-"
else
x="$file"
fi
if ! grep -q "$x" $pkglst ; then
echo_error "$dir/$file should not be present (now in $invalidfiles)!"
mkdir -p tmp; echo "$dir/$file" >> "$invalidfiles"
errors=1
fi
done
done
for file in $( ls build/$SDECFG_ID/var/adm/logs/ ) ; do
x="`echo $file | sed -e 's/^.-//' -e 's/\.log//' -e 's/\.err//' -e s'/\.out//'`"
if [ $SDECFG_PKGFILE_VER = 1 ] ; then
x=$x-
else
x=$x
fi
if ! grep -q "$x" $pkglst ; then
file="build/$SDECFG_ID/var/adm/logs/$file"
echo_error "$file should not be present (now in $invalidfiles)!"
mkdir -p tmp; echo "$file" >> "$invalidfiles"
errors=1
fi
done
[ $errors = 0 ] && echo_status "None found."
rm $pkglst
}
# Process one line of output generated by Create-PkgQueue
#
pkgloop_package() {
for x in stagelevel pkg_depnr pkg_stages pkg_pri pkg_tree \
pkg_name pkg_ver pkg_prefix pkg_extra
do eval "$x=\$1" ; shift ; done
[ "$build_only_this_job" -a \
"$stagelevel-$pkg_name" != "$build_only_this_job" ] && return
[ $(expr "$pkg_stages" : ".*$stagelevel.*") -eq 0 ] && return
pkg_laststage=$(echo "$pkg_stages" | sed "s,-,,g; s,.*\(.\),\1,")
cmd_root="-root auto"
[ $stagelevel -gt 1 ] && cmd_root="$cmd_root -chroot"
if [ "$pkg_prefix" != "/" ] ; then
cmd_prefix="-prefix $pkg_prefix"
else cmd_prefix= ; fi
if [ "$autodownload" = 1 ]; then
./bin/sde-download -cfg $config $downloadopt $pkg_name
fi
cmd_buildpkg="./scripts/Build-Pkg -$stagelevel -cfg $config"
[ -z "$build_debug" ] || cmd_buildpkg="$cmd_buildpkg -d"
[ -z "$build_parallel" ] || cmd_buildpkg="$cmd_buildpkg -j $build_parallel"
cmd_buildpkg="$cmd_buildpkg $cmd_root $cmd_prefix $pkg_name"
# Execute action handler
if ! pkgloop_action && \
[ $stagelevel -le "$SDECFG_CONTINUE_ON_ERROR_AFTER" ] ; then
exit 1
fi
if [ ! -f ${build_root}/var/adm/logs/$stagelevel-$pkg_name.log -a \
! -f ${build_root}/var/adm/logs/$stagelevel-$pkg_name.err ]
then
echo_header "Package build ended abnormally!"
echo_error "Usually a package build creates either a *.log"
echo_error "or a *.err file. Neither the 1st nor the 2nd is"
echo_error "there. So I'm going to create a *.err file now"
echo_error "and abort the build process."
touch ${build_root}/var/adm/logs/$stagelevel-$pkg_name.err
exit 1
fi
if [ $stagelevel -gt 0 -a $pkg_laststage -eq $stagelevel -a "$SDECFG_PKGFILE_TYPE" != none ]; then
if [ -f ${build_root}/var/adm/logs/$stagelevel-$pkg_name.err ]; then
echo_error "Creation of binary package isn't possible, because the package was not"
echo_error "built successfully in (at least) the current stage."
else
./lib/sde-binary/package.sh --type "$SDECFG_PKGFILE_TYPE" \
$( if [ "${SDECFG_PKGFILE_VER}" = 1 ]; then echo '--versioned'; fi ) \
$( if [ "${SDECFG_PKGFILE_NODEVEL}" = 1 ]; then echo '--nodevel'; fi ) \
--root "${build_root}" --output "${build_pkgs}" ${pkg_name}
fi
fi
}
# Action executed by pkgloop(). This function may be redefined
# before calling pkgloop().
#
pkgloop_action() {
local rc=
$cmd_buildpkg
rc=$?
if [ -f "config/$config/.stop" ]; then
rm -f "config/$config/.stop"
exit 0
fi
return $rc
}
# Try to umount any directories mounted by Build-Pkg -chroot
# if we are the last process using them.
#
umount_chroot() {
exec 201> /dev/null
if ! ( cd ${build_logs}; fuser *.log > /dev/null 2>&1 ); then
echo_status "Unmounting loop mounts ..."
umount -d -f $build_toolchain/{download,config,loop} 2> /dev/null
umount -d -f -l $build_toolchain/{download,config,loop} 2> /dev/null
umount -d -f $build_root/proc 2> /dev/null
umount -d -f -l $build_root/proc 2> /dev/null
fi
}
# must trap outside the group command
trap 'umount_chroot' EXIT
{
ln -sf build_target_$$.log ${build_logs}/build_target.log
./bin/sde-build-tools -1 -c $config
_built=0
for x in $(get_expanded ./target/%/build.sh $targetchain generic); do
if [ -f $x ]; then
. $x
_built=1
break
fi
done
[ $_built = 1 ] || echo_warning "No target/*/build.sh controlling the build!"
} 2>&1 201>> "${build_logs}/build_target_$$.log" | \
tee -a "${build_logs}/build_target_$$.log"