CRUX-ARM : Home

Home :: Documentation :: Download :: Development :: Community :: Ports :: Packages :: Bugs :: Links :: About :: Donors
Updated to 5.35.1
[pkgutils-cross.git] / src / pkgmk.in
index 08413f6f3f960b7bef062cf381f2a78375919772..c69329f4e765416779cc759178a2e1a23634582d 100755 (executable)
@@ -3,10 +3,9 @@
 #  pkgutils
 # 
 #  Copyright (c) 2000-2005 Per Liden
-#  Copyright (c) 2006-2007 by CRUX team (http://crux.nu)
-#
+#  Copyright (c) 2006-2010 by CRUX team (http://crux.nu)
 #  Patches for crosscompilation by Jose V Beneyto <sepen@crux.nu>
-#  (CRUX-ARM System Team <crux-arm@mikeux.dyndns.org>)
+#  (CRUX-ARM System Team <devel@crux-arm.nu>)
 # 
 #  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
 #  USA.
 #
 
+##
+# error codes
+E_GENERAL=1
+E_PKGFILE=2    # invalid Pkgfile
+E_DIR_PERM=3   # (source/build) directory missing or missing read/write permission
+E_DOWNLOAD=4   # error during download
+E_UNPACK=5     # error during unpacking of source file(s)
+E_MD5=6        # md5sum verification failed
+E_FOOTPRINT=7  # footprint check failure
+E_BUILD=8      # error while running 'build()'
+E_INSTALL=9    # error while installing the package via 'pkgadd'
+
 info() {
        echo "=======> $1"
 }
