aboutsummaryrefslogblamecommitdiff
path: root/scripts/pkg
blob: 4d564ee7c692c6853b1748d8543223d3ceb0d08b (plain) (tree)
1
2
3
4
5
6
7
8
9

           
                                                                              





                                                                              



                                                                         



































































                                                                                                                           
                                                                   
















                                                        
                                                                    














































































































                                                                                                                          
                                      






































































                                                                                                                         
                                                                                                                        






                                                                                        
                                                                                                    


                            
                                      










                                                                                                                                                                                
          















                                                                                

                                                                                                 
                                                           
                                                                




                                                                          
                                                             




































                                                                      
                                                             
                            
                                                             
                               






                                                                                                  




                                                         

                                                       






























                                                        
                                                                                 























                                                                           


                                

                 




































                                                                                                                                                        
                    


                                                                   






























































                                                                           
 
#!/bin/bash
#
# /usr/sbin/pkg - Formilux source package manager - version 0.2.2 - 2003-02-14
#
# Copyright (C) 2001-2003 Benoit Dolez & Willy Tarreau
#       mailto: benoit@ant-computing.com,willy@ant-computing.com
#
# This program is licenced under GPLv2 ( http://www.gnu.org/licenses/gpl.txt )

########## WARNING ##########
# this version is not compatible anymore with versions earlier than 0.2.0
#############################

# patch -p1 by default
PATCH_LEVEL=1

function logit {
  echo "$*"
  $*
  return $?
}

function do_compile_only {
  $FLXMAKE
  return $?
}

function pre_prepack {
  if [ "$UID" != "0" -a "$force" != "1" ]; then
    echo "You must specify '--force' to install as non-root"
    exit 1
  fi
  if [ -d `pwd`/.flxdisk ] ; then rm -rf `pwd`/.flxdisk ; fi
}

function post_prepack {
  if [ -d $ROOTDIR/opt ] ; then
    (cd $ROOTDIR/opt ; mkdir bin sbin lib )
    (cd $ROOTDIR/opt ; find */bin  -type f -perm +111 -exec ln -s ../{} bin  \; -printf "ln -s ../%p $ROOTDIR/opt/bin\n" )
    (cd $ROOTDIR/opt ; find */sbin -type f -perm +111 -exec ln -s ../{} sbin \; -printf "ln -s ../%p $ROOTDIR/opt/sbin\n" )
    (cd $ROOTDIR/opt ; find */lib  -type f -perm +111 -exec ln -s ../{} lib  \; -printf "ln -s ../%p $ROOTDIR/opt/lib\n" )
  fi
}

function do_compile {
  do_config_only && do_compile_only
}

function do_build {
  for i in clean compile prepack strip pack ; do
    if declare -f pre_$i > /dev/null ; then ( pre_$i ) ; fi
    if [ $? != 0 ] ; then break ; fi
    if declare -f do_$i > /dev/null ; then ( do_$i ) ; fi
    if [ $? != 0 ] ; then break ; fi
    if declare -f post_$i > /dev/null ; then ( post_$i ) ; fi
    if [ $? != 0 ] ; then break ; fi
  done
}

function do_delpack {
  if [ -d `pwd`/.flxdisk ] ; then rm -rf `pwd`/.flxdisk ; fi
}

function do_clean {
  make distclean || make mrproper || make clean
  ( do_delpack )
}

function do_edit {
  echo "Editing $CFGFILE..."
  vi $CFGFILE
}

function do_cat {
  cat $CFGFILE
}

function do_patch {
	find . -name '*.rej' -o -name '*~' | xargs rm -f

	for i in $PATCH_LIST; do
		patch -Np$PATCH_LEVEL < $CFGROOT/$CFGDIR/patches/$i
	done

	if [ -z "`find . -name '*.rej'`" ]; then
		find . -name '*~' | xargs rm -f
	fi
}

