CRUX-ARM : Home

Home :: Documentation :: Download :: Development :: Community :: Ports :: Packages :: Bugs :: Links :: About :: Donors
Be less strict about the package name suffix.
[pkgutils-cross.git] / pkgmk.in
index bfa1701103ac7ca78ae9938066d03461b832f7bb..b8e3e4e1957086b9b255e31973dfdb64f8a5206d 100755 (executable)
--- a/pkgmk.in
+++ b/pkgmk.in
@@ -3,6 +3,7 @@
 #  pkgutils
 # 
 #  Copyright (c) 2000-2005 Per Liden
+#  Copyright (c) 2006-2007 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
@@ -33,12 +34,15 @@ error() {
 }
 
 get_filename() {
-       local FILE="`echo $1 | sed 's|^.*://.*/||g'`"
-
-       if [ "$FILE" != "$1" ]; then
-               FILE="$PKGMK_SOURCE_DIR/$FILE"
+       if [[ $1 =~ ^(http|https|ftp|file)://.*/(.+) ]]; then
+               echo "$PKGMK_SOURCE_DIR/${BASH_REMATCH[2]}"
+       else
+               echo $1
        fi
+}
 
+get_basename() {
+       local FILE="`echo $1 | sed 's|^.*://.*/||g'`"
        echo $FILE
 }
 
@@ -71,6 +75,13 @@ check_directory() {
        fi
 }
 
+check_file() {
+       if [ -e $1 ] && [ ! -w $1 ]; then
+               error "File '$1' is not writable."
+               exit 1
+       fi
+}
+
 download_file() {
        info "Downloading '$1'."
 
@@ -81,25 +92,40 @@ download_file() {
 
        LOCAL_FILENAME=`get_filename $1`
        LOCAL_FILENAME_PARTIAL="$LOCAL_FILENAME.partial"
-       DOWNLOAD_CMD="--passive-ftp --no-directories --tries=3 --waitretry=3 \
-                     --directory-prefix=$PKGMK_SOURCE_DIR --output-document=$LOCAL_FILENAME_PARTIAL $1"
+       DOWNLOAD_OPTS="--passive-ftp --no-directories --tries=3 --waitretry=3 \
+               --directory-prefix=$PKGMK_SOURCE_DIR \
+               --output-document=$LOCAL_FILENAME_PARTIAL --no-check-certificate"
 
        if [ -f "$LOCAL_FILENAME_PARTIAL" ]; then
                info "Partial download found, trying to resume"
                RESUME_CMD="-c"
        fi
 
-       while true; do
-               wget $RESUME_CMD $DOWNLOAD_CMD
+       error=1
+
+       BASENAME=`get_basename $1`
+       for REPO in ${PKGMK_SOURCE_MIRRORS[@]}; do
+               REPO="`echo $REPO | sed 's|/$||'`"
+               wget $RESUME_CMD $DOWNLOAD_OPTS $PKGMK_WGET_OPTS $REPO/$BASENAME
                error=$?
-               if [ $error != 0 ] && [ "$RESUME_CMD" ]; then
-                       info "Partial download failed, restarting"
-                       rm -f "$LOCAL_FILENAME_PARTIAL"
-                       RESUME_CMD=""
-               else
+               if [ $error == 0 ]; then
                        break
                fi
        done
+
+       if [ $error != 0 ]; then
+               while true; do
+                       wget $RESUME_CMD $DOWNLOAD_OPTS $PKGMK_WGET_OPTS $1
+                       error=$?
+                       if [ $error != 0 ] && [ "$RESUME_CMD" ]; then
+                               info "Partial download failed, restarting"
+                               rm -f "$LOCAL_FILENAME_PARTIAL"
+                               RESUME_CMD=""
+                       else
+                               break
+                       fi
+               done
+       fi
        
        if [ $error != 0 ]; then
                error "Downloading '$1' failed."
@@ -136,12 +162,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.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
@@ -310,20 +332,30 @@ check_footprint() {
        fi
 }
 
-build_package() {
-       local BUILD_SUCCESSFUL="no"
-       
+make_work_dir() {
        export PKG="$PKGMK_WORK_DIR/pkg"
        export SRC="$PKGMK_WORK_DIR/src"
        umask 022
        
        cd $PKGMK_ROOT
-       rm -rf $PKGMK_WORK_DIR
+       remove_work_dir
        mkdir -p $SRC $PKG
-       
+
        if [ "$PKGMK_IGNORE_MD5SUM" = "no" ]; then
                check_md5sum
        fi
+}
+
+remove_work_dir() {
+       rm -rf $PKGMK_WORK_DIR
+}
+
+
+build_package() {
+       local BUILD_SUCCESSFUL="no"
+       
+       check_file "$TARGET"
+       make_work_dir
 
        if [ "$UID" != "0" ]; then
                warning "Packages should be built as root."
@@ -359,7 +391,7 @@ build_package() {
        fi
        
        if [ "$PKGMK_KEEP_WORK" = "no" ]; then
-               rm -rf $PKGMK_WORK_DIR
+               remove_work_dir
        fi
        
        if [ "$BUILD_SUCCESSFUL" = "yes" ]; then
@@ -434,6 +466,7 @@ update_footprint() {
                exit 1
        fi
        
+       check_file "$PKGMK_FOOTPRINT"
        make_footprint > $PKGMK_FOOTPRINT
        touch $TARGET
        
@@ -477,6 +510,7 @@ print_help() {
        echo "  -r,   --recursive           search for and build packages recursively"
        echo "  -d,   --download            download missing source file(s)"
        echo "  -do,  --download-only       do not build, only download missing source file(s)"
+       echo "  -eo,  --extract-only        do not build, only extract source file(s)"
        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"
@@ -506,6 +540,8 @@ parse_options() {
                        -do|--download-only)
                                PKGMK_DOWNLOAD="yes"
                                PKGMK_DOWNLOAD_ONLY="yes" ;;
+                       -eo|--extract-only)
+                               PKGMK_EXTRACT_ONLY="yes" ;;
                        -utd|--up-to-date)
                                PKGMK_UP_TO_DATE="yes" ;;
                        -uf|--update-footprint)
@@ -585,6 +621,7 @@ main() {
        
        if [ "$PKGMK_UPDATE_MD5SUM" = "yes" ]; then
                download_source
+               check_file "$PKGMK_MD5SUM"
                make_md5sum > $PKGMK_MD5SUM
                info "Md5sum updated."
                exit 0
@@ -595,6 +632,14 @@ main() {
                exit 0
        fi
        
+       if [ "$PKGMK_EXTRACT_ONLY" = "yes" ]; then
+               download_source
+               make_work_dir
+               info "Extracting sources of package '$name-$version'."
+               unpack_source
+               exit 0
+       fi
+       
        if [ "$PKGMK_UP_TO_DATE" = "yes" ]; then
                if [ "`build_needed`" = "yes" ]; then
                        info "Package '$TARGET' is not up to date."
@@ -632,6 +677,7 @@ PKGMK_FOOTPRINT=".footprint"
 PKGMK_MD5SUM=".md5sum"
 PKGMK_NOSTRIP=".nostrip"
 
+PKGMK_SOURCE_MIRRORS=()
 PKGMK_SOURCE_DIR="$PWD"
 PKGMK_PACKAGE_DIR="$PWD"
 PKGMK_WORK_DIR="$PWD/work"
@@ -640,6 +686,7 @@ PKGMK_INSTALL="no"
 PKGMK_RECURSIVE="no"
 PKGMK_DOWNLOAD="no"
 PKGMK_DOWNLOAD_ONLY="no"
+PKGMK_EXTRACT_ONLY="no"
 PKGMK_UP_TO_DATE="no"
 PKGMK_UPDATE_FOOTPRINT="no"
 PKGMK_IGNORE_FOOTPRINT="no"