X-Git-Url: http://gitweb/?a=blobdiff_plain;f=pkgmk.in;h=997453deb50f39ae87bed92b53fe8bef3efe682d;hb=bf4255e16b64eb26eeda62b610d24c111a2fe574;hp=b8e3e4e1957086b9b255e31973dfdb64f8a5206d;hpb=5228efc2d634e5b75429b221ea4e09c20b5b4829;p=pkgutils-cross.git

diff --git a/pkgmk.in b/pkgmk.in
index b8e3e4e..997453d 100755
--- 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
@@ -21,6 +21,18 @@
 #  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,29 +61,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
 }
 
@@ -87,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`
@@ -129,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"
@@ -143,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
@@ -162,7 +174,7 @@ unpack_source() {
 	for FILE in ${source[@]}; do
 		LOCAL_FILENAME=`get_filename $FILE`
 		case $LOCAL_FILENAME in
-			*.tar.gz|*.tar.Z|*.tgz|*.tar.bz2|*.tbz2|*.tar.xz|*.txz|*.tar.lzma|*.zip|*.rpm)
+			*.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" ;;
@@ -177,7 +189,7 @@ unpack_source() {
 				rm -rf $PKGMK_WORK_DIR
 			fi
 			error "Building '$TARGET' failed."
-			exit 1
+			exit $E_UNPACK
 		fi
 	done
 }
@@ -224,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
@@ -236,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."
@@ -318,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."
@@ -353,6 +370,7 @@ remove_work_dir() {
 
 build_package() {
 	local BUILD_SUCCESSFUL="no"
+	local COMPRESSION
 	
 	check_file "$TARGET"
 	make_work_dir
@@ -377,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"
 
@@ -514,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"
@@ -548,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)
@@ -584,6 +611,12 @@ parse_options() {
 }
 
 main() {
+	# multilib
+	PKGMK_ARCH=64
+	if [ -f ".32bit" ]; then
+		PKGMK_ARCH=32
+	fi
+
 	local FILE TARGET
 	
 	parse_options "$@"
@@ -606,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
@@ -682,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"
@@ -690,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"