function do_unpatch {
	UNPATCH_LIST=""

	find . -name '*.rej' -o -name '*~' | xargs rm -f

	for i in $PATCH_LIST; do
		UNPATCH_LIST="$i $UNPATCH_LIST"
	done

	for i in $UNPATCH_LIST; do
		patch -RNp$PATCH_LEVEL < $CFGROOT/$CFGDIR/patches/$i
	done

	if [ -z "`find . -name '*.rej'`" ]; then
		find . -name '*~' | xargs rm -f
	fi
}

function get_perl_depend {
  filename=$1
        DEP=`grep "^\(.*['{\"]\)*[ 	]*\(require\|use\) \+['\"]*[a-zA-Z][a-z:/A-Z0-9-_]*[; '\"]" $filename | \
                sed -e 's/.*\(require\|use\) \+["'\'']\?\([^'\''" };]\+\)["'\'']\?/§§\2§§/g' \
                    -e 's/§§\([^§]\+\)§§[^§]*/ \1/g' | \
                sed 's@::@/@g'`
        if [ "x$DEP" != "x" ] ; then
          echo -n "$filename" >> $F
          for dep in $DEP ; do
            if [ "x${dep/*.*}" != "x" ] ; then
              echo -n " $dep.pm" >> $F
            else
              echo -n " $dep" >> $F
            fi
          done
          echo >> $F
        fi
}
 
function do_pack {  
    # use the file list when available
    if [ "$FILE_LIST" ]; then
	    do_pack_files
	    return $?
    fi

  if [ ! -d $ROOTDIR ] ; then export ROOTDIR=`pwd` ; fi
  cd $ROOTDIR

##  ( find lib -type l -name "lib*.so*" | xargs rm -f ; \
##  find usr/lib -type l -name "lib*.so*" | xargs rm -f ; \
##  ldconfig -nr . ) > /dev/null 2>&1
  ldconfig -nr . lib usr/lib > /dev/null 2>&1
  find . ! -type l | xargs touch -m

  F=$PKGROOT/$packver.dep

  rm -rf $F
  if [ -e $F.diff ] ; then cat $F.diff $F ; fi

  echo -n "Creating $F ... "
  touch $F
  find . -type f -o -type l | while read ; do
    case $REPLY in
      *.pm|*.pl|*.ph)
        get_perl_depend $REPLY
       ;;
      */man/man*/*.[0-9n])
        if [ "${REPLY/*gz}" ] ; then
          if [ -L $REPLY ] ; then
            LINK=`readlink $REPLY`
            rm $REPLY
            ln -s $LINK.gz $REPLY.gz
          else
            gzip -f -9 $REPLY
            chmod 644 $REPLY.gz
          fi
        fi
        echo "$REPLY \$MAN" >> $F
        ;;
      */info/*.info|*/info/*.info-[0-9]*)
        if [ "${REPLY/*gz}" ] ; then
          gzip -f -9 $REPLY
          chmod 644 $REPLY.gz
        fi
        echo "$REPLY \$INFO" >> $F
        ;;
      */sbin/*|*/bin/*|*/lib/*|*/libexec/*)
        flr="`file $REPLY`"
        case "$flr" in
          *\ shell\ *)
            echo "$REPLY `head -1 $REPLY| sed -e 's/^#\! *\([^ ]\+\).*/\1/'` \$SHELL">>$F
            ;;
          *perl\ commands*)
            echo "$REPLY `head -1 $REPLY| sed -e 's/^#\! *\([^ ]\+\).*/\1/'` ">>$F
            get_perl_depend $REPLY
            ;;
          *:\ symbolic\ link*)
            echo "$REPLY `echo $flr | cut -f5 -d' '`" >> $F
            ;;
          *\ ELF\ 32-bit\ LSB*dynamically\ linked*)
            echo "$REPLY `ldd $REPLY 2>/dev/null | grep -v 'statically linked' | awk '{print $1}' | tr '\012' ' '`" >> $F
            ;;
          *\ ELF\ 32-bit\ LSB*shared\ object*)
            echo "$REPLY `ldd $REPLY 2>/dev/null | grep -v 'statically linked' | awk '{print $1}' | tr '\012' ' '`" >> $F
            ;;
        esac
        ;;
    esac
  done
  echo "done."

  echo -n "Creating $PKGROOT/$packver.lst ... "
  (find . ! -type d -o -empty | cut -c3-| xargs flx sign --ignore-dot --no-depth > $PKGROOT/$packver.lst) > /dev/null 2>&1
  echo "done."

  F=$PKGROOT/$packver.$PKGSUFF
  echo -n "Creating $F ... "
  # we want everything, and directories only if they're empty. All this without './'
  # we shouldn't get an empty line since . should contain at least what we want to tar !
  find . ! -type d -o -empty | cut -c3- | tar -T - -cf - | gzip -9 >$F 2>/dev/null
  echo "done."

  if [ -n "$CFGFILE" ]; then
     F=$CFGROOT/$CFGDIR/$pack.$CFGSUFF
     echo -n "Creating $F ... "
     if [ "$F" != "$CFGFILE" ]; then cp -f "$CFGFILE" "$F"; echo "done." ; else echo "up to date."; fi
  fi
  
}

