Make symbolic links to directories in the appropriate way Change email addres sto match current preferences
334 lines
9.9 KiB
Text
334 lines
9.9 KiB
Text
#! @SH@
|
|
|
|
# $NetBSD: genrpm,v 1.3 2007/08/20 21:44:03 agc Exp $
|
|
|
|
#
|
|
# Copyright © 2005,2007 Alistair Crooks. All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
# 3. The name of the author may not be used to endorse or promote
|
|
# products derived from this software without specific prior written
|
|
# permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
# small shell script to convert from an installed NetBSD package to an rpm
|
|
#
|
|
# Usage: genrpm [--distdir=distdir] [--objdir=objdir] [--rpmdir=rpmdir] [--srpmdir=srpmdir] [--sign] [-s] [-v] pkgname
|
|
|
|
# find a program and set a global variable with its path
|
|
check_prog()
|
|
{
|
|
_var="$1"; _name="$2"
|
|
|
|
eval _tmp=\"\$$_var\"
|
|
if [ "x$_tmp" != "x" ]; then
|
|
# Variable is already set (by the user, for example)
|
|
return 0
|
|
fi
|
|
|
|
for _d in `echo $PATH | tr ':' ' '`; do
|
|
if [ -x "$_d/$_name" ]; then
|
|
# Program found
|
|
eval $_var=\""$_d/$_name"\"
|
|
return 1
|
|
fi
|
|
done
|
|
|
|
eval $_var=\"""\"
|
|
}
|
|
|
|
# make sure we have a directory (given as argument)
|
|
safemkdir()
|
|
{
|
|
_dir="$1"
|
|
|
|
echo "Making directory \"${_dir}\""
|
|
if [ ! -d ${_dir} ]; then
|
|
${mkdir_cmd} -p ${_dir}
|
|
fi
|
|
|
|
if [ ! -d ${_dir} ]; then
|
|
echo "can't create firectory ${_dir} - please do this by hand, and then restart" 2>&1
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# our definitions
|
|
DISTVENDOR=${DISTVENDOR:-"pkgsrc/genrpm"}
|
|
DISTRIBUTION=${DISTRIBUTION:-"pkgsrc genrpm `date +%Y%m%d`"}
|
|
|
|
# program definitions
|
|
check_prog awk_cmd awk
|
|
check_prog cp_cmd cp
|
|
check_prog gzip_cmd gzip
|
|
check_prog ln_cmd ln
|
|
check_prog ls_cmd ls
|
|
check_prog mkdir_cmd mkdir
|
|
check_prog mv_cmd mv
|
|
check_prog pkg_info_cmd pkg_info
|
|
check_prog rm_cmd rm
|
|
check_prog sed_cmd sed
|
|
check_prog tar_cmd tar
|
|
|
|
extract_cmd="${tar_cmd} xf -"
|
|
|
|
# find the right name for make(1)
|
|
opsys=`uname -s | tr -d /`
|
|
case "${opsys}" in
|
|
NetBSD) check_prog bmake_cmd make ;;
|
|
*) check_prog bmake_cmd bmake ;;
|
|
esac
|
|
|
|
# set defaults
|
|
DISTDIR=${DISTDIR:-@PKGSRCDIR@/distfiles}
|
|
objdir=/usr/obj
|
|
rpmdir=@PKGSRCDIR@/packages/rpms
|
|
srpmdir=@PKGSRCDIR@/packages/srpms
|
|
arch=`uname -m`
|
|
|
|
PKG_DBDIR=${PKG_DBDIR:-/var/db/pkg}
|
|
PKGSRC=${PKGSRC:-@PKGSRCDIR@}
|
|
|
|
verbose="" # by default, quiet running
|
|
sign="" # by default, no signature
|
|
genpat="-bb" # by default, just create a binary rpm
|
|
|
|
# and the immutables
|
|
redhatdir=/usr/pkg/src/redhat
|
|
reqpkgs="pkg_tarup rpm"
|
|
metafiles="+BUILD_INFO +BUILD_VERSION +COMMENT +CONTENTS +DESC +SIZE_ALL +SIZE_PKG"
|
|
|
|
# check any given args
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--arch=*) arch=`echo "$1" | ${sed_cmd} -e 's|--arch=||'` ;;
|
|
--distdir=*) DISTDIR=`echo "$1" | ${sed_cmd} -e 's|--distdir=||'` ;;
|
|
--objdir=*) objdir=`echo "$1" | ${sed_cmd} -e 's|--objdir=||'` ;;
|
|
--rpmdir=*) rpmdir=`echo "$1" | ${sed_cmd} -e 's|--rpmdir=||'` ;;
|
|
--srpmdir=*) srpmdir=`echo "$1" | ${sed_cmd} -e 's|--srpmdir=||'` ;;
|
|
--sign) sign="$1" ;;
|
|
-s) genpat="-ba" ;;
|
|
-v) verbose="-v"; set -x ;;
|
|
*) break ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# check canonical directories are there on NetBSD
|
|
safemkdir ${redhatdir}
|
|
safemkdir ${rpmdir}
|
|
safemkdir ${rpmdir}/${arch}
|
|
safemkdir ${srpmdir}
|
|
|
|
if [ ! -e ${redhatdir}/BUILD ]; then
|
|
(cd $redhatdir && ${ln_cmd} -s $objdir/rpm BUILD)
|
|
fi
|
|
|
|
if [ ! -e ${redhatdir}/RPMS ]; then
|
|
(cd $redhatdir && ${ln_cmd} -s $rpmdir RPMS)
|
|
fi
|
|
|
|
if [ ! -e ${redhatdir}/SRPMS ]; then
|
|
(cd $redhatdir && ${ln_cmd} -s $srpmdir SRPMS)
|
|
fi
|
|
|
|
if [ ! -e ${redhatdir}/SOURCES ]; then
|
|
(cd $redhatdir && ${ln_cmd} -s $objdir/rpm/SOURCES SOURCES)
|
|
fi
|
|
|
|
# check that we have required packages installed
|
|
for p in $reqpkgs; do
|
|
if ${pkg_info_cmd} -qe $p; then
|
|
echo "Using $p version `${pkg_info_cmd} -e $p`"
|
|
else
|
|
echo "The $p needs to be installed to use this rpm generator" 2>&1
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# generate an rpm for each package
|
|
while [ $# -gt 0 ]; do
|
|
if ${pkg_info_cmd} -qe "$1"; then
|
|
|
|
# expand the package name to include version information
|
|
name=`${pkg_info_cmd} -e $1`
|
|
|
|
# 3 components to package's name
|
|
pkgbase=`echo $name | ${sed_cmd} -e 's|-[0-9].*||'`
|
|
case "$name" in
|
|
*-[0-9]*nb*)
|
|
pkgversion=`echo $name | ${sed_cmd} -e 's|\(.*\)-\([0-9].*\)\(nb[0-9]*\)|\2|'`
|
|
nb=`echo $name | ${sed_cmd} -e 's|\(.*\)-\([0-9].*\)nb\([0-9]*\)|\3|'`
|
|
;;
|
|
*)
|
|
pkgversion=`echo $name | ${sed_cmd} -e 's|\(.*\)-\([0-9].*\)|\2|'`
|
|
nb=0
|
|
;;
|
|
esac
|
|
|
|
# retrieve information on prefix and pkgsrc directory from the package
|
|
pkgprefix=`${pkg_info_cmd} -qp $name | ${awk_cmd} '{ print $2; exit }'`
|
|
pkgpath=`${pkg_info_cmd} -B $name | ${awk_cmd} '/^PKGPATH=/ { sub("PKGPATH=", ""); print }'`
|
|
pkgname=$pkgbase-$pkgversion
|
|
|
|
# generate the rpm spec file first
|
|
echo "Making an rpm spec file for $name - $pkgname - ($pkgbase-$pkgversion-$nb)"
|
|
|
|
# make the build root
|
|
${mkdir_cmd} -p $objdir/rpm/BUILD/$pkgname/$pkgprefix
|
|
|
|
# make the single source directory
|
|
${mkdir_cmd} -p $objdir/rpm/SOURCES
|
|
|
|
# define the build directory
|
|
builddir=$objdir/rpm/BUILD/$pkgname
|
|
sourcesdir=$objdir/rpm/SOURCES/$pkgname
|
|
|
|
# create the specfile in the right place
|
|
specfile=$builddir/$pkgbase.spec
|
|
|
|
echo "%define name $pkgbase" > $specfile
|
|
echo "%define version $pkgversion" >> $specfile
|
|
echo "%define release $nb" >> $specfile
|
|
echo "%define prefix $pkgprefix" >> $specfile
|
|
echo "" >> $specfile
|
|
echo "" >> $specfile
|
|
|
|
echo "Summary: %{name}, `${pkg_info_cmd} -qc $name`" >> $specfile
|
|
echo "Name: %{name}" >> $specfile
|
|
echo "Version: %{version}" >> $specfile
|
|
echo "Release: %{release}" >> $specfile
|
|
echo "Copyright: unknown" >> $specfile
|
|
echo "URL: `${pkg_info_cmd} -d $name | ${awk_cmd} 'BEGIN { homepage=\"http://www.pkgsrc.org\"; }/^Homepage:/ { getline; homepage=$0 } END { print homepage }'`" >> $specfile
|
|
echo "Packager: Alistair Crooks <agc@pkgsrc.org>" >> $specfile
|
|
echo "Distribution: ${DISTRIBUTION}" >> $specfile
|
|
echo "Vendor: ${DISTVENDOR}" >> $specfile
|
|
echo "Prefix: ${pkgprefix}" >> $specfile
|
|
for p in "" `${pkg_info_cmd} -qn $name`; do
|
|
case "$p" in
|
|
"") continue ;;
|
|
*) case "$p" in
|
|
*-[0-9]*) p=`echo "$p" | ${sed_cmd} -e 's|\(.*\)-\([0-9].*\)|\1=\2|'` ;;
|
|
esac
|
|
case "$p" in
|
|
*nb[0-9]*) p=`echo "$p" | ${sed_cmd} -e 's|\(.*\)nb\([0-9]*\)|\1-\2|'` ;;
|
|
esac
|
|
echo "Requires: $p" >> $specfile ;;
|
|
esac
|
|
done
|
|
for p in "" `${pkg_info_cmd} -qv $name | ${awk_cmd} '/conflicts with/ { print $4 }'`; do
|
|
case "$p" in
|
|
"") continue ;;
|
|
*) case "$p" in
|
|
*-[0-9]*) p=`echo "$p" | ${sed_cmd} -e 's|\(.*\)-\([0-9].*\)|\1=\2|'` ;;
|
|
esac
|
|
case "$p" in
|
|
*nb[0-9]*) p=`echo "$p" | ${sed_cmd} -e 's|\(.*\)nb\([0-9]*\)|\1-\2|'` ;;
|
|
esac
|
|
echo "Conflicts: $p" >> $specfile ;;
|
|
esac
|
|
done
|
|
|
|
echo "Buildroot: $builddir" >> $specfile
|
|
echo "Group: $pkgpath" >> $specfile
|
|
srcs="`${pkg_info_cmd} -Q _DISTFILES $name`"
|
|
case "$srcs" in
|
|
"") srcs="`cd $PKGSRC/$pkgpath && ${bmake_cmd} show-var VARNAME=_DISTFILES`" ;;
|
|
esac
|
|
i=0
|
|
for f in "" $srcs; do
|
|
case "$f" in
|
|
"") continue ;;
|
|
*) echo "Source$i: $f" >> $specfile
|
|
${cp_cmd} $DISTDIR/$f $objdir/rpm/SOURCES
|
|
i=`expr $i + 1`
|
|
;;
|
|
esac
|
|
done
|
|
if [ -d $PKGSRC/$pkgpath ]; then
|
|
(cd $PKGSRC/$pkgpath && tar -cf $objdir/rpm/SOURCES/$pkgname-pkgsrc.tar .)
|
|
echo "Source$i: $pkgname-pkgsrc.tar" >> $specfile
|
|
fi
|
|
echo "" >> $specfile
|
|
|
|
i=0
|
|
if [ -d $PKGSRC/$pkgpath/patches ]; then
|
|
(cd $PKGSRC/$pkgpath/patches && for f in "" patch-*; do
|
|
case "$f" in
|
|
"") continue ;;
|
|
*) echo "Patch$i: $pkgname-$f" >> $specfile
|
|
${cp_cmd} $f $objdir/rpm/SOURCES/$pkgname-$f
|
|
i=`expr $i + 1`
|
|
;;
|
|
esac
|
|
done)
|
|
echo "" >> $specfile
|
|
echo "" >> $specfile
|
|
fi
|
|
|
|
echo "%description" >> $specfile
|
|
${pkg_info_cmd} -qd $name | ${awk_cmd} 'NF == 0 { next } { gsub("%", "percent"); print }' >> $specfile
|
|
|
|
echo "" >> $specfile
|
|
echo "%prep" >> $specfile
|
|
echo "echo prep finished" >> $specfile
|
|
|
|
echo "" >> $specfile
|
|
echo "%setup -c" >> $specfile
|
|
echo "echo setup finished" >> $specfile
|
|
|
|
echo "" >> $specfile
|
|
echo "%build" >> $specfile
|
|
echo "echo build finished" >> $specfile
|
|
|
|
echo "" >> $specfile
|
|
echo "%install" >> $specfile
|
|
echo "(cd $builddir/$pkgprefix && ${gzip_cmd} -d -c $builddir/$name.tgz | ${extract_cmd} && ${mkdir_cmd} -p $builddir/${PKG_DBDIR}/$name && ${mv_cmd} ./+CONTENTS $builddir/${PKG_DBDIR}/$name)" >> $specfile
|
|
|
|
echo "" >> $specfile
|
|
echo "%clean" >> $specfile
|
|
echo "${rm_cmd} -rf $builddir $objdir/rpm/$name" >> $specfile
|
|
|
|
echo "" >> $specfile
|
|
echo "%files" >> $specfile
|
|
${pkg_info_cmd} -qL $name | ${sed_cmd} -e "s|${pkgprefix}|%{prefix}|g" >> $specfile
|
|
echo "${PKG_DBDIR}/$name/+CONTENTS" >> $specfile
|
|
|
|
# make the build root, tarup the NetBSD binary package, and insert it in the build root
|
|
${mkdir_cmd} -p $builddir/$pkgprefix
|
|
pkg_tarup -d $builddir $pkgbase
|
|
|
|
# create the binary rpm itself
|
|
(cd $builddir && rpm $verbose $genpat $sign $pkgbase.spec)
|
|
|
|
# tell people where we've put it/them
|
|
${ls_cmd} -al $rpmdir/${arch}/$pkgname-*
|
|
|
|
# cleanup
|
|
${rm_cmd} -rf $builddir $objdir/rpm/$pkgname
|
|
else
|
|
echo "genrpm: WARNING!!! Package \"$1\" not found" 2>&1
|
|
fi
|
|
|
|
shift
|
|
done
|
|
|
|
exit 0
|