buildpkg/buildpkg.packaging.irix
Tom G. Christensen 40a88809c9 Fix stripping of shared objects. I don't know when this broke but at some
point file has stopped reporting 'not stripped' for shared libraries.
To detect such an issue in the future the strip functions will now print
the names of files they are working on.
2009-12-19 14:38:46 +01:00

1308 lines
40 KiB
Plaintext
Raw Blame History

# Function library for buildpkg framework
# It adds support for creating Irix packages in 'inst' format
# Copyright (C) 2003-2008 Tom G. Christensen <tgc@jupiterrise.com>
# 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, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Written by Tom G. Christensen <tgc@jupiterrise.com>.
#
# Define tool programs
# *only* platform specific packaging tools should be listed here
# generic tools go in buildpkg.functions
GENDIST="/usr/sbin/gendist"
GENDIST_OPTS="-nostrip"
SHOWPRODS="/usr/sbin/showprods"
SHOWFILES="/usr/sbin/showfiles"
# This is the hostname command we'll want on Irix
HOSTNAME=/usr/bsd/hostname
# Configuration vars
imageconf=$buildpkgbase/scripts/image.conf
subsysconf=$buildpkgbase/scripts/subsys.conf
idbfile=$metadir/$topdir.idb
specfile=$metadir/$topdir.spec
depends=$metadir/depends
replaces=$metadir/replaces
updates=$metadir/updates
opsfile=$metadir/ops
hidefile=$metadir/hide
showfilescache=/tmp/sf.cache
# Preformat manpages since Irix is not likely to have nroff available
symlinkman=1 # resolve .so links or formatting/compressing will fail
catman=1
# Compress manpages
gzman=1
compressman=0
# strip?
dostrip=1
dostrip_static=0 # Atleast std. Irix strip seems to mangle archives if strip -f is used
# Setup default args for strip. They match /usr/bin/strip in Irix 6.2
# Change these if you're using strip from GNU Binutils (recommended)
strip_elf_args="" # GNU default is -g
strip_shared_args="-f" # GNU default is --strip-unneeded
strip_static_args="-f" # GNU default is -g
# Other
usedepend=1 # Don't use depend file even if it's available
usescripts=1 # Don't add ops even if they're available
ignore_unpackaged_files=0 # default to check for unpackaged files in the stage area
include_source=0 # Include source[x] in the opt.src subsystem and not just patch[x]
# vendor & contact information to be added in relnotes
pkgedby="Tom G. Christensen"
email="irixpkg@jupiterrise.com"
# ver_width controls the width of the pkgversion numbers created
# do *not* change this blindly
# inst uses an INT value for the version number which can atmost be
# 2,147,483,647 that means it's not safe to extend the version number
# beyond 9 digits. With 10 digits a version starting with 22.xxxx will overflow
# the INT and crash inst.
ver_width=9
# Some versioning causes trouble with the normal version transformation (like 2.8->2.10)
# which ends up as 210 (2.10) < 280 (2.8) which is wrong
# This control will turn on zero prefixing of single digit version components in a version string
# so that 0210 (2.10) > 0208 (2.8).
# The default is on but be aware that it can also give problems with version transformation (like 2.08->2.1)
# which ends up as 0208 (2.08) > 0201 (2.1).
useextendedver=1
# Use run_configure
generic_configure=0
# Check config.log for nono libs
check_ac=1
configlog=config.log # override as necessary
# If you need to override any autoconf values put them in this string
# ie. ac_cv_lib_sun_mntent=no etc.
ac_overrides=""
# Run this command for the configure stage
__configure="./configure"
# When using autodeps sometimes we get undesired dependencies
# add them to this var to have them filtered out
ignore_deps=""
# When matching dependencies with packages should we resolve
# symlinks before looking in the showfilescache?
# Requires readlink from GNU coreutils.
# Should be 1 for Irix 5.3
deps_resolve_symlinks=0
# If not using gcc then please set this to 1<>
mipspro=0
# Comment these declarations to get it to run with ksh
declare -a pc # Array of product categories (image.subsys)
declare -a pd # Array of matching descriptions
declare -a ps # Array of subsystem properties - default or nodefault
declare -a pctop # Array of toplevel product categories (image)
declare -a pdtop # Array of matching descriptions
declare -a reqs # Array of subsystems with prereqs
declare -a reqp # Array of prereqs (should match up with reqs)
declare -a replacess # Array of subsystems that replaces another
declare -a replacepkg # Array of what is replaced (should match up with replacess)
declare -a updates # Array of subsystems that updates another
declare -a updatepkg # Array of what is updated (should match up with updatess)
declare -a hide # Files that should be "hidden" with nohist
declare -a opfiles # Files that should have an ops associated
declare -a opscript # Ops to associate with opfiles
#override defaults
pkgprefix=tgc_
pkgname=$pkgprefix$topdir
os=irix`${__uname} -r`
_os=$(${__uname} -sr|${__sed} -e 's/ //g' -e 's/\.//g' -e 's/IRIX64/IRIX/g'|${__tr} '[A-Z]' '[a-z]')
cpu=mips3
configure_args='--prefix=$prefix --mandir=${prefix}/${_mandir} --infodir=${prefix}/${_infodir}'
META_CLEAN="$topdir.spec $topdir.idb files.tmp ${depends##*/}_auto ${depends##*/}_all sums"
# Host specific configuration
[ -r $buildpkgbase/scripts/config.$($HOSTNAME -s).irix ] && . $buildpkgbase/scripts/config.$($HOSTNAME -s).irix
distfile='$topdir-$version-$pkgver.tgc-$os-$cpu-$pkgdirdesig.tardist'
#####################################################
# Internal helper functions
#####################################################
indent4=" "
indent8=" "
indent12=" "
indent16=" "
indent24=" "
# fix_ver(): "normalize" a version-pkgver pair
# params: $1=version
# Removes any '.' and '-' characters from a version string
# It also extends the width to $ver_width by moving the package revision
# to the far right and padding with zeroes inbetween.
fix_ver()
{
local numpad
local extendedwidth
local extendedver=""
local i
local version=$1
local rev=${version##*-}
local ver=$(echo ${version%%-*} | ${__sed} -e 's/-//g' -e 's/[a-zA-Z]//g')
if [ $useextendedver -eq 1 ]; then
### experimental
### zero prefixes all single digits in a versionstring
OIFS=$IFS
IFS=".
"
for i in $ver
do
if [ ${#i} -eq 1 ]; then
extendedver=${extendedver}0${i}
else
extendedver=${extendedver}${i}
fi
done
ver=$extendedver
fi
if [ $useextendedver -eq 0 ]; then
# Remove the dots
ver=$(echo $ver | ${__sed} -e 's/\.//g')
fi
let "numpad = $ver_width - ${#ver} - ${#rev}"
[ $numpad -lt 0 ] && error $E_BAD_VERSION fix_ver
while [ $numpad -gt 0 ]
do
ver="${ver}0"
let "numpad = $numpad - 1"
done
ver="${ver}${rev}"
echo $ver
}
# spec_header()
# param: $1=product name $2=description
spec_header()
{
echo "product $1"
echo "$indent4 id \"$2\""
}
spec_footer()
{
echo "endproduct"
}
# spec_img_header()
# param: $1=image name $2=image description $3=version
spec_img_header()
{
local nver=$(fix_ver $3)
echo "$indent4 image $1"
echo "$indent8 id \"$2\""
echo "$indent8 version $nver"
echo "$indent8 order 9999"
}
# spec_img_footer()
spec_img_footer()
{
echo "$indent4 endimage"
}
# spec_subsys_header()
# param: $1=image $2=subsys $3=description $4=subsys property
spec_subsys_header()
{
echo "$indent8 subsys $2 $4"
echo "$indent12 id \"$3\""
echo "$indent12 exp $pkgname.$1.$2"
}
# spec_subsys_req_header()
# param: none
spec_subsys_req_header()
{
echo "$indent16 prereq ("
}
# spec_subsys_req()
# param: $1=prereq
spec_subsys_req()
{
echo "$indent24 $1"
}
# spec_subsys_req_footer()
# param: none
spec_subsys_req_footer()
{
echo "$indent24"")"
}
# spec_subsys_replaces()
# param: $1 = subsystem that is replaced
spec_subsys_replaces()
{
echo "$indent12 replaces $1"
}
# spec_subsys_updates()
# param: $1 = subsystem that is updated
spec_subsys_updates()
{
echo "$indent12 updates $1"
}
# spec_subsys_footer()
# param: none
spec_subsys_footer()
{
echo "$indent8 endsubsys"
}
# check_ops(): Is there an opscript associated with $1
# param: $1=file to check
check_ops()
{
local file="$1"
local return=""
if [ "$usescripts" -eq 0 ]; then
echo $return
fi
#echo "file is $file" >> /tmp/debug
for ((i=0; $i < ${#opfiles[@]}; i++))
do
#echo "opfiles $i is ${opfiles[$i]}" >> /tmp/debug
if [ "${opfiles[$i]}" == "$file" ]; then
return="${opscript[$i]}"
fi
done
echo $return
}
# fix_fname(): Sanitize filename
# param: $1=filename to fix
# The purpose is to "fix" filenames that gendist won't like
# ie. names with space are a no-no.
fix_fname()
{
local name="$1"
local return
# Replace ' ' with '_'
return=$(echo $name|${__sed} -e 's/ /_/g')
echo $return
}
# add_files()
# Create IDB entries for all files in a specfic product category
# Takes the following parameters
# $1 = dirname to descend into
# $2 = product_category to assign files
# $3 = permissions to set on the files we find
# $4 = user
# $5 = group
# $6 = special attribute
add_files()
{
local fspec=$(_upls $1)
local prodcat=$2
local defperm=$3
local owner=$4
local group=$5
local specattr=$6
local slash=''
local topinstd=${topinstalldir:1}
[ ! "$topinstalldir" == "/" ] && slash='/' #="${topinstalldir}/"
# This is a workaround
# Sometimes $topinstalldir:1 returns garbage when topinstalldir=/
[ "$topinstalldir" = "/" ] && topinstd=""
local FILES=$(${__find} $fspec -type f -print|${__tee} -a $metadir/files.tmp)
OIFS=$IFS # We play IFS tricks so we can handle filenames with embedded spaces
IFS="
"
for i in $FILES
do
IFS=$OIFS
if [ "$defperm" == "-" ]; then
permlist=`${__ls} -l "$i" | ${__cut} -d " " -f 1`
perm=$(compute_octal $permlist)
else
perm=$defperm
fi
doop=$(check_ops "$i")
fname=$(fix_fname "$i")
if [ ! -z "$doop" ]; then
if [ ! -z "$specattr" ]; then
specattr="$specattr $doop"
else
specattr=$doop
fi
fi
if [ ! -z "$specattr" ]; then
echo "f $perm $owner $group ${topinstd}${slash}$fname $i ${pkgname}.${prodcat} $specattr" >>$idbfile
else
echo "f $perm $owner $group ${topinstd}${slash}$fname $i ${pkgname}.${prodcat}" >>$idbfile
fi
specattr="" # If there's more than one file we must reset specattr to avoid polluting the next entries
done
IFS=$OIFS
# Handle symlinks
local FILES=$(${__find} $fspec -type l -print|${__tee} -a $metadir/files.tmp)
OIFS=$IFS
IFS="
"
for i in $FILES
do
IFS=$OIFS
if [ "$defperm" == "-" ]; then
permlist=`${__ls} -l "$i" | ${__cut} -d " " -f 1`
perm=$(compute_octal $permlist)
else
perm=$defperm
fi
local temp=`${__ls} -l "$i"|${__cut} -d '>' -f 2`
local symval=${temp# }
fname=$(fix_fname "$i")
echo "l $perm $owner $group ${topinstd}${slash}$fname $i ${pkgname}.${prodcat} symval($symval)" >>$idbfile
done
IFS=$OIFS
}
# add_dir(): Add a single dir entry to the IDB file
# params: $1=dir $2=subsys $3=default permissons $4=defuid $5=defgid
# Currently ops and specattr are unimplemented for dirs
add_dir()
{
local fspec=$(_upls $1)
local prodcat=$2
local defperm=$3
local owner=$4
local group=$5
local topinstd="$topinstalldir"
#[ ! "$topinstalldir" == "/" ] && topinstalldir="${topinstalldir}/"
[ ! "$topinstd" = "/" ] && topinstd="${topinstd:1}/"
# This is a workaround
# Sometimes $topinstalldir:1 returns garbage when topinstalldir=/
[ "$topinstd" = "/" ] && topinstd=""
# Note that dir blablah is *not* added to $metadir/files.tmp
#local FILES=$(${__find} $fspec -type d -print)
local FILES=$fspec
OIFS=$IFS
IFS="
"
for i in $FILES
do
IFS=$OIFS
if [ "$defperm" == "-" ]; then
permlist=$(${__ls} -ld "$i" | ${__cut} -d " " -f 1)
perm=$(compute_octal $permlist)
else
perm=$defperm
fi
fname=$(fix_fname "$i")
echo "d $perm $owner $group ${topinstd}$fname $i ${pkgname}.${prodcat}" >>$idbfile
done
IFS=$OIFS
}
# fetch_imageconf(): Fetch a list of toplevel image entries with descriptions
# params: none
# Discard the ones that we don't have any subsystems for
fetch_imageconf()
{
local pctopidx=0
local numloops=${#pc[@]}
local i=0
while read image desc
do
for ((i=0; i < $numloops; i++))
do
temp="${pc[$i]%%.*}"
if [ "$image" == "$temp" ]; then
pctop[$pctopidx]=$image
pdtop[$pctopidx]=$desc
let "pctopidx = $pctopidx + 1"
break # We found a match no need to loop further
fi
done
done < $imageconf
}
# fetch_subsysdesc(): Fetch a list of subsystem descriptions
# params: none
fetch_subsysdesc()
{
local i=0
local numloops=${#pc[@]}
local ss
local sp
local desc
while read ss sp desc
do
for ((i=0; i < $numloops; i++)) # Find subsystem...
do
if [ "${pc[$i]}" = "$ss" ]; then
pd[$i]="$desc"
if [ "$sp" == "nodefault" ]; then
ps[$i]=""
else
ps[$i]=$sp
fi
break # Found it, skip to the next line
fi
done
done < $subsysconf
}
# fetch_depends(): Fetch a list of subsystems and their prereqs
# params: none
#
fetch_depends()
{
local reqidx=0
local havedep=0
[ -r ${depends} ] && ${__cat} ${depends} > ${depends}_all
[ -r ${depends}_auto ] && ${__cat} ${depends}_auto >> ${depends}_all
# Are there any deps we should ignore?
if [ -n "$ignore_deps" ]; then
local j
local cmd
for j in $ignore_deps
do
cmd="$(echo $j | ${__sed} -e 's;\.;\\\.;g')"
${__gsed} -i "/$cmd/d" ${depends}_all
done
fi
if [ -r ${depends}_all ]; then
while read ss reqpkg reqvers
do
havedep=0
if [ "$reqvers" == "auto" ]; then # auto create depend on $reqpkg
# Check if it's an internal depend
# There's no real safe way to check but we will assume
# That if there's only a single . in the $reqpkg then it's internal
local deplen=$((${#reqpkg}-1)) # String length -1 (a single dot)
# Now if $deplen is longer than the same string with all dots removed
# then we know there was more than one dot and we can assume it's
# not an internal depend
if [ $deplen -gt "$(/bin/echo -n "$reqpkg" | ${__tr} -d '.' | wc -c)" ]; then
# External depend
# Grab version
nver="$($SHOWPRODS -n $reqpkg | ${__grep} $reqpkg | ${__awk} '{ print $3 }')"
req="$reqpkg $nver maxint"
havedep=1
else
nver=$(fix_ver "$version-$pkgver")
req="$pkgname.$reqpkg $nver $nver"
havedep=1
fi
else
# When rebuilding a package we want to avoid the autodeps
# from adding deps on the already installed parts.
# Internal deps must be handled in depends with the auto keyword
# or chaos will ensue.
# We will try to check if the package name in the autodep matches the
# package we're building
if [ ! "${reqpkg%%.*}" == "$pkgname" ]; then
req="$reqpkg $reqvers"
havedep=1
else
echo "skipping depend: $ss $reqpkg $reqvers"
fi
fi
# Only increment and update arrays if we actually add the dep
if [ $havedep -gt 0 ]; then
reqs[$reqidx]=$ss
reqp[$reqidx]=$req
let "reqidx = $reqidx + 1"
fi
done < ${depends}_all
fi
}
# fetch_replaces(): Fetch information about subsystem replacements
# params: none
#
fetch_replaces()
{
local reqidx=0
if [ -r ${replaces} ]; then
while read ss replpkg reqvers
do
if [ "$reqvers" == "auto" ]; then
reqvers="0 maxint" # Replace all versions of a subsystem
fi
replacess[$reqidx]=$ss
replacepkg[$reqidx]="$replpkg $reqvers"
let "reqidx = $reqidx + 1"
done < ${replaces}
fi
}
# fetch_updates(): Fetch information about subsystem updates
# params: none
#
fetch_updates()
{
local reqidx=0
if [ -r ${updates} ]; then
while read ss updpkg reqvers
do
if [ "$reqvers" == "auto" ]; then
reqvers="0 maxint" # Update all versions of a subsystem
fi
updatess[$reqidx]=$ss
updatepkg[$reqidx]="$updpkg $reqvers"
let "reqidx = $reqidx + 1"
done < ${updates}
fi
}
# fetch_ops(): Fetch ops
# params: none
# Populates the firstop and lastop variables
# and the opfiles and opscript arrays
fetch_ops()
{
if [ -r $opsfile ]; then
opsidx=0
while read optype op
do
case $optype in
'firstop')
firstop="$op"
;;
'lastop')
lastop="$op"
;;
esac
opfiles[$opsidx]=$optype
opscript[$opsidx]=$op
let "opsidx = $opsidx + 1"
done < $opsfile
fi
}
# do_strip_bin(): Strip binaries
# params: none
do_strip_bin()
{
echo "Stripping ELF binaries..."
for f in `${__find} . -type f \( -perm -0100 -o -perm -0010 -o -perm -0001 \) -exec ${__file} {} \; | \
${__grep} -v ' dynamic lib ' | \
${__sed} -n -e 's/^\(.*\):[ ]*ELF.*\(not stripped\).*/\1/p'`; do
echo "strip_bin: $f"
${__strip} $strip_elf_args $f || :
done
}
# do_strip_shared(): Strip shared libraries
# params: none
do_strip_shared()
{
echo "Stripping ELF shared objects..."
# Strip ELF shared objects (see brp-strip-shared from RPM)
# Please note we don't restrict our search to executable files because
# our libraries are not (should not be, at least) +x.
for f in `${__find} . -type f -a -exec ${__file} {} \; | \
grep ' dynamic lib ' | \
${__sed} -n -e 's/^\(.*\):[ ]*ELF.*/\1/p'`; do
echo "strip_shared: $f"
${__strip} $strip_shared_args $f
done
}
# do_strip_static(): Strip static archives
# params: none
do_strip_static()
{
echo "Stripping static archives..."
# Strip static libraries. (see brp-strip-static-archive from RPM)
for f in `${__find} . -type f -a -exec ${__file} {} \; | \
${__grep} 'current ar archive' | \
${__sed} -n -e 's/^\(.*\):[ ]*current ar archive .*/\1/p'`; do
echo "strip_static: $f"
${__strip} $strip_static_args $f
done
}
##################################
# "external" functions
##################################
# create_idb(): Create the .idb file
# params: none
# Create idb file and insert any firstop/lastops
# Note that parse_def does most of the work.
create_idb()
{
fetch_ops
parse_def
# hackish - FIXME perhaps?
local pcpos=${#pc[@]} # First vacant position in the subsys list array $pc
if [ -d "${stagedir}${metainstalldir}src" ]; then # We have a srcdir which means we have patches, so add them to the idb file
add_files "${metaprefix}src" opt.src - root sys ""
pc[$pcpos]="opt.src"
let "pcpos = pcpos + 1"
fi
# HACK: relnotes cannot be updated before auto_deps has run
# but auto_deps needs the idb file.
# We'll create an empty placeholder so satisfy the code below that
# checks for releasenotes and updates the idb file.
# This snippet was taken from auto_rel and should be kept in sync
for i in relnotes relnotes.${_os} relnotes.txt relnotes.${_os}.txt;
do
[ -r ${metadir}/${i} ] && rn=$i
done
if [ -r ${metadir}/${rn} ]; then
local relmetadir=${stagedir}${metainstalldir}relnotes/$topdir-$version-$pkgver
${__mkdir} -p $relmetadir
echo "" > ${relmetadir}/${topdir}.txt
fi
if [ -d "${stagedir}${metainstalldir}relnotes" ]; then # We have releasenotes, add them to idb file
add_files "${metaprefix}relnotes" opt.relnotes - root sys ""
pc[$pcpos]="opt.relnotes"
let "pcpos = pcpos + 1"
fi
# spec & idb files are added unconditionally
pc[$pcpos]="opt.dist"
# Add entries for the spec & idb files (opt.dist), they will be installed later, after they've actually been created
echo "f 0644 root sys ${metainstalldir:1}dist/$topdir-$version-$pkgver/$topdir.idb ${metaprefix}dist/$topdir-$version-$pkgver/$topdir.idb ${pkgname}.opt.dist" >>$idbfile
echo "f 0644 root sys ${metainstalldir:1}dist/$topdir-$version-$pkgver/$topdir.spec ${metaprefix}dist/$topdir-$version-$pkgver/$topdir.spec ${pkgname}.opt.dist" >>$idbfile
echo "${metaprefix}dist/$topdir-$version-$pkgver/$topdir.idb" >> $metadir/files.tmp
echo "${metaprefix}dist/$topdir-$version-$pkgver/$topdir.spec" >> $metadir/files.tmp
${__sort} +4u -6 < $idbfile > $metadir/idbtemp
lines=$(wc -l < $metadir/idbtemp)
if [ ! -z "$firstop" ]; then
echo "$(head -1 $metadir/idbtemp) $firstop" > $metadir/idbtemp2
tail +2 $metadir/idbtemp >> $metadir/idbtemp2
else
mv $metadir/idbtemp $metadir/idbtemp2
fi
if [ ! -z "$lastop" ]; then
let "lines=$lines - 1"
echo "$(head -$lines $metadir/idbtemp2)" > $idbfile
echo "$(tail -1 $metadir/idbtemp2) $lastop" >> $idbfile
else
mv $metadir/idbtemp2 $idbfile
fi
${__rm} -f $metadir/idbtemp $metadir/idbtemp2
}
# create_spec(): Create the .spec file.
# params: none
# Uses name, pkgname & pkgver variables
# Iterate through pctop and for each iteration find
# all entries in pc belonging to that image
#
create_spec()
{
fetch_imageconf
fetch_subsysdesc
fetch_depends
fetch_replaces
fetch_updates
spec_header $pkgname "$name $version-${pkgver}${shortdesc}" > $specfile
local pcsize=${#pc[@]}
local pctopsize=${#pctop[@]}
local reqidlist
for ((i=0; i < $pctopsize; i++))
do
local pcidx=0
spec_img_header ${pctop[$i]} "${pdtop[$i]}" $version-$pkgver >> $specfile
while [ "$pcidx" -lt "$pcsize" ]
do
rv=`${__expr} match "${pc[$pcidx]}" ''${pctop[$i]}\\\.''`
if [ ! "$rv" -eq 0 ]; then # We got a hit!
spec_subsys_header ${pctop[$i]} `echo ${pc[$pcidx]}|${__cut} -d . -f 2` "${pd[$pcidx]}" "${ps[$pcidx]}" >> $specfile
# Add 'replaces' statements
spec_subsys_replaces self >> $specfile
replacepkgsize=${#replacepkg[@]}
if [ "$replacepkgsize" -ge 1 ]; then # Atleast one replaces statement needed
for ((j=0; j < $replacepkgsize; j++))
do
if [ "${replacess[$j]}" = "${pc[$pcidx]}" ]; then
spec_subsys_replaces "${replacepkg[$j]}" >> $specfile
fi
done
fi
# Add 'updates' statements
updatepkgsize=${#updatepkg[@]}
if [ "$updatepkgsize" -ge 1 ]; then # Atleast one updates statement needed
for ((j=0; j < $updatepkgsize; j++))
do
if [ "${updatess[$j]}" = "${pc[$pcidx]}" ]; then
spec_subsys_updates "${updatepkg[$j]}" >> $specfile
fi
done
fi
# Find 'prereq' statements
reqsize=${#reqs[@]}
unset reqidlist # Zero the array
reqidlidx=0
for ((j=0; j < $reqsize; j++))
do
if [ "${reqs[$j]}" == "${pc[$pcidx]}" ]; then
reqidlist[$reqidlidx]=$j
let "reqidlidx=$reqidlidx + 1"
fi
done
# Add 'prereq' statements
reqidlsize=$reqidlidx
if [ "$reqidlsize" -ge 1 ]; then
spec_subsys_req_header >> $specfile
for ((j=0; j < $reqidlsize; j++))
do
id=${reqidlist[$j]}
spec_subsys_req "${reqp[$id]}" >> $specfile
done
spec_subsys_req_footer >> $specfile
fi
spec_subsys_footer >> $specfile
fi
let "pcidx = $pcidx + 1"
done
spec_img_footer >> $specfile
done
spec_footer >> $specfile
}
# make_dist(): Create inst image
# params: none
# Run gendist to create the instimage
make_dist()
{
if [ "$1" == "shortroot" ]; then
error $E_ARG_OBSO make_dist
fi
local sbase=${stagedir}${topinstalldir}
local disttmp=/tmp/disttmp$$
${__mkdir} $disttmp
local dfile=$(_upls $distfile)
$GENDIST $GENDIST_OPTS -rbase $topinstalldir -sbase $sbase -idb $idbfile -spec $specfile -dist $disttmp
setdir $disttmp
${__vtar} -cf $distdir/$dfile $pkgname*
setdir stage
${__rm} -rf $disttmp
echo "Done. Package was created as $dfile"
}
# parse_pkgdef(): Read in $metadir/pkgdef
# params: none
# This will parse the package descriptions in
# pkgdef that tells us how many packages there
# should be and what they include.
parse_def()
{
local section=0
local foundfiles=0
local secname=""
local secpos=0
local legalend=0
local index=0
local found=0
local i=0
local equalindex=""
while read line
do
case ${line:0:1} in
'#') ;;
'[')
if [ $section -eq 1 ]; then
error $E_BAD_SECTION_BEGIN parse_def
else
section=1
secname="${line:1:((${#line}-2))}"
legalend=0
fi
;;
'')
if [ $section -eq 0 ]; then
error $E_BAD_SECTION_END parse_def
else
section=0 # Finished this section
foundfiles=0 #
legalend=1 # We encountered a syntacticly correct section end
fi
;;
*)
equalindex=$(expr index "$line" "\=")
if [ $equalindex -ne 0 ]; then
case "${line:0:(($equalindex-1))}" in
'pkgname')
pkgname="$(_upls ${line:$equalindex:${#line}})"
;;
'name')
name="$(_upls ${line:$equalindex:${#line}})"
;;
'pkgver')
pkgver="$(_upls ${line:$equalindex:${#line}})"
;;
'subsys') subsys="$(_upls ${line:$equalindex:${#line}})"
found=0
for i in ${pc[@]} # If $subsys is already there then don't add it again
do
if [ "$i" = "$subsys" ]; then
found=1
break # It's already there so skip out
fi
done
if [ $found -eq 0 ]; then
pc[$index]=$subsys
let "index = $index + 1"
fi
;;
'shortdesc')
shortdesc="$(_upls ${line:$equalindex:${#line}})"
if [ ! -z "$shortdesc" ]; then
shortdesc=" - $shortdesc"
fi
;;
esac
else # Perhaps we hit 'files'?
if [ "${line:0:5}" == "files" ]; then
triplet="${line:6:((${#line}-5-2))}"
defaultperms=$(_upls $(echo $triplet | ${__awk} -F, '{ print $1 }'))
defaultuid=$(_upls $(echo $triplet | ${__awk} -F, '{ print $2 }'))
defaultgid=$(_upls $(echo $triplet | ${__awk} -F, '{ print $3 }'))
foundfiles=1
else
if [ $foundfiles -eq 1 ]; then # We already found the 'files' line so this must be the filelist
if [ "${line:0:5}" == "hide " ]; then
specattr="nohist"
line=${line:5}
fi
if [ "${line:0:4}" == "dir " ]; then
add_dir "${line:4}" $subsys $defaultperms $defaultuid $defaultgid # Add dir entry to idb file
else
add_files "$line" $subsys $defaultperms $defaultuid $defaultgid "$specattr" # Build idb file from filespec
fi
specattr="" # Reset special attribute
fi
fi
fi
;;
esac
done < $metadir/pkgdef
# If there is no blank line at the end of a pkgdef section (if there is only one section that is very
# likely) then we end up here without having executed the 'section end' actions (case '' above)
if [ $legalend -eq 0 ]; then
if [ $section -eq 0 ]; then
error $E_BAD_SECTION_END parse_def
else
section=0 # Finished this section
foundfiles=0 #
fi
fi
}
# check_unpackaged(): Check if there are unpackaged files in the stage area
# params: none
check_unpackaged()
{
local upf
local i
${__find} . -type f -print|${__sed} -e 's/\.\///g' > $tmpdir/files.tmp
${__find} . -type l -print|${__sed} -e 's/\.\///g' >> $tmpdir/files.tmp
# ${__find} . -type d -print|${__sed} -e 's/\.\///g'|${__grep} -v '^\.' >> $tmpdir/files.tmp
${__sort} $metadir/files.tmp|${__uniq} > $tmpdir/f1
${__sort} $tmpdir/files.tmp > $tmpdir/f2
upf="$(${__cat} $tmpdir/f1 $tmpdir/f2 | ${__sort} | ${__uniq} -u)"
if [ ! -z "$upf" ]; then
echo "There are unpackaged files in the stagedir:"
for i in $upf
do
echo "${indent4}${i}"
done
${__rm} -f $tmpdir/f1 $tmpdir/f2
if [ "$ignore_unpackaged_files" -eq 0 ]; then
error $E_UNPACKAGED_FILES check_unpackaged
fi
fi
${__rm} -f $tmpdir/f1 $tmpdir/f2
}
# auto_src(): Automatically place any patches and srcfiles into the stagedir
# params: none
# Grabs the original source and any patches and shoves them into
# ${metainstalldir}src/$topdir-$version-$pkgver for adding to the opt.src subsystem
auto_src()
{
local distsrcdir="${stagedir}${metainstalldir}src/$topdir-$version-$pkgver"
# Add patches
local numpatch=${#patch[@]}
local pnum=0
if [ "$numpatch" -gt 0 ]; then
${__mkdir} -p $distsrcdir
for ((pnum=0; pnum < $numpatch; pnum++))
do
if [ ! -z ${patch[$pnum]} ]; then # They didn't give us an empty string
if [ "${patch[$pnum]:0:1}" != "/" ]; then # We have a relative pathname
# expand to absolute
patch[$pnum]=$patchdir/${patch[$pnum]}
fi # We are now sure that $patch[$pnum] contains file with absolute path
if [ -r ${patch[$pnum]} ]; then # file is readable
echo "Copying patch[$pnum] - ${patch[$pnum]}"
${__cp} ${patch[$pnum]} $distsrcdir
else
error $E_BAD_FILE patch
fi
else
echo "Patch $pnum has empty filename"
fi
done
fi
# Add sourcecode
if [ $include_source -eq 1 ]; then
${__mkdir} -p $distsrcdir
local numsource=${#source[@]}
local snum=0
for ((snum=0; $snum < $numsource; snum++))
do
local absfile=$(get_source_absfilename $snum)
${__cp} $absfilename $distsrcdir
done
fi
}
# rel_conf_sub(): Put configure_args into the relnotes template
# params: none
# The set_configure_args command will call this function to
# substitute %%CONFIGURE%% in the relnotes template at the
# time of expansion.
rel_conf_sub()
{
local rn
local i
for i in relnotes relnotes.${_os}
do
[ -r ${metadir}/${i} ] && rn=$i
done
# Duplicated code from auto_rel :(
# compute configure info for relnotes
local cf="$(_upls $configure_args)"
[ -n "$ac_overrides" ] && local aco="$(echo $ac_overrides | ${__tr} ' ' '\n' | ${__awk} '{ printf "%s \\\\ \\n",$0 }')"
local temp_fullcf="$(echo "$__configure $cf" | ${__awk} '{ printf "%s\\n",$0 }')"
temp_fullcf="$(echo "${aco}${temp_fullcf}")"
# Remove trailing whitespace and \n
local fullcf="${temp_fullcf%\\*}"
# end
if [ -r ${metadir}/${rn} ]; then
${__sed} -e "s;%%CONFIGURE%%;$fullcf;g" \
${metadir}/${rn} > ${metadir}/${rn}.txt
fi
}
# set_configure_args(): Stuff new arguments into configure_args
# params: $1 = configure arguments
# If you want non-default configure_args put into relnotes
# automatically, then use this function to set them instead
# of overriding the configure_args variable directly.
set_configure_args()
{
configure_args="$1"
rel_conf_sub
}
# auto_rel(): Fix up and add releasenotes to stagedir
# params: none
# This will make some substitutions on a release note template
# and then copy the result to $stagedir/${metainstalldir}relnotes/$topdir-$version-$pkgver.txt
auto_rel()
{
local i
local rn
for i in relnotes relnotes.${_os} relnotes.txt relnotes.${_os}.txt;
do
[ -r ${metadir}/${i} ] && rn=$i
done
if [ -r ${metadir}/${rn} ]; then
local relmetadir=${stagedir}${metainstalldir}relnotes/$topdir-$version-$pkgver
# compute configure info for relnotes
local cf="$(_upls $configure_args)"
[ -n "$ac_overrides" ] && local aco="$(for ar in $ac_overrides; do echo $ar; done | ${__awk} '{ printf "%s \\\\ \\n",$0 }')"
local temp_fullcf="$(echo "$__configure $cf" | ${__awk} '{ printf "%s\\n",$0 }')"
temp_fullcf="$(echo "${aco}${temp_fullcf}")"
# Remove trailing whitespace and \n
local fullcf="${temp_fullcf%\\*}"
# end
if [ $mipspro -eq 0 ]; then
local compiler_temp="$(gcc --version 2>&1 | ${__sed} -n '1,1p')"
local compiler="gcc ${compiler_temp##* }"
else # not gcc
if [ "$_os" = "irix53" ]; then
local compiler="Irix 5.3 IDO"
else
local compiler="$(cc -version 2>&1)"
fi
if [ "$CXX" = "g++" ]; then
# SGI cc with gnu g++
local compiler_temp="$(g++ --version 2>&1 | ${__sed} -n '1,1p')"
local compiler="$((echo $compiler; echo g++ ${compiler_temp##* }) | ${__awk} '{ printf "%s\\n",$0 }')"
local compiler="${compiler%\\*}"
fi
fi
local pkgnam_temp=$(${__grep} 'pkgname=' $metadir/pkgdef)
local pkgnam=$(_upls ${pkgnam_temp#pkgname=*})
local vendor_temp=$(${__grep} 'pkgvendor=' $metadir/pkgdef)
local vendor=$(_upls ${vendor_temp#pkgvendor=*})
local packager="${pkgedby} <${email}>"
# Compute SHA1 sums for all source entries
local snum
local path
local file
local source_sha1sum
local temp_source_sha1sum=""
for ((snum=0; $snum < ${#source[@]}; snum++))
do
path="$(get_source_path $snum)"
file="$(get_source_filename $snum)"
(cd "$path"; ${__sha1sum} "$file") >> $metadir/sums
done
[ -r "$metadir/sums" ] && temp_source_sha1sum="$(cat $metadir/sums | ${__awk} '{ printf "%s\\n",$0 }')"
source_sha1sum="${temp_source_sha1sum%\\*}"
# End of SHA1 sum computing
local temp_extracted_env="$(${__sed} -e 's/export /echo ENV /g' ${buildpkgbase}/${pkgdir}/build.sh >> /tmp/env.sh; bash /tmp/env.sh|${__grep} ^ENV|${__sed} -e 's/ENV //g'|${__awk} '{ printf "%s\\n",$0 }' && ${__rm} -f /tmp/env.sh)"
# Remove trailing \n
local extracted_env="${temp_extracted_env%\\*}"
if [ -r ${depends}_all ]; then
local temp_deps="$(${__cat} ${depends}_all | ${__grep} -v $pkgnam | ${__grep} $pkgprefix | ${__sed} -e "s/.*${pkgprefix}//" | ${__cut} -d. -f1 | ${__sort} -u | ${__awk} '{ printf "%s\\n",$0 }')"
else
local temp_deps=""
fi
local deps="${temp_deps%\\*}"
${__mkdir} -p $relmetadir
${__gsed} -e "s;%%PKGNAME%%;${pkgnam};g" \
-e "s;%%SOURCE_AND_VER%%;${topdir}-${version};g" \
-e "s;%%CONFIGURE%%;${fullcf};g" \
-e "s;%%COMPILER%%;${compiler};g" \
-e "s;%%VENDOR%%;${vendor};g" \
-e "s;%%PKGEDBY%%;${packager};g" \
-e "s;%%SOURCE_SHA1SUM%%;${source_sha1sum};g" \
-e "s;%%ENVIRONMENT%%;${extracted_env};g" \
-e "s;%%DEPENDENCIES%%;${deps};g" \
${metadir}/${rn} > "$relmetadir/${topdir}.txt"
else
echo "auto_rel: No release notes found!"
fi
}
# auto_dist(): Add idb & spec files to stagedir
# params: none
# This will copy the newly created idb & spec files to
# the stagedir under ${metainstalldir}dist/$topdir-$version-$pkgver
auto_dist()
{
local distmetadir=${stagedir}${metainstalldir}dist/$topdir-$version-$pkgver
${__mkdir} -p $distmetadir
${__cp} $idbfile $distmetadir
${__cp} $specfile $distmetadir
}
# dep_pkg_name: Given a filename it will look it up and find the subsystemname
# Params: A list of filenames
# Uses the showfiles cache to find the subsystemnames that the input filenames
# belong to.
dep_pkg_name()
{
local pkg
while read files
do
for i in $files
do
[ -L "$i" -a $deps_resolve_symlinks -eq 1 ] && i=$(${__readlink} -f "$i")
pkg=$(${__grep} " ${i:1}$" $showfilescache 2>/dev/null)
if [ -n "$pkg" ]; then
#echo "Found $i in $pkg" >> /tmp/depdebug
echo "$pkg"
fi
done
done
}
# extract_deps: Given a subsystem it will extract the dependencies
# params: $1 = subsystem name (like tgc_xxx.sw.lib)
# It goes through the idb file and finds all the files
# associated with a given subsystem. It will then compute
# the dependencies and return the package names for the dependencies.
extract_deps()
{
# Can't use setdir since it has output
cd ${stagedir}${topinstalldir}
# Grab the filelist and classify files
local filelist=$(${__grep} $1 $idbfile | ${__awk} '{ print $6 }')
local exelist=$(echo $filelist | ${__xargs} ${__file} | ${__egrep} -v ":.* (commands|script) " | ${__grep} ":.*executable" | ${__cut} -d: -f1)
local scriptlist=$(echo $filelist | ${__xargs} ${__file} | ${__egrep} ":.* (commands|script) " | ${__cut} -d: -f1)
local liblist=$(echo $filelist | ${__xargs} ${__file} | ${__grep} ":.*dynamic lib" | ${__cut} -d: -f1)
# Compute dependencies for executables
if [ -n "$exelist" ]; then
for f in $exelist; do
[ -r $f -a -x $f ] || continue
# Generic Irix ldd
# ${__ldd} $f | ${__grep} \= | ${__awk} -F' ' '{ print $3 }' | ${__cut} -d\ -f2
# Ariel Faigons perl5 ldd
${__ldd} $f | ${__grep} \= | ${__grep} -v 'not found' | ${__sed} -e 's/.*=> //g'
done | ${__sort} -u | dep_pkg_name | ${__awk} '{ print $4 }' | ${__sort} -u
fi
# Compute dependencies for dynamic libraries
if [ -n "$liblist" ]; then
for f in $liblist; do
[ -r $f ] || continue
# Generic Irix ldd
#${__ldd} $f | ${__grep} \= | ${__awk} -F' ' '{ print $3 }' | ${__cut} -d\ -f2
# Ariel Faigon's perl5 ldd
${__ldd} $f | ${__grep} \= | ${__grep} -v 'not found' | ${__sed} -e 's/.*=> //g'
done | ${__sort} -u | dep_pkg_name | ${__awk} '{ print $4 }' | ${__sort} -u
fi
# Compute dependencies for scripts
if [ -n "$scriptlist" ]; then
for f in $scriptlist; do
[ -r $f -a -x $f ] || continue
interp="$(${__head} -n 1 $f | ${__cut} -d\! -f2- | ${__sed} -e 's/ -.*//')"
if [ -L "$interp" ]; then
echo $(${__file} -h "$interp" | ${__sed} -e 's/.* to //')
else
if [ "$(echo $interp | ${__cut} -d' ' -f1)" = "/usr/bin/env" ]; then
echo "/usr/bin/env"
else
echo $interp
fi
fi
done | ${__sort} -u | dep_pkg_name | ${__awk} '{ print $4 }' | ${__sort} -u
fi
}
# auto_deps(): Compute dependencies
# params: none
# This will go through the idb file and identify the subsystems.
# It will then call extract_deps() to get the packagenames of the
# dependencies. The dependencies will be added to $metadir/depends_auto.
auto_deps()
{
local i
local j
local deps
local subsystems
# Populate showfiles cache
$SHOWFILES -l > $showfilescache
subsystems="$(${__awk} '{ print $7 }' < $idbfile | ${__sort} -u | ${__grep} sw)"
for i in $subsystems
do
deps="$(extract_deps $i)"
for j in $deps
do
echo "${i#*.} $j $($SHOWPRODS -n $j | ${__grep} $j | ${__awk} '{ print $3 }') maxint"
done
done | ${__sort} -u | grep $pkgprefix > ${depends}_auto
rm -f $showfilescache
}
# run_configure(): Do the configure part of the build stage
# params: none
#
run_configure()
{
#eval "$ac_overrides ./configure $(_upls $configure_args)"
local acvar
for acvar in $ac_overrides
do
export $acvar
done
$__configure $(_upls $configure_args)
if [ $check_ac -gt 0 ]; then
local out="$(check_ac warn $configlog)"
if [ -n "$out" ]; then
echo $out
error $E_BAD_LIBS run_configure
fi
fi
}
# generic_pack(): Build package using files from 'install' stage
# params: $1 - indicating whether or not the root is complete as described below
# We expect generic_install to have made $stagedir the "root" dir
# in that all paths below will be complete (ie. /usr/local/bin and not
# just bin).
generic_pack()
{
if [ "$1" == "shortroot" ]; then
error $E_ARG_OBSO generic_pack
fi
clean meta
if [ -d ${stagedir}${prefix}/${_mandir} ]; then
setdir "${stagedir}${prefix}/${_mandir}"
[ "$symlinkman" -eq 1 ] && symlink_man
[ "$catman" -eq 1 ] && fix_man
[ "$gzman" -eq 1 -o "$compressman" -eq 1 -o "$packman" -eq 1 ] && compress_man
fi
if [ -d ${stagedir}${prefix}/${_infodir} ]; then
setdir "${stagedir}${prefix}/${_infodir}"
[ "$gzinfo" -eq 1 ] && compress_info
fi
# pkgdef entries should always be relative to topinstalldir
# except for the auto ones - src,dist,relnotes
# In that case we use metaprefix to designate their position relative
# to topinstalldir (note metainstalldir can never be above topinstalldir)
# ie. topinstalldir=/usr/local/gcc & metainstalldir=/usr/local is a no no.
# but topinstalldir=/usr/local & metainstalldir=/usr/local is okay and is the
# default
# This mostly matters when we have topinstalldir=/ and prefix=/usr/local like
# with prngd and openssh
# Also note that metaprefix is entirely for internal use in create_idb when
# we create the "auto" entries.
setdir ${stagedir}${topinstalldir}
# Determine at what level metainstalldir is compared to topinstalldir
metaprefix=${metainstalldir##$topinstalldir}
metaprefix="${metaprefix#/*}"
# If we have a path then we'll need a / appended
[ ! -z "$metaprefix" ] && metaprefix="${metaprefix}/"
# We need to add slash to the end of metainstalldir but *only* if
# metainstalldir is not /. We do this to avoid creating an absolute path
# which could happen with metainstalldir=/ if we unconditionally add /.
[ ! "$metainstalldir" == "/" ] && metainstalldir="${metainstalldir}/"
auto_src # Add any patches
create_idb
auto_deps
create_spec
auto_rel # Fix up and add releasenotes
auto_dist # Add idb & specfiles to stagedir
check_unpackaged
make_dist
}
# vim: set filetype=sh : #
# vim: set sts=4 : #
# vim: set shiftwidth=4 : #