function do_unpack {  
  mkdir -p $ROOTDIR
  cd $ROOTDIR

  F=$PKGROOT/$packver.$PKGSUFF
  echo -n "Extracting $F into $ROOTDIR ... "
  tar zUxpf $F >/dev/null 2>&1
  echo "done."
}

# same as pack, except that it uses files in the current directory as the root
# entries, and that no strip, link nor compression is performed.
# Only entries listed in the file pointed to by variable FILE_LIST find their
# way to the archive.
function do_pack_files {  
##  ( find lib -type l -name "lib*.so*" | xargs rm -f ; \
##  find usr/lib -type l -name "lib*.so*" | xargs rm -f ; \
##  ldconfig -nr . ) > /dev/null 2>&1
  find . ! -type l | xargs touch -m

  F=$PKGROOT/$packver.dep

  # absurde ? : rm puis cat !
  rm -rf $F
  if [ -e $F.diff ] ; then cat $F.diff $F ; fi

  echo -n "Creating $F ... "
  touch $F
  find . -type f -o -type l | while read ; do
    case $REPLY in
      *.pm|*.pl|*.ph)
        get_perl_depend $REPLY
       ;;
      */man/man*/*.[0-9n])
        echo "$REPLY \$MAN" >> $F
        ;;
      */info/*.info|*/info/*.info-[0-9]*)
        echo "$REPLY \$INFO" >> $F
        ;;
      */sbin/*|*/bin/*|*/lib/*|*/libexec/*)
        flr="`file $REPLY`"
        case "$flr" in
          *\ shell\ *)
            echo "$REPLY `head -1 $REPLY| sed -e 's/^#\! *\([^ ]\+\).*/\1/'` \$SHELL">>$F
            ;;
          *perl\ commands*)
            echo "$REPLY `head -1 $REPLY| sed -e 's/^#\! *\([^ ]\+\).*/\1/'` ">>$F
            get_perl_depend $REPLY
            ;;
          *:\ symbolic\ link*)
            echo "$REPLY `echo $flr | cut -f5 -d' '`" >> $F
            ;;
          *\ ELF\ 32-bit\ LSB*dynamically\ linked*)
            echo "$REPLY `ldd $REPLY 2>/dev/null | grep -v 'statically linked' | awk '{print $1}' | tr '\012' ' '`" >> $F
            ;;
          *\ ELF\ 32-bit\ LSB*shared\ object*)
            echo "$REPLY `ldd $REPLY 2>/dev/null | grep -v 'statically linked' | awk '{print $1}' | tr '\012' ' '`" >> $F
            ;;
        esac
        ;;
    esac
  done
  echo "done."

  echo -n "Creating $PKGROOT/$packver.lst ... "
  (flx sign --no-depth --ignore-dot `cut -f1 -d' ' $FILE_LIST|sed -e 's,/$,,'` > $PKGROOT/$packver.lst) > /dev/null 2>&1
  echo "done."

  F=$PKGROOT/$packver.$PKGSUFF
  echo -n "Creating $F ... "

  # we want everything, and directories only if they're empty. All this without './'
  # we shouldn't get an empty line since . should contain at least what we want to tar !
  cut -f1 -d' ' $FILE_LIST|sed -e 's,/$,,' | tar -T - --no-recursion -cf - | gzip -9 >$F 2>/dev/null
  echo "done."

  if [ -n "$CFGFILE" ]; then
     F=$CFGROOT/$CFGDIR/$pack.$CFGSUFF
     echo -n "Creating $F ... "
     if [ "$F" != "$CFGFILE" ]; then cp -f "$CFGFILE" "$F"; echo "done." ; else echo "up to date."; fi
  fi
  
}

