diff options
author | Eric Hameleers <alien@slackware.com> | 2017-06-08 08:52:41 +0000 |
---|---|---|
committer | Eric Hameleers <alien@slackware.com> | 2017-06-08 08:52:41 +0000 |
commit | db817e568414ff90e27aac552009516f3803fde9 (patch) | |
tree | 8f52adbcc7b1c9763f3764e316f04698f3b0e359 /source/compat32-tools | |
parent | 69c4340cea15ec30cc9efc084e9664fac118c321 (diff) | |
download | multilib-db817e568414ff90e27aac552009516f3803fde9.tar.gz multilib-db817e568414ff90e27aac552009516f3803fde9.tar.xz |
compat32-tools: add clean-ups for doinst.sh scripts to convertpkg-compat32
Diffstat (limited to 'source/compat32-tools')
-rwxr-xr-x | source/compat32-tools/compat32-tools.SlackBuild | 2 | ||||
-rwxr-xr-x | source/compat32-tools/convertpkg-compat32 | 402 |
2 files changed, 403 insertions, 1 deletions
diff --git a/source/compat32-tools/compat32-tools.SlackBuild b/source/compat32-tools/compat32-tools.SlackBuild index 1d2a56e..7501bc3 100755 --- a/source/compat32-tools/compat32-tools.SlackBuild +++ b/source/compat32-tools/compat32-tools.SlackBuild @@ -26,7 +26,7 @@ PRGNAM=compat32-tools VERSION=3.7 ARCH=noarch TAG=${TAG:-alien} -BUILD=${BUILD:-10} +BUILD=${BUILD:-11} CWD=$(pwd) TMP=${TMP:-/tmp} diff --git a/source/compat32-tools/convertpkg-compat32 b/source/compat32-tools/convertpkg-compat32 new file mode 100755 index 0000000..9960527 --- /dev/null +++ b/source/compat32-tools/convertpkg-compat32 @@ -0,0 +1,402 @@ +#!/bin/sh + +# $Id$ + +# Copyright (c) 2009 Frederick Emmott <fred@slackware.com> +# Copyright (c) 2009, 2010, 2011, 2012, 2013 Eric Hameleers, Eindhoven, NL +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED ``AS IS'' AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# Contributions to the udev cleanup code by phenixia2003. + +# --------------------------------------------------------------------------- + +# Convert a 32-bit Slackware package (s390 or x86) +# to a compatibility package for a 64bit multilib Slackware. + +# Catch errors and display the offending line number: +set -e +trap 'echo "$0 FAILED at line ${LINENO}"' ERR + +# Package-independent variables +ARCH=${ARCH:-$(uname -m)} +TAG=${TAG:-compat32} # tag to be used for the converted package +OUTPUT=${OUTPUT:-/tmp} # where the package gets created +TMP=${TMP:-/tmp} # location for temporary files + +# $BUILD can also be overridden, though it in-turn is overridden +# if an output package name is specified on the command line. + +# Blacklist of packages not to use this script on (these *have* to be compiled +# on a 64bit box): +BLACKLIST=" +glibc.* +kernel.* +gcc.* +" + +function show_help () { + # Write the help text to output: + cat <<EOF + +Usage: $0 <-i input_package_file_name> [-o output_package_file_name] [-d output_directory] [-s custom_slack_desc] [-e custom_package_extension] + +$(basename $0) is used to convert a 32-bit Slackware package +into a '32-bit compatibility' package, for installion on 64-bit Slackware. + +required parameters:: + -i input_package_file_name : 32-bit package to convert +optional parameters:: + -d destination_directory : create package in this directory + -e extension : use another valid extension instead of 'txz' + -o output_package_file_name : use custom output package filename + -s output_slack_desc : custom slack-desc file to use for new package + +environment variables: + ARCH (target architecture; defaults to \$(uname -m)) + BUILD (build number for output package; defaults to same as input package. + output_package_file_name overrides this value) + TAG (build tag, defaults to ${TAG})) + OUTPUT (location to create the package; defaults to ${OUTPUT}) + TMP (location for temporary files; defaults to ${TMP}) + +EOF +} + +# Zero some initial variables: +OUTPKG="" +PKGEXT="txz" +PKGFILE="" +PKGPATH="" +SLACKDESC="" + +# Parse the commandline parameters: +while [ ! -z "$1" ]; do + case $1 in + -d|--destdir) + OUTPUT="$(cd ${2}; pwd)" # can be overruled in the "-o" argument! + shift 2 + ;; + -e|--extension) + PKGEXT="${2}" + shift 2 + ;; + -h|--help) + show_help + exit 0 + ;; + -i|--inpkg) + PKGFILE="$(basename ${2})" + PKGPATH="$(cd $(dirname ${2}); pwd)/$(basename ${2})" + shift 2 + ;; + -o|--outpkg) + OUTPKG="$(basename ${2})" + # Check if the user added a directory component. If yes, it will override + # whatever was supplied with the "-d" argument!: + if [ "$OUTPKG" != "${2}" ]; then + OUTPUT="$(cd $(dirname ${2}); pwd)" + fi + shift 2 + ;; + -s|--slack-desc) + SLACKDESC="$(cd $(dirname ${2}); pwd)/$(basename ${2})" + shift 2 + ;; + -*) + echo "Unsupported parameter '$1'!" + exit 1 + ;; + *) + # Do nothing + shift + ;; + esac +done + +# Bail out now if we did not get an input package: +if [ -z "$PKGFILE" -o ! -e "$PKGPATH" ]; then + echo "** Please supply a valid input package! **" + show_help + exit 3 +fi + +# if a destination_directory was specified, abort now if we can not create it: +if [ -n "$OUTPUT" -a ! -d "$OUTPUT" ]; then + echo "Creating output directory '$OUTPUT'..." + mkdir -p $OUTPUT + if [ ! -w "$OUTPUT" ]; then + echo "Creating output directory '$OUTPUT' failed!" + exit 3 + fi +fi + +# Figure out initial variables +PKGNAM=$(echo $PKGFILE | rev | cut -f4- -d- | rev) +VERSION=$(echo $PKGFILE | rev | cut -f3 -d- | rev) +BUILD=${BUILD:-$(echo $PKGFILE | rev | cut -f1 -d- | cut -f2- -d. | rev)} +OUTPKG=${OUTPKG:-"${PKGNAM}-compat32-${VERSION}-${ARCH}-${BUILD}${TAG}.${PKGEXT}"} +# With OUTPKG as commandline param, it may not just be "${PKGNAM}-compat32": +PKGNAM32=$(echo $OUTPKG | rev | cut -f4- -d- | rev) + +for regex in $BLACKLIST; do + if echo $PKGNAM | grep -Pq "$regex"; then + echo "Package $PKGNAM is blacklisted by '$regex', aborting." + exit 2 + fi +done + +echo "Converting package $PKGNAM (version $VERSION) to $OUTPKG ($PKGNAM32)" + +PKG=$TMP/package-$PKGNAM32 +rm -rf $PKG +mkdir -p $PKG $TMP +cd $PKG || exit 1 + +# Explode the package into $PKG . +# We will need to slightly modify an existing install/doinst.sh +# It should still create symlinks and run other errands when the resulting +# package is installed, but should not mess with the files we are going to +# remove for the -compat32 package. +/sbin/explodepkg $PKGPATH + +# Check if the user fed us a 64bit package: +if [ -d usr/lib64 -o -d lib64 ]; then + echo "** This script converts 32bit packages for Slackware64 multilib!" + echo "** It looks like you gave me a 64bit package instead." + echo "** Are you certain you want to convert the package $(basename $PKGPATH) ?" + echo "** Press [Ctrl]-[C] now if you want to abort the script." + read JUNK +fi + +# +# Take special care of gtk+2, gdk-pixbuf2, pango and udev when stripping things! +# + +# Remove stuff we only want from the 64-bit package: +if [ "$PKGNAM" = "gtk+2" -o "$PKGNAM" = "gtk+3" -o "$PKGNAM" = "gdk-pixbuf2" -o "$PKGNAM" = "pango" ]; +then + rm -rf bin sbin usr/{include,sbin,share,info,man,libexec} +else + rm -rf etc bin sbin usr/{include,sbin,share,info,man,libexec} +fi + +# Take care of 32bit binaries: +if [ "$PKGNAM" = "gtk+2" -o "$PKGNAM" = "gtk+3" -o "$PKGNAM" = "gdk-pixbuf2" -o "$PKGNAM" = "pango" ]; +then + find usr/bin -type f ! -name "*-32" -exec mv {} {}-32 \; +elif [ "$PKGNAM" = "llvm" ]; then + mkdir -p usr/bin/32 + for BIN in usr/bin/* ; do + ln -s ../$(basename $BIN)-32 usr/bin/32/$(basename $BIN) + done + find usr/bin -maxdepth 1 -type f ! -name "*-32" -exec mv {} {}-32 \; +elif [ -d usr/bin ]; then + mkdir ./32 + find usr/bin -type f -exec mv {} ./32 \; + rm -rf usr/bin/* + mv ./32 usr/bin/ +fi + +if [ "$PKGNAM" = "udev" -o "$PKGNAM" = "eudev" ]; then + # These are part of the 64-bit package: + rm -rf lib/firmware + rm -rf lib/modprobe.d + rm -rf lib/udev + rm -rf run + # Only in Slackware 13.37: + rm -rf usr/lib/ConsoleKit +fi + +# Strip doinst.sh from everything we can't use: +if [ "$PKGNAM" = "gtk+2" -o "$PKGNAM" = "gtk+3" -o "$PKGNAM" = "gdk-pixbuf2" -o "$PKGNAM" = "pango" ]; +then + # Get rid of symlinks in bin and doc directory: + cat install/doinst.sh | grep -v '( cd usr/bin' | grep -v '( cd usr/doc' \ + > install/doinst.sh.2 + cat install/doinst.sh.2 > install/doinst.sh + rm -f install/doinst.sh.2 + if [ "$PKGNAM" = "gtk+2" ]; then + # Deal with the .new file in gtk+2 that does not get processed: + echo "config etc/gtk-2.0/im-multipress.conf.new" \ + >> install/doinst.sh + fi +elif [ "$PKGNAM" = "udev" -o "$PKGNAM" = "eudev" ]; then + # Get rid of symlinks in sbin and lib directory, and all the other + # non-symlinking stuff: + cat install/doinst.sh \ + | grep '( cd ' \ + | grep -v '( cd sbin' | grep -v '( cd lib/udev' \ + | grep -v '( cd usr/lib/ConsoleKit/run-seat.d' \ + > install/doinst.sh.2 + cat install/doinst.sh.2 > install/doinst.sh + rm -f install/doinst.sh.2 +elif [ -f install/doinst.sh ]; then + # Check for a 'config()' section: + if grep -q 'config()' install/doinst.sh ; then + cat <<-"EOT" > install/doinst.sh.1 + config() { + NEW="$1" + OLD="$(dirname $NEW)/$(basename $NEW .new)" + # If there's no config file by that name, mv it over: + if [ ! -r $OLD ]; then + mv $NEW $OLD + elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then + # toss the redundant copy + rm $NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... + } + preserve_perms() { + NEW="$1" + OLD="$(dirname ${NEW})/$(basename ${NEW} .new)" + if [ -e ${OLD} ]; then + cp -a ${OLD} ${NEW}.incoming + cat ${NEW} > ${NEW}.incoming + mv ${NEW}.incoming ${NEW} + fi + config ${NEW} + } + EOT + else + echo -n "" > install/doinst.sh.1 + fi + # Only keep lines that deal with symlinks in bin/32 and lib directories, + # and the config/preserve_perms commands that apply outside of /etc/: + ( cat install/doinst.sh \ + |grep -v "etc/ld.so.conf" |grep -v "../sbin/" \ + |grep -Ev '(config etc|preserve_perms etc)' \ + |grep -E '(usr/bin |lib |lib/|^config |^preserve_perms )' > install/doinst.sh.2 + cat install/doinst.sh.1 install/doinst.sh.2 \ + |sed -e 's# usr/bin# usr/bin/32#g' \ + |sed -e 's#32 ; ln -sf ../#&../#' > install/doinst.sh + rm -f install/doinst.sh.1 install/doinst.sh.2 ) || true +fi + +# Post-cleanup-cleanup to catch sscript errors: +if [ "$PKGNAM" = "samba" ]; then + # Get rid of a useless (because taken care of in 64bit package) block: + cat install/doinst.sh \ + | grep -v 'samba/private' \ + > install/doinst.sh.2 + cat install/doinst.sh.2 > install/doinst.sh + rm -f install/doinst.sh.2 +fi + +# The cxxlibs need some extra consideration because the libraries in +# /usr/i486-slackware-linux/lib will not be found by Slackware64. +# Note that as of Slackware 14, "usr/i486-slackware-linux" is gone: +if [ "$PKGNAM" = "cxxlibs" ]; then + if [ -e usr/i486-slackware-linux ] ; then + mkdir -p usr/lib # just in case + for OLIB in $(find usr/i486-slackware-linux/lib -type f -maxdepth 1) ; do + cp -a $OLIB usr/lib/ + done + cat install/doinst.sh | grep '/i486-slackware-linux' > install/doinst.sh.2 + cat install/doinst.sh.2 | sed -e 's#/i486-slackware-linux##g' >> install/doinst.sh + rm -f install/doinst.sh.2 + fi +fi + +# The qt package installs several symlinks to /usr/bin which point to +# binaries in qt's lib directory. We have to strip those from the -compat32 +# package. If you want to build 32bit software that needs these qt binaries, +# you will have to add /usr/lib/qt/bin/ to your $PATH +# We will remove a lot of stuff which we do not need in the compat32 package +# +if [ "$PKGNAM" = "qt" -o "$PKGNAM" = "qt3" -o "$PKGNAM" = "qt5" ]; then + + if [ -d usr/lib/qt ] ; then + for ITEM in q3porting.xml demos doc examples ; do + if [ -e "usr/lib/qt/$ITEM" ] ; then + rm -rf "usr/lib/qt/$ITEM" + fi + done + elif [ -d usr/lib/qt5 ] ; then + for ITEM in demos doc examples ; do + if [ -e "usr/lib/qt5/$ITEM" ] ; then + rm -rf "usr/lib/qt5/$ITEM" + fi + done + fi + + cat install/doinst.sh | grep -v 'usr/bin' | grep -v 'opt/kde3/bin' \ + > install/doinst.sh.2 + cat install/doinst.sh.2 > install/doinst.sh + rm -f install/doinst.sh.2 + +fi + +# Keep documentation we might be required to keep, or is just polite: +if [ -d usr/doc ]; then + find usr/doc -type f ! -iname "Copyright*" -a ! -iname "COPYING*" -a ! -iname "AUTHORS*" -a ! -iname "LICENSE*" -a ! -iname "GPL*" -a ! -iname "LGPL*" -a ! -iname "THANKS*" | xargs -d '\n' rm -f + find usr/doc -type d -depth | xargs -d '\n' rmdir --ignore-fail-on-non-empty +fi + +if [ ! -z $SLACKDESC ]; then + echo "Using externally provided slack-desc ($SLACKDESC)..." + cat $SLACKDESC > install/slack-desc +else + if [ ! -f install/slack-desc ]; then + # Non-standard package, missing slack-desc, so we use a template: + mkdir -p install + cat <<EOT > install/slack-desc +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +$PKGNAM: $PKGNAM +$PKGNAM: +$PKGNAM: +$PKGNAM: +$PKGNAM: +$PKGNAM: +$PKGNAM: +$PKGNAM: +$PKGNAM: +$PKGNAM: +$PKGNAM: +EOT + fi + + # Now, re-work the slack-desc: + + # Fix the handy ruler: + SPCS=""; while [ ${#SPCS} -lt ${#PKGNAM32} ]; do SPCS=" $SPCS";done + sed -i -r "s/^ *\|-/${SPCS}\|-/" install/slack-desc + + # Every line; foo: -> foo-compat32: + sed -i "s,$PKGNAM:,$PKGNAM32:," install/slack-desc + + # First line: foo-compat32: foo (description of foo) + # -> foo-compat32: foo-compat32 (description of foo) + sed -i "s,$PKGNAM32: $PKGNAM ,$PKGNAM32: $PKGNAM32 ," install/slack-desc + + # Last line: if empty, add 32-bit message + sed -i "\$s,^${PKGNAM32}: *$,${PKGNAM32}: This package contains 32-bit compatibility binaries.," install/slack-desc +fi + +# If we ended up with an empty doinst.sh we should remove it now: +if [ ! -s install/doinst.sh ]; then + rm -f install/doinst.sh +fi + +# Make the package (don't process the symlinks): +/sbin/makepkg --linkadd n --chown n $OUTPUT/$OUTPKG + +echo "Package created: $OUTPUT/$OUTPKG" + |