CRUX-ARM : Home

Home :: Documentation :: Download :: Development :: Community :: Ports :: Packages :: Bugs :: Links :: About :: Donors
bump version to 5.35.6
[pkgutils-cross.git] / pkgmk.in
index 9fdf768e3a10de5101ba4fec7dcf43ecf4123c43..997453deb50f39ae87bed92b53fe8bef3efe682d 100755 (executable)
--- a/pkgmk.in
+++ b/pkgmk.in
@@ -3,7 +3,7 @@
 #  pkgutils
 # 
 #  Copyright (c) 2000-2005 Per Liden
-#  Copyright (c) 2006-2007 by CRUX team (http://crux.nu)
+#  Copyright (c) 2006-2013 by CRUX team (http://crux.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"
 }
@@ -49,28 +61,35 @@ 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 $E_DIR_PERM
+       fi
+}
+
+check_file() {
+       if [ -e $1 ] && [ ! -w $1 ]; then
+               error "File '$1' is not writable."
                exit 1
        fi
 }
@@ -80,7 +99,7 @@ download_file() {
 
        if [ ! "`type -p wget`" ]; then
                error "Command 'wget' not found."
-               exit 1
+               exit $E_GENERAL
        fi
 
        LOCAL_FILENAME=`get_filename $1`
@@ -122,7 +141,7 @@ download_file() {
        
        if [ $error != 0 ]; then
                error "Downloading '$1' failed."
-               exit 1
+               exit $E_DOWNLOAD
        fi
        
        mv -f "$LOCAL_FILENAME_PARTIAL" "$LOCAL_FILENAME"
@@ -136,13 +155,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
@@ -155,12 +174,8 @@ unpack_source() {
        for FILE in ${source[@]}; do
                LOCAL_FILENAME=`get_filename $FILE`
                case $LOCAL_FILENAME in
-                       *.tar.gz|*.tar.Z|*.tgz)
-                               COMMAND="tar -C $SRC --use-compress-program=gzip -xf $LOCAL_FILENAME" ;;
-                       *.tar.bz2)
-                               COMMAND="tar -C $SRC --use-compress-program=bzip2 -xf $LOCAL_FILENAME" ;;
-                       *.zip)
-                               COMMAND="unzip -qq -o -d $SRC $LOCAL_FILENAME" ;;
+                       *.tar|*.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" ;;
                esac
@@ -174,7 +189,7 @@ unpack_source() {
                                rm -rf $PKGMK_WORK_DIR
                        fi
                        error "Building '$TARGET' failed."
-                       exit 1
+                       exit $E_UNPACK
                fi
        done
 }
@@ -221,11 +236,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
@@ -233,7 +248,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."
@@ -315,9 +330,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."
@@ -350,7 +370,9 @@ remove_work_dir() {
 
 build_package() {
        local BUILD_SUCCESSFUL="no"
+       local COMPRESSION
        
+       check_file "$TARGET"
        make_work_dir
 
        if [ "$UID" != "0" ]; then
@@ -373,8 +395,14 @@ build_package() {
                
                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"
 
@@ -462,6 +490,7 @@ update_footprint() {
                exit 1
        fi
        
+       check_file "$PKGMK_FOOTPRINT"
        make_footprint > $PKGMK_FOOTPRINT
        touch $TARGET
        
@@ -509,6 +538,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"
@@ -543,6 +573,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)
@@ -579,6 +611,12 @@ parse_options() {
 }
 
 main() {
+       # multilib
+       PKGMK_ARCH=64
+       if [ -f ".32bit" ]; then
+               PKGMK_ARCH=32
+       fi
+
        local FILE TARGET
        
        parse_options "$@"
@@ -601,9 +639,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
@@ -616,6 +662,7 @@ main() {
        
        if [ "$PKGMK_UPDATE_MD5SUM" = "yes" ]; then
                download_source
+               check_file "$PKGMK_MD5SUM"
                make_md5sum > $PKGMK_MD5SUM
                info "Md5sum updated."
                exit 0
@@ -676,6 +723,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"
@@ -684,6 +733,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"