function do_strip {
  if [ ! -d $ROOTDIR ] ; then export ROOTDIR=`pwd` ; fi
  #find $ROOTDIR/. -type f | xargs file | grep ":.*executable.*not stripped" | cut -f1 -d: | xargs strip -x --strip-unneeded -R .note -R .comment > /dev/null 2>&1 
  # allow executable and shared (.so), but not relocatable (.o), both stripped or not stripped
  find $ROOTDIR/. -type f | xargs file | grep ":.*ELF.*\(executable\|\shared\).*stripped" | cut -f1 -d: | xargs strip -x --strip-unneeded -R .note -R .comment > /dev/null 2>&1 
  return 0
} 

function pre_pack {
  ( do_strip )
}

function usage {
  echo "Usage: pkg <action>"
  echo " action is one of :"
  echo "   help    : display this help."
  echo "   info    : get information on current package."
  echo "   newpkg  : build a more recent .pkg script from an old one."
  echo "   cat     : display last .pkg file."
  echo "   edit    : edit last .pkg file."
  echo "   patch   : apply a list of patches to the directory prior to compile."
  echo "   unpatch : revert a list of patches to the directory."
  echo "   compile : do_compile=do_config_only+do_compile_only in .pkg script ($CFGROOT/$CFGDIR)"
  echo "   prepack : execute do_prepack in .pkg script ($CFGROOT/$CFGDIR)"
  echo "   strip   : strip binaries in temporary directory"
  echo "   pack    : strip binaries, then package into $PKGROOT"
  echo "   delpack : remove temporary directory"
  echo "   clean   : execute 'make clean' and remove temporary directory."
  echo "   build   : execute clean compile prepack pack."
  echo "   unpack  : extract package into temporary directory"
  echo "Variables are :"
  echo "CFGROOT : directory for .pkg and patches, <$CFGROOT>"
  echo "CFGFILE : force to use of a .pkg, <$CFGFILE>"
  echo "PKGROOT : directory for .lst, .tgz and .dep, <$PKGROOT>"
  echo "ROOTDIR : base directory for package (not source), <$ROOTDIR>"
  echo "FLXARCH : architecture for package name, <$FLXARCH>"
  echo "KERNDIR : base directory for package (not source), <$KERNDIR>"
  echo "DISTVER : build version (flx.1)"
  exit 1
}

function do_help {
	usage
}

function pre_info {
  echo "Information for package $pack: "

  echo "   Package version : $PKGVER (\$PKGVER)"
  echo "   Distrib version : $DISTVER (\$DISTVER)"
  echo -n "   Config. file : "
  if [ -e $CFGFILE ]; then
     echo "$CFGFILE"
  else
     echo "none found."
  fi
  echo "   Package file : $PKGROOT/$packver.$PKGSUFF"
  echo -n "   Package size : "
  if [ -e $PKGROOT/$packver.$PKGSUFF ]; then
     echo "`du -b $PKGROOT/$packver.$PKGSUFF|cut -f1` bytes."
  else
     echo "does not exist yet."
  fi
  if [ "$PATCH_LIST" ]; then
     echo "   Patches list : $PATCH_LIST"
  fi
}

function do_newpkg {
  echo "WARNING!!! the 'newpkg' feature is in beta stage !!!"
  if [ -n "$CFGFILE" ]; then
     F=$CFGROOT/$PKGRADIX-$PKGVER-$DISTVER-pkg/$pack.$CFGSUFF
     echo -n "Creating $F ... "
     if [ "$F" != "$CFGFILE" ]; then
        mkdir -p $CFGROOT/$PKGRADIX-$PKGVER-$DISTVER-pkg && cp -f "$CFGFILE" "$F" &&
          cp -af $CFGROOT/$CFGDIR/patches $CFGROOT/$PKGRADIX-$PKGVER-$DISTVER-pkg/ >/dev/null 2>&1
        echo "done."
     else
        echo "up to date."
     fi
  fi
}