@@ -52,29 +63,29 @@ get_basename() {
 check_pkgfile() {
        if [ ! "$name" ]; then
                error "Variable 'name' not specified in $PKGMK_PKGFILE."
-               exit 1
+               exit $E_PKGFILE
        elif [ ! "$version" ]; then
                error "Variable 'version' not specified in $PKGMK_PKGFILE."
-               exit 1
+               exit $E_PKGFILE
        elif [ ! "$release" ]; then
                error "Variable 'release' not specified in $PKGMK_PKGFILE."
-               exit 1
+               exit $E_PKGFILE
        elif [ "`type -t build`" != "function" ]; then
                error "Function 'build' not specified in $PKGMK_PKGFILE."
-               exit 1
+               exit $E_PKGFILE
        fi
 }
 
 check_directory() {
        if [ ! -d $1 ]; then
                error "Directory '$1' does not exist."
-               exit 1
+               exit $E_DIR_PERM
        elif [ ! -w $1 ]; then
                error "Directory '$1' not writable."
-               exit 1
+               exit $E_DIR_PERM
        elif [ ! -x $1 ] || [ ! -r $1 ]; then
                error "Directory '$1' not readable."
-               exit 1
+               exit $E_DIR_PERM
        fi
 }
 
@@ -90,7 +101,7 @@ download_file() {
 
        if [ ! "`type -p wget`" ]; then
                error "Command 'wget' not found."
-               exit 1
+               exit $E_GENERAL
        fi
 
        LOCAL_FILENAME=`get_filename $1`
@@ -132,7 +143,7 @@ download_file() {
        
        if [ $error != 0 ]; then
                error "Downloading '$1' failed."
-               exit 1
+               exit $E_DOWNLOAD
        fi
        
        mv -f "$LOCAL_FILENAME_PARTIAL" "$LOCAL_FILENAME"
@@ -146,13 +157,13 @@ download_source() {
                if [ ! -e $LOCAL_FILENAME ]; then
                        if [ "$LOCAL_FILENAME" = "$FILE" ]; then
                                error "Source file '$LOCAL_FILENAME' not found (can not be downloaded, URL not specified)."
-                               exit 1
+                               exit $E_DOWNLOAD
                        else
                                if [ "$PKGMK_DOWNLOAD" = "yes" ]; then
                                        download_file $FILE
                                else
                                        error "Source file '$LOCAL_FILENAME' not found (use option -d to download)."
-                                       exit 1
+                                       exit $E_DOWNLOAD
                                fi
                        fi
                fi
@@ -165,7 +176,7 @@ unpack_source() {
        for FILE in ${source[@]}; do
                LOCAL_FILENAME=`get_filename $FILE`
                case $LOCAL_FILENAME in
-                       *.tar.gz|*.tar.Z|*.tgz|*.tar.bz2|*.tar.xz|*.tar.lzma|*.zip)
+                       *.tar.gz|*.tar.Z|*.tgz|*.tar.bz2|*.tbz2|*.tar.xz|*.txz|*.tar.lzma|*.zip|*.rpm)
                                COMMAND="bsdtar -p -o -C $SRC -xf $LOCAL_FILENAME" ;;
                        *)
                                COMMAND="cp $LOCAL_FILENAME $SRC" ;;
@@ -180,7 +191,7 @@ unpack_source() {
                                rm -rf $PKGMK_WORK_DIR
                        fi
                        error "Building '$TARGET' failed."
-                       exit 1
+                       exit $E_UNPACK
                fi
        done
 }
@@ -227,11 +238,11 @@ check_md5sum() {
 
                        if [ "$PKGMK_CHECK_MD5SUM" = "yes" ]; then
                                error "Md5sum not ok."
-                               exit 1
+                               exit $E_MD5
                        fi
 
                        error "Building '$TARGET' failed."
-                       exit 1
+                       exit $E_MD5
                fi
        else
                if [ "$PKGMK_CHECK_MD5SUM" = "yes" ]; then
@@ -239,7 +250,7 @@ check_md5sum() {
                                rm -rf $PKGMK_WORK_DIR
                        fi
                        info "Md5sum not found."
-                       exit 1
+                       exit $E_MD5
                fi
                
                warning "Md5sum not found, creating new."
@@ -305,13 +316,6 @@ compress_manpages() {
        done
 }
 
-fix_cross_paths() {
-       # remove the last / from CLFS path if appeared
-       CLFS=${CLFS%*/}
-
-       find $PKG -type f -name '*.la' -exec sed -e "s|$CLFS||g" -e "s|$CROSTOOLS/$CTARGET|/usr|g" -e "s|$CROSSTOOLS||g" -i {} \;
-}
-
 check_footprint() {
        local FILE="$PKGMK_WORK_DIR/.tmp"
        
@@ -328,9 +332,14 @@ check_footprint() {
                                sed 's/^+/NEW       /g' | \
                                sed 's/^-/MISSING   /g' > $FILE.footprint.diff
                        if [ -s $FILE.footprint.diff ]; then
-                               error "Footprint mismatch found:"
+                               if [ "$PKGMK_IGNORE_NEW" = "yes" ] && \
+                                  [ -z "$(egrep -l ^MISSING $FILE.footprint.diff)" ] ; then
+                                       info "New files found:"
+                               else
+                                       error "Footprint mismatch found:"
+                                       BUILD_SUCCESSFUL="no"
+                               fi
                                cat $FILE.footprint.diff >&2
-                               BUILD_SUCCESSFUL="no"
                        fi
                else
                        warning "Footprint not found, creating new."
@@ -363,6 +372,7 @@ remove_work_dir() {
 
 build_package() {
        local BUILD_SUCCESSFUL="no"
+       local COMPRESSION
        
        check_file "$TARGET"
        make_work_dir
@@ -384,12 +394,17 @@ build_package() {
                fi
                
                compress_manpages
-               fix_cross_paths
                
                cd $PKG
                info "Build result:"
-               tar czvvf $TARGET *
-               
+
+               case $PKGMK_COMPRESSION_MODE in
+                       gz)  COMPRESSION="-z" ;;
+                       bz2) COMPRESSION="-j" ;;
+                       xz)  COMPRESSION="-J" ;;
+               esac
+               bsdtar -c $COMPRESSION -f $TARGET *  &&  bsdtar -t -v -f $TARGET
+
                if [ $? = 0 ]; then
                        BUILD_SUCCESSFUL="yes"
 
@@ -525,6 +540,7 @@ print_help() {
        echo "  -utd, --up-to-date          do not build, only check if package is up to date"
        echo "  -uf,  --update-footprint    update footprint using result from last build"
        echo "  -if,  --ignore-footprint    build package without checking footprint"
+       echo "  -in,  --ignore-new          build package, ignore new files in a footprint missmatch"
        echo "  -um,  --update-md5sum       update md5sum"
        echo "  -im,  --ignore-md5sum       build package without checking md5sum"
        echo "  -cm,  --check-md5sum        do not build, only check md5sum"
@@ -559,6 +575,8 @@ parse_options() {
                                PKGMK_UPDATE_FOOTPRINT="yes" ;;
                        -if|--ignore-footprint)
                                PKGMK_IGNORE_FOOTPRINT="yes" ;;
+                       -in|--ignore-new)
+                               PKGMK_IGNORE_NEW="yes" ;;
                        -um|--update-md5sum)
                                PKGMK_UPDATE_MD5SUM="yes" ;;
                        -im|--ignore-md5sum)
@@ -617,9 +635,17 @@ main() {
        check_directory "`dirname $PKGMK_WORK_DIR`"
        
        check_pkgfile
-       
-       TARGET="$PKGMK_PACKAGE_DIR/$name#$version-$release.pkg.tar.gz"
-       
+
+       case $PKGMK_COMPRESSION_MODE in
+               gz|bz2|xz)
+                       TARGET="$PKGMK_PACKAGE_DIR/$name#$version-$release.pkg.tar.$PKGMK_COMPRESSION_MODE"
+                       ;;
+               *)
+                       error "Compression mode '$PKGMK_COMPRESSION_MODE' not supported"
+                       exit 1
+                       ;;
+       esac
+
        if [ "$PKGMK_CLEAN" = "yes" ]; then
                clean
                exit 0
@@ -682,8 +708,6 @@ readonly PKGMK_VERSION="#VERSION#"
 readonly PKGMK_COMMAND="$0"
 readonly PKGMK_ROOT="$PWD"
 
-STRIP_CMD="strip"
-
 PKGMK_CONFFILE="/etc/pkgmk.conf"
 PKGMK_PKGFILE="Pkgfile"
 PKGMK_FOOTPRINT=".footprint"
@@ -695,6 +719,8 @@ PKGMK_SOURCE_DIR="$PWD"
 PKGMK_PACKAGE_DIR="$PWD"
 PKGMK_WORK_DIR="$PWD/work"
 
+PKGMK_COMPRESSION_MODE="gz"
+
 PKGMK_INSTALL="no"
 PKGMK_RECURSIVE="no"
 PKGMK_DOWNLOAD="no"
@@ -703,6 +729,7 @@ PKGMK_EXTRACT_ONLY="no"
 PKGMK_UP_TO_DATE="no"
 PKGMK_UPDATE_FOOTPRINT="no"
 PKGMK_IGNORE_FOOTPRINT="no"
+PKGMK_IGNORE_NEW="no"
 PKGMK_FORCE="no"
 PKGMK_KEEP_WORK="no"
 PKGMK_UPDATE_MD5SUM="no"