# setting fixed vars
if [ -z "$KERNDIR" ] ; then KERNDIR="/usr/src/linux" ; fi
if [ -z "$CFGROOT" ] ; then CFGROOT="/var/flx-src" ; fi
if [ -z "$PKGROOT" ] ; then PKGROOT="/var/flx-pkg" ; fi
#if [ -z "$DISTVER" ] ; then DISTVER="flx.1" ; fi
if [ "$FLXARCH" = "" ]; then FLXARCH=`uname -m` ; fi

PKGSUFF="tgz"
CFGSUFF="pkg"
exe=`basename $0`

# check for action type
echo $exe | grep -q "^pkg" 
if [ $? = 0 -a "$exe" != "pkg" ] ; then
  type=`echo $exe | cut -c4-`
else
  type=$1
fi

# look for parameters
if [ "$type" = "$1" -a "${type##-*}" ] ; then shift ; fi
case $1 in 
  --force ) force=1; shift ;;
  --help ) usage ;;
  --source) type=source_only ;;
  -* ) shift ;;
esac

if [ "$type" = "" ] ; then
  usage ; 
fi

# execute action
if [ "$type" = "find" ] ; then
  for i in * ; do 
    pkgf=`grep "/$i\$" $CFGROOT/$CFGDIR/*.$CFGSUFF | cut -f1 -d: | tr '\012' ' '`
    echo "$i: $pkgf"
  done
elif [ "$type" != "source_only" ] ; then
 ARGV=$* 

 # look for package name from directory name
 pack=`pwd`
 pack=`basename $pack | sed -e 's/[-_][0-9].*$//'`

 # for package
  if [ -n "$pack" ] ; then 
   
    packver=`pwd` 
    packver=`basename $packver`

    if [ -z "$DISTVER" ]; then
        if echo $packver | grep -q -- "-flx\." ; then
	   DISTVER=`echo $packver|sed 's/\(.*-\)\(flx.[0-9]\+\)\(.*\)/\2/'`
	fi
    fi

    # source configuration
    if [ -z "$ROOTDIR" ] ; then ROOTDIR=`pwd`/.flxdisk ; fi
    if [ -n "$CFGFILE" ]; then
       CFGDIR=`dirname $CFGFILE`
       CFGROOT=`dirname $CFGDIR`
       CFGDIR=`basename $CFGDIR`
       . $CFGFILE
    else
       #CFGFILE=`find $CFGROOT/ -name "$pack[-_]*-${DISTVER:-*}-$FLXARCH.$CFGSUFF"|sed -e "s/\.$CFGSUFF\$//"|sort|tail -1`
       #CFGFILE=${CFGFILE:-`find $CFGROOT/ -name "$pack[-_]*-${DISTVER:-*}-*.$CFGSUFF"|sed -e "s/\.$CFGSUFF\$//"|sort|tail -1`}
       #CFGFILE=${CFGFILE:-`find $CFGROOT/ -name "$pack[-_]*.$CFGSUFF"|sed -e "s/\.$CFGSUFF\$//"|sort|tail -1`}
       #CFGFILE=${CFGFILE:-`find $CFGROOT/ -name "$pack.$CFGSUFF"|sed -e "s/\.$CFGSUFF\$//"|sort|tail -1`}
       CFGFILE=`find $CFGROOT/ -maxdepth 1 -type d -name "$pack[-_]*-${DISTVER:-*}-pkg"|sed -e "s/-pkg\$//"|sort|tail -1`
       CFGFILE=${CFGFILE:-`find $CFGROOT/ -maxdepth 1 -type d -name "$pack[-_]*-pkg"|sed -e "s/-pkg\$//"|sort|tail -1`}
       CFGFILE=${CFGFILE:-`find $CFGROOT/ -maxdepth 1 -type f -name "$pack[-_]*-${DISTVER:-*}-pkg.$PKGSUFF"|sed -e "s/-pkg\.$PKGSUFF\$//"|sort|tail -1`}
       CFGFILE=${CFGFILE:-`find $CFGROOT/ -maxdepth 1 -type f -name "$pack[-_]*-pkg.$PKGSUFF"|sed -e "s/-pkg\.$PKGSUFF\$//"|sort|tail -1`}

       # to be completed

       if [ -z "$CFGFILE" ]; then
          echo "CFGFILE not found. Cannot continue." >&2
          exit 1
       fi

       if [ -d $CFGFILE ]; then
          CFGROOT=`dirname $CFGFILE`
          CFGDIR=`basename $CFGFILE`-pkg
          CFGFILE=$CFGROOT/$CFGDIR/$pack.$CFGSUFF
       else
          CFGROOT=`dirname $CFGFILE`
          CFGDIR=`basename $CFGFILE`-pkg
          CFGFILE=$CFGROOT/$CFGDIR/$pack.$CFGSUFF
          if [ ! -e $CFGROOT/$CFGDIR ]; then
             echo "Opening package $CFGROOT/$CFGDIR.$PKGSUFF into $CFGROOT/$CFGDIR..."
             mkdir -p $CFGROOT/$CFGDIR && tar -C $CFGROOT/$CFGDIR -Uxpf $CFGROOT/$CFGDIR.$PKGSUFF
             if [ $? != 0 ]; then
                echo "There was an error during this operation. You may have to manually clean $CFGROOT/$CFGDIR. Cannot continue !"
                exit 1
             else
                echo "Done !"
             fi
          fi
       fi

       if [ -e "$CFGFILE" ]; then
          . $CFGFILE
       else
          echo "CFGFILE ($CFGFILE) not found. Cannot continue." >&2
          exit 1
       fi
    fi

    if [ -z "$DISTVER" ]; then
	if echo $CFGFILE | grep -q -- "-flx\." ; then
           DISTVER=`echo $CFGFILE|sed 's/\(.*-\)\(flx.[0-9]\+\)\(.*\)/\2/'`
        else
	   DISTVER='flx.1'
	fi
    fi

    echo $packver | grep -q -- "-flx\."
    if [ $? != 0 ] ; then
	packver=$packver-$DISTVER
    fi

    echo $packver | grep -q -- "-$FLXARCH\$" 
    if [ $? != 0 ] ; then packver=$packver-$FLXARCH ; fi

    prefix=${packver%%[._-][0-9]*} 
    suffix=${packver#$prefix[._-]} 
    PKGVER=${suffix%-flx*}
    PKGRADIX=$prefix
    #echo "packver=$packver suffix=$suffix PKGVER=$PKGVER"
    if [ -z "$DISTVER" ]; then
       DISTVER=${suffix#$PKGVER-}
       if [ "$DISTVER" = "$PKGVER" ]; then
	  DISTVER="flx.1"
       else
          DISTVER=${DISTVER%-*}
       fi
    fi

    case "$FLXARCH" in
        i686) arch=i686 cpu=i686 ;;
        i486) arch=i486 cpu=i486 ;;
        i386) arch=i386 cpu=i386 ;;
        *)    arch=i586 cpu=i686 ;;
    esac

    if [ -z "$FLXMAKE" ]; then
        FLXMAKE=make
    fi

    
    if [ -z "$PATCH_LIST" ]; then
	PATCH_LIST=${CFGFILE%%.$CFGSUFF}.diff
	if [ ! -e "$PATCH_LIST" ]; then
	    unset PATCH_LIST
	fi
    fi

    export DISTVER PKGRADIX PKGVER FLXMAKE PATCH_LIST FILE_LIST
 
    if declare -f pre_$type > /dev/null ; then ( pre_$type ) ; fi
    if [ $? != 0 ] ; then exit ; fi   
    if declare -f do_$type > /dev/null ; then ( do_$type ) ; fi
    if [ $? != 0 ] ; then exit ; fi
    if declare -f post_$type > /dev/null ; then ( post_$type ) ; fi

  fi
 # done
fi