summaryrefslogtreecommitdiff
path: root/pkgmk.in
blob: 348989d57edae026380b74316ce6df27c1ff1b6e (plain)
    1 #!/bin/bash
    2 #
    3 #  pkgutils
    4 # 
    5 #  Copyright (c) 2000-2005 Per Liden
    6 #  Copyright (c) 2006-2013 by CRUX team (http://crux.nu)
    7 # 
    8 #  This program is free software; you can redistribute it and/or modify
    9 #  it under the terms of the GNU General Public License as published by
   10 #  the Free Software Foundation; either version 2 of the License, or
   11 #  (at your option) any later version.
   12 #
   13 #  This program is distributed in the hope that it will be useful,
   14 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
   15 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16 #  GNU General Public License for more details.
   17 #
   18 #  You should have received a copy of the GNU General Public License
   19 #  along with this program; if not, write to the Free Software
   20 #  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 
   21 #  USA.
   22 #
   23 
   24 ##
   25 # error codes
   26 E_GENERAL=1
   27 E_PKGFILE=2    # invalid Pkgfile
   28 E_DIR_PERM=3   # (source/build) directory missing or missing read/write permission
   29 E_DOWNLOAD=4   # error during download
   30 E_UNPACK=5     # error during unpacking of source file(s)
   31 E_MD5=6        # md5sum verification failed
   32 E_FOOTPRINT=7  # footprint check failure
   33 E_BUILD=8      # error while running 'build()'
   34 E_INSTALL=9    # error while installing the package via 'pkgadd'
   35 E_SIGNATURE=10 # error verifying the signature
   36 
   37 info() {
   38 	echo "=======> $1"
   39 }
   40 
   41 warning() {
   42 	info "WARNING: $1" >&2
   43 }
   44 
   45 error() {
   46 	info "ERROR: $1" >&2
   47 }
   48 
   49 get_filename() {
   50 	local ABSOLUTE=""
   51 	if [ "$1" = "-a" ]; then
   52 		ABSOLUTE=1
   53 		shift
   54 	fi
   55 
   56 	if [[ $1 =~ ^(http|https|ftp|file)://.*/(.+) ]]; then
   57 		echo "$PKGMK_SOURCE_DIR/${BASH_REMATCH[2]}"
   58 	else
   59 		if [ "$ABSOLUTE" ]; then
   60 			echo $PKGMK_ROOT/$1
   61 		else
   62 			echo $1
   63 		fi
   64 	fi
   65 }
   66 
   67 get_basename() {
   68 	local FILE="`echo $1 | sed 's|^.*://.*/||g'`"
   69 	echo $FILE
   70 }
   71 
   72 check_pkgfile() {
   73 	if [ ! "$name" ]; then
   74 		error "Variable 'name' not specified in $PKGMK_PKGFILE."
   75 		exit $E_PKGFILE
   76 	elif [ ! "$version" ]; then
   77 		error "Variable 'version' not specified in $PKGMK_PKGFILE."
   78 		exit $E_PKGFILE
   79 	elif [ ! "$release" ]; then
   80 		error "Variable 'release' not specified in $PKGMK_PKGFILE."
   81 		exit $E_PKGFILE
   82 	elif [ "`type -t build`" != "function" ]; then
   83 		error "Function 'build' not specified in $PKGMK_PKGFILE."
   84 		exit $E_PKGFILE
   85 	fi
   86 }
   87 
   88 check_directory() {
   89 	if [ ! -d $1 ]; then
   90 		error "Directory '$1' does not exist."
   91 		exit $E_DIR_PERM
   92 	elif [ ! -w $1 ]; then
   93 		error "Directory '$1' not writable."
   94 		exit $E_DIR_PERM
   95 	elif [ ! -x $1 ] || [ ! -r $1 ]; then
   96 		error "Directory '$1' not readable."
   97 		exit $E_DIR_PERM
   98 	fi
   99 }
  100 
  101 check_file() {
  102 	if [ -e $1 ] && [ ! -w $1 ]; then
  103 		error "File '$1' is not writable."
  104 		exit 1
  105 	fi
  106 }
  107 
  108 download_file() {
  109 	info "Downloading '$1'."
  110 
  111 	PKGMK_DOWNLOAD_PROG=${PKGMK_DOWNLOAD_PROG:-wget}
  112 	if [ ! "`type -p ${PKGMK_DOWNLOAD_PROG}`" ]; then
  113 		error "Command '${PKGMK_DOWNLOAD_PROG}' not found."
  114 		exit $E_GENERAL
  115 	fi
  116 
  117 	LOCAL_FILENAME=`get_filename $1`
  118 	LOCAL_FILENAME_PARTIAL="$LOCAL_FILENAME.partial"
  119 	
  120 	case ${PKGMK_DOWNLOAD_PROG} in
  121 		curl)
  122 			RESUME_CMD="-C -"
  123 			DOWNLOAD_OPTS="-L --fail --ftp-pasv --retry 3 --retry-delay 3 \
  124 			-o $LOCAL_FILENAME_PARTIAL $PKGMK_CURL_OPTS"
  125 			;;
  126 		wget)
  127 			RESUME_CMD="-c"
  128 			DOWNLOAD_OPTS="--passive-ftp --no-directories --tries=3 --waitretry=3 \
  129 			--directory-prefix=$PKGMK_SOURCE_DIR \
  130 			--output-document=$LOCAL_FILENAME_PARTIAL $PKGMK_WGET_OPTS"
  131 			;;
  132 	esac
  133 
  134 	if [ -f "$LOCAL_FILENAME_PARTIAL" ]; then
  135 		info "Partial download found, trying to resume"
  136 		RESUME_OPTS="$RESUME_CMD"
  137 	fi
  138 
  139 	error=1
  140 
  141 	BASENAME=`get_basename $1`
  142 	for REPO in ${PKGMK_SOURCE_MIRRORS[@]}; do
  143 		REPO="`echo $REPO | sed 's|/$||'`"
  144 		$PKGMK_DOWNLOAD_PROG $DOWNLOAD_OPTS $RESUME_OPTS $REPO/$BASENAME
  145 		error=$?
  146 		if [ $error == 0 ]; then
  147 			break
  148 		fi
  149 	done
  150 
  151 	if [ $error != 0 ]; then
  152 		while true; do
  153 			$PKGMK_DOWNLOAD_PROG $DOWNLOAD_OPTS $RESUME_OPTS $1
  154 			error=$?
  155 			if [ $error != 0 ] && [ "$RESUME_OPTS" ]; then
  156 				info "Partial download failed, restarting"
  157 				rm -f "$LOCAL_FILENAME_PARTIAL"
  158 				RESUME_OPTS=""
  159 			else
  160 				break
  161 			fi
  162 		done
  163 	fi
  164 	
  165 	if [ $error != 0 -o ! -f "$LOCAL_FILENAME_PARTIAL" ]; then
  166 		error "Downloading '$1' failed."
  167 		exit $E_DOWNLOAD
  168 	fi
  169 	
  170 	mv -f "$LOCAL_FILENAME_PARTIAL" "$LOCAL_FILENAME"
  171 }
  172 
  173 download_source() {
  174 	local FILE LOCAL_FILENAME
  175 
  176 	for FILE in ${source[@]}; do
  177 		LOCAL_FILENAME=`get_filename $FILE`
  178 		if [ ! -e $LOCAL_FILENAME ]; then
  179 			if [ "$LOCAL_FILENAME" = "$FILE" ]; then
  180 				error "Source file '$LOCAL_FILENAME' not found (can not be downloaded, URL not specified)."
  181 				exit $E_DOWNLOAD
  182 			else
  183 				if [ "$PKGMK_DOWNLOAD" = "yes" ]; then
  184 					download_file $FILE
  185 				else
  186 					error "Source file '$LOCAL_FILENAME' not found (use option -d to download)."
  187 					exit $E_DOWNLOAD
  188 				fi
  189 			fi
  190 		fi
  191 	done
  192 }
  193 
  194 unpack_source() {
  195 	local FILE LOCAL_FILENAME COMMAND
  196 	
  197 	for FILE in ${source[@]}; do
  198 		LOCAL_FILENAME=`get_filename $FILE`
  199 		case $LOCAL_FILENAME in
  200 			*.tar|*.tar.gz|*.tar.Z|*.tgz|*.tar.bz2|*.tbz2|*.tar.xz|*.txz|*.tar.lzma|*.zip|*.rpm)
  201 				COMMAND="bsdtar -p -o -C $SRC -xf $LOCAL_FILENAME" ;;
  202 			*)
  203 				COMMAND="cp $LOCAL_FILENAME $SRC" ;;
  204 		esac
  205 
  206 		echo "$COMMAND"
  207 
  208 		$COMMAND
  209 
  210 		if [ $? != 0 ]; then
  211 			if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  212 				rm -rf $PKGMK_WORK_DIR
  213 			fi
  214 			error "Building '$TARGET' failed."
  215 			exit $E_UNPACK
  216 		fi
  217 	done
  218 }
  219 
  220 make_md5sum() {
  221 	local FILE LOCAL_FILENAMES
  222 	
  223 	if [ "$source" ]; then
  224 		for FILE in ${source[@]}; do
  225 			LOCAL_FILENAMES="$LOCAL_FILENAMES `get_filename $FILE`"
  226 		done
  227 		
  228 		md5sum $LOCAL_FILENAMES | sed -e 's|  .*/|  |' | sort -k 2
  229 	fi
  230 }
  231 
  232 make_footprint() {
  233 	pkginfo --footprint $TARGET | \
  234 		sed "s|\tlib/modules/`uname -r`/|\tlib/modules/<kernel-version>/|g" | \
  235 		sort -k 3
  236 }
  237 
  238 check_md5sum() {
  239 	local FILE="$PKGMK_WORK_DIR/.tmp"
  240 
  241 	cd $PKGMK_ROOT
  242 
  243 	if [ -f $PKGMK_MD5SUM ]; then
  244 		make_md5sum > $FILE.md5sum
  245 		sort -k 2 $PKGMK_MD5SUM > $FILE.md5sum.orig
  246 		diff -w -t -U 0 $FILE.md5sum.orig $FILE.md5sum | \
  247 			sed '/^@@/d' | \
  248 			sed '/^+++/d' | \
  249 			sed '/^---/d' | \
  250 			sed 's/^+/NEW       /g' | \
  251 			sed 's/^-/MISSING   /g' > $FILE.md5sum.diff
  252 		if [ -s $FILE.md5sum.diff ]; then
  253 			error "Md5sum mismatch found:"
  254 			cat $FILE.md5sum.diff >&2
  255 
  256 			if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  257 				rm -rf $PKGMK_WORK_DIR
  258 			fi
  259 
  260 			if [ "$PKGMK_CHECK_MD5SUM" = "yes" ]; then
  261 				error "Md5sum not ok."
  262 				exit $E_MD5
  263 			fi
  264 
  265 			error "Building '$TARGET' failed."
  266 			exit $E_MD5
  267 		fi
  268 	else
  269 		if [ "$PKGMK_CHECK_MD5SUM" = "yes" ]; then
  270 			if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  271 				rm -rf $PKGMK_WORK_DIR
  272 			fi
  273 			info "Md5sum not found."
  274 			exit $E_MD5
  275 		fi
  276 		
  277 		warning "Md5sum not found, creating new."
  278 		make_md5sum > $PKGMK_MD5SUM
  279 	fi
  280 
  281 	if [ "$PKGMK_CHECK_MD5SUM" = "yes" ]; then
  282 		if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  283 			rm -rf $PKGMK_WORK_DIR
  284 		fi
  285 		info "Md5sum ok."
  286 		exit 0
  287 	fi
  288 }
  289 
  290 # requires a previous call of make_work_dir()
  291 check_signature() {
  292 	local RESULT=0
  293 	local PUBKEY=""
  294 
  295 	if [ -f $PKGMK_ROOT/$PKGMK_SIGNATURE ]; then
  296 		cd $SRC
  297 		if [ "$source" ]; then
  298 			for FILE in "$PKGMK_PKGFILE" "$PKGMK_FOOTPRINT" ${source[@]}; do
  299 				ln -s $(get_filename -a $FILE) .
  300 			done
  301 		fi
  302 
  303 		if [ "$PKGMK_PUBLICKEY" ]; then
  304 			err=$(signify -q -C -p "$PKGMK_PUBLICKEY" -x "$PKGMK_ROOT/$PKGMK_SIGNATURE" 2>&1)
  305 		else
  306 			err=$(signify -q -C -x "$PKGMK_ROOT/$PKGMK_SIGNATURE" 2>&1)
  307 		fi
  308 
  309 		RESULT=$?
  310 		cd $PKGMK_ROOT
  311 
  312 		if [ $RESULT -ne 0 ]; then
  313 
  314 			if [ "$err" = "signify: signature verification failed" ]; then
  315 				error "Failed verifying cryptographic digest"
  316 			else
  317 				error "Signature mismatch found:"
  318 				echo "$err" | while read n; do echo 'MISMATCH	'${n%%:*}; done
  319 			fi
  320 
  321 			if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  322 				rm -rf $PKGMK_WORK_DIR
  323 			fi
  324 
  325 			error "Building '$TARGET' failed."
  326 			exit $E_SIGNATURE
  327     #else
  328       #info "Signature verification succeeded."
  329 		fi
  330 	else
  331     if [ "$PKGMK_IGNORE_MD5SUM" = "no" ] && [ "$PKGMK_CHECK_SIGNATURE" = "no" ]; then
  332       warning "Signature file not found, falling back to old md5sum checking."
  333       return 0;
  334     fi
  335 
  336 		if [ "$PKGMK_CHECK_SIGNATURE" = "yes" ]; then
  337 			if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  338 				rm -rf $PKGMK_WORK_DIR
  339 			fi
  340 			info "Signature not found."
  341 			exit $E_SIGNATURE
  342 		fi
  343 
  344 		warning "Signature not found, creating new."
  345 		cd $PKGMK_ROOT
  346 		make_signature
  347 	fi
  348 
  349 	if [ "$PKGMK_CHECK_SIGNATURE" = "yes" ]; then
  350 		if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  351 			rm -rf $PKGMK_WORK_DIR
  352 		fi
  353 		info "Signature ok."
  354 		exit 0
  355 	fi
  356 
  357 	# remove soft links
  358 	find $SRC -maxdepth 1 -mindepth 1 -type l -delete
  359 }
  360 
  361 make_signature() {
  362 	local FILE LOCAL_FILENAMES
  363 	local REPO
  364 
  365 	if [ "$source" ]; then
  366 		for FILE in "$PKGMK_PKGFILE" "$PKGMK_FOOTPRINT" ${source[@]}; do
  367 			LOCAL_FILENAMES="$LOCAL_FILENAMES `get_filename $FILE`"
  368 		done
  369 
  370 		if [ ! "$PKGMK_PRIVATEKEY" ]; then
  371 			REPO=${PWD%/*}
  372 			REPO=${REPO##*/}
  373 			REPO=${REPO%.git}
  374 		fi
  375 
  376 		if [ "$REPO" ]; then
  377 			PKGMK_PRIVATEKEY="/etc/ports/${REPO}.sec"
  378 		fi
  379 
  380 		sha256sum --tag $LOCAL_FILENAMES | sed 's|^SHA256 (.*/\(.*\))\(.* = .*\)|SHA256 (\1)\2|' | \
  381 		signify -S -e -x - -q -s "$PKGMK_PRIVATEKEY" -m - > ${PKGMK_SIGNATURE}.tmp
  382 
  383 		if [ $? -ne 0 ]; then
  384 			rm ${PKGMK_SIGNATURE}.tmp
  385 			error "Creating signature failed"
  386 			exit $E_SIGNATURE
  387 		else
  388 			mv ${PKGMK_SIGNATURE}.tmp ${PKGMK_SIGNATURE}
  389 		fi
  390 	fi
  391 }
  392 
  393 refresh_signature() {
  394 		if [ ! "$PKGMK_PRIVATEKEY" ]; then
  395 			REPO=${PWD%/*}
  396 			REPO=${REPO##*/}
  397 			REPO=${REPO%.git}
  398 		fi
  399 
  400 		if [ "$REPO" ]; then
  401 			PKGMK_PRIVATEKEY="/etc/ports/${REPO}.sec"
  402 		fi
  403 
  404 		tail -n +3 ${PKGMK_SIGNATURE} | \
  405 		signify -S -e -x - -q -s "$PKGMK_PRIVATEKEY" -m - > ${PKGMK_SIGNATURE}.tmp
  406 
  407 		if [ $? -ne 0 ]; then
  408 			rm ${PKGMK_SIGNATURE}.tmp
  409 			error "Refreshing signature failed"
  410 			exit $E_SIGNATURE
  411 		else
  412 			mv ${PKGMK_SIGNATURE}.tmp ${PKGMK_SIGNATURE}
  413 		fi
  414 }
  415 
  416 strip_files() {
  417 	local FILE FILTER
  418 	
  419 	cd $PKG
  420 	
  421 	if [ -f $PKGMK_ROOT/$PKGMK_NOSTRIP ]; then
  422 		FILTER="grep -v -f $PKGMK_ROOT/$PKGMK_NOSTRIP"
  423 	else
  424 		FILTER="cat"
  425 	fi
  426 
  427 	find . -type f -printf "%P\n" | $FILTER | while read FILE; do
  428 		case $(file -b "$FILE") in
  429 		*ELF*executable*not\ stripped)
  430 			strip --strip-all "$FILE"
  431 			;;
  432 		*ELF*shared\ object*not\ stripped)
  433 			strip --strip-unneeded "$FILE"
  434 			;;
  435 		current\ ar\ archive)
  436 			strip --strip-debug "$FILE"
  437 		esac
  438 	done
  439 }
  440 
  441 compress_manpages() {
  442 	local FILE DIR TARGET
  443 
  444 	cd $PKG
  445 	
  446 	find . -type f -path "*/man/man*/*" | while read FILE; do
  447 		if [ "$FILE" = "${FILE%%.gz}" ]; then
  448 			gzip -9 "$FILE"
  449 		fi
  450 	done
  451 	
  452 	find . -type l -path "*/man/man*/*" | while read FILE; do
  453 		TARGET=`readlink -n "$FILE"`
  454 		TARGET="${TARGET##*/}"
  455 		TARGET="${TARGET%%.gz}.gz"
  456 		rm -f "$FILE"
  457 		FILE="${FILE%%.gz}.gz"
  458 		DIR=`dirname "$FILE"`
  459 
  460 		if [ -e "$DIR/$TARGET" ]; then
  461 			ln -sf "$TARGET" "$FILE"
  462 		fi
  463 	done
  464 }
  465 
  466 check_footprint() {
  467 	local FILE="$PKGMK_WORK_DIR/.tmp"
  468 	
  469 	cd $PKGMK_ROOT
  470 	
  471 	if [ -f $TARGET ]; then
  472 		make_footprint > $FILE.footprint
  473 		if [ -f $PKGMK_FOOTPRINT ]; then
  474 			sort -k 3 $PKGMK_FOOTPRINT > $FILE.footprint.orig
  475 			diff -w -t -U 0 $FILE.footprint.orig $FILE.footprint | \
  476 				sed '/^@@/d' | \
  477 				sed '/^+++/d' | \
  478 				sed '/^---/d' | \
  479 				sed 's/^+/NEW       /g' | \
  480 				sed 's/^-/MISSING   /g' > $FILE.footprint.diff
  481 			if [ -s $FILE.footprint.diff ]; then
  482 				if [ "$PKGMK_IGNORE_NEW" = "yes" ] && \
  483 				   [ -z "$(egrep -l ^MISSING $FILE.footprint.diff)" ] ; then
  484 					info "New files found:"
  485 				else
  486 					error "Footprint mismatch found:"
  487 					BUILD_SUCCESSFUL="no"
  488 				fi
  489 				cat $FILE.footprint.diff >&2
  490 			fi
  491 		else
  492 			warning "Footprint not found, creating new."
  493 			mv $FILE.footprint $PKGMK_FOOTPRINT
  494 		fi
  495 	else
  496 		error "Package '$TARGET' was not found."
  497 		BUILD_SUCCESSFUL="no"
  498 	fi
  499 }
  500 
  501 make_work_dir() {
  502 	export PKG="$PKGMK_WORK_DIR/pkg"
  503 	export SRC="$PKGMK_WORK_DIR/src"
  504 	umask 022
  505 	
  506 	cd $PKGMK_ROOT
  507 	remove_work_dir
  508 	mkdir -p $SRC $PKG
  509 
  510 	if [ "$PKGMK_IGNORE_SIGNATURE" = "no" ] || [ "$PKGMK_CHECK_SIGNATURE" = "yes" ]; then
  511 		test -f $PKGMK_SIGNATURE && cp $PKGMK_SIGNATURE $PKGMK_WORK_DIR
  512 		check_signature
  513 	fi
  514 	if [ "$PKGMK_IGNORE_MD5SUM" = "no" ]; then
  515 		check_md5sum
  516 	fi
  517 }
  518 
  519 remove_work_dir() {
  520 	rm -rf $PKGMK_WORK_DIR
  521 }
  522 
  523 
  524 build_package() {
  525 	local BUILD_SUCCESSFUL="no"
  526 	local COMPRESSION
  527 	
  528 	check_file "$TARGET"
  529 	make_work_dir
  530 
  531 	if [ "$UID" != "0" ]; then
  532 		warning "Packages should be built as root."
  533 	fi
  534 	
  535 	info "Building '$TARGET'."
  536 	
  537 	unpack_source
  538 	
  539 	cd $SRC
  540 	(set -e -x ; build)
  541 	
  542 	if [ $? = 0 ]; then
  543 		if [ "$PKGMK_NO_STRIP" = "no" ]; then
  544 			strip_files
  545 		fi
  546 		
  547 		compress_manpages
  548 		
  549 		cd $PKG
  550 		info "Build result:"
  551 
  552 		case $PKGMK_COMPRESSION_MODE in
  553 			gz)  COMPRESSION="-z" ;;
  554 			bz2) COMPRESSION="-j" ;;
  555 			xz)  COMPRESSION="-J" ;;
  556 		esac
  557 		bsdtar -c $COMPRESSION -f $TARGET *  &&  bsdtar -t -v -f $TARGET
  558 
  559 		if [ $? = 0 ]; then
  560 			BUILD_SUCCESSFUL="yes"
  561 
  562 			if [ "$PKGMK_IGNORE_FOOTPRINT" = "yes" ]; then
  563 				warning "Footprint ignored."
  564 			else
  565 				check_footprint
  566 			fi
  567 		fi
  568 	fi
  569 	
  570 	if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  571 		remove_work_dir
  572 	fi
  573 	
  574 	if [ "$BUILD_SUCCESSFUL" = "yes" ]; then
  575 		info "Building '$TARGET' succeeded."
  576 	else
  577 		if [ -f $TARGET ]; then
  578 			touch -r $PKGMK_ROOT/$PKGMK_PKGFILE $TARGET &> /dev/null
  579 		fi
  580 		error "Building '$TARGET' failed."
  581 		exit 1
  582 	fi
  583 }
  584 
  585 install_package() {
  586 	local COMMAND
  587 	
  588 	info "Installing '$TARGET'."
  589 	
  590 	if [ "$PKGMK_INSTALL" = "install" ]; then
  591 		COMMAND="pkgadd $TARGET"
  592 	else
  593 		COMMAND="pkgadd -u $TARGET"
  594 	fi
  595 	
  596 	cd $PKGMK_ROOT
  597 	echo "$COMMAND"
  598 	$COMMAND
  599 	
  600 	if [ $? = 0 ]; then
  601 		info "Installing '$TARGET' succeeded."
  602 	else
  603 		error "Installing '$TARGET' failed."
  604 		exit 1
  605 	fi
  606 }
  607 
  608 recursive() {
  609 	local ARGS FILE DIR
  610 	
  611 	ARGS=`echo "$@" | sed -e "s/--recursive//g" -e "s/-r//g"`
  612 	
  613 	for FILE in `find $PKGMK_ROOT -name $PKGMK_PKGFILE | sort`; do
  614 		DIR="`dirname $FILE`/"
  615 		if [ -d $DIR ]; then
  616 			info "Entering directory '$DIR'."
  617 			(cd $DIR && $PKGMK_COMMAND $ARGS)
  618 			info "Leaving directory '$DIR'."
  619 		fi
  620 	done
  621 }
  622 
  623 clean() {
  624 	local FILE LOCAL_FILENAME
  625 	
  626 	if [ -f $TARGET ]; then
  627 		info "Removing $TARGET"
  628 		rm -f $TARGET
  629 	fi
  630 	
  631 	for FILE in ${source[@]}; do
  632 		LOCAL_FILENAME=`get_filename $FILE`
  633 		if [ -e $LOCAL_FILENAME ] && [ "$LOCAL_FILENAME" != "$FILE" ]; then
  634 			info "Removing $LOCAL_FILENAME"
  635 			rm -f $LOCAL_FILENAME
  636 		fi
  637 	done
  638 }
  639 
  640 update_footprint() {
  641 	if [ ! -f $TARGET ]; then
  642 		error "Unable to update footprint. File '$TARGET' not found."
  643 		exit 1
  644 	fi
  645 	
  646 	check_file "$PKGMK_FOOTPRINT"
  647 	make_footprint > $PKGMK_FOOTPRINT
  648 	touch $TARGET
  649 	
  650 	info "Footprint updated."
  651 }
  652 
  653 build_needed() {
  654 	local FILE RESULT
  655 	
  656 	RESULT="yes"
  657 	if [ -f $TARGET ]; then
  658 		RESULT="no"
  659 		for FILE in $PKGMK_PKGFILE ${source[@]}; do
  660 			FILE=`get_filename $FILE`
  661 			if [ ! -e $FILE ] || [ ! $TARGET -nt $FILE ]; then
  662 				RESULT="yes"
  663 				break
  664 			fi
  665 		done
  666 	fi
  667 	
  668 	echo $RESULT
  669 }
  670 
  671 interrupted() {
  672 	echo ""
  673 	error "Interrupted."
  674 	
  675 	if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  676 		rm -rf $PKGMK_WORK_DIR
  677 	fi
  678 	
  679 	exit 1
  680 }
  681 
  682 print_help() {
  683 	echo "usage: `basename $PKGMK_COMMAND` [options]"
  684 	echo "options:"
  685 	echo "  -i,   --install             build and install package"
  686 	echo "  -u,   --upgrade             build and install package (as upgrade)"
  687 	echo "  -r,   --recursive           search for and build packages recursively"
  688 	echo "  -d,   --download            download missing source file(s)"
  689 	echo "  -do,  --download-only       do not build, only download missing source file(s)"
  690 	echo "  -eo,  --extract-only        do not build, only extract source file(s)"
  691 	echo "  -utd, --up-to-date          do not build, only check if package is up to date"
  692 	echo "  -uf,  --update-footprint    update footprint using result from last build"
  693 	echo "  -if,  --ignore-footprint    build package without checking footprint"
  694 	echo "  -in,  --ignore-new          build package, ignore new files in a footprint missmatch"
  695 	echo "  -um,  --update-md5sum       update md5sum"
  696 	echo "  -im,  --ignore-md5sum       build package without checking md5sum"
  697 	echo "  -cm,  --check-md5sum        do not build, only check md5sum"
  698 	echo "  -us,  --update-signature    update signature including sha256 checksums"
  699 	echo "  -cs,  --check-signature     check the validity of the port files"
  700 	echo "  -is,  --ignore-signature    build package without checking the signature"
  701 	echo "  -rs,  --refresh-signature   create new signature and keep existing sha256 checksums"
  702 	echo "  -sk,  --secret-key <file>   use <file> to sign the port"
  703 	echo "  -pk,  --public-key <file>   check the port siganture using public-key <file>"
  704 	echo "  -ns,  --no-strip            do not strip executable binaries or libraries"
  705 	echo "  -f,   --force               build package even if it appears to be up to date"
  706 	echo "  -c,   --clean               remove package and downloaded files"
  707 	echo "  -kw,  --keep-work           keep temporary working directory"
  708 	echo "  -cf,  --config-file <file>  use alternative configuration file"
  709 	echo "  -v,   --version             print version and exit "
  710 	echo "  -h,   --help                print help and exit"
  711 }
  712 
  713 parse_options() {
  714 	while [ "$1" ]; do
  715 		case $1 in
  716 			-i|--install)
  717 				PKGMK_INSTALL="install" ;;
  718 			-u|--upgrade)
  719 				PKGMK_INSTALL="upgrade" ;;
  720 			-r|--recursive)
  721 				PKGMK_RECURSIVE="yes" ;;
  722 			-d|--download)
  723 				PKGMK_DOWNLOAD="yes" ;;
  724 			-do|--download-only)
  725 				PKGMK_DOWNLOAD="yes"
  726 				PKGMK_DOWNLOAD_ONLY="yes" ;;
  727 			-eo|--extract-only)
  728 				PKGMK_EXTRACT_ONLY="yes" ;;
  729 			-utd|--up-to-date)
  730 				PKGMK_UP_TO_DATE="yes" ;;
  731 			-uf|--update-footprint)
  732 				PKGMK_UPDATE_FOOTPRINT="yes" ;;
  733 			-if|--ignore-footprint)
  734 				PKGMK_IGNORE_FOOTPRINT="yes" ;;
  735 			-in|--ignore-new)
  736 				PKGMK_IGNORE_NEW="yes" ;;
  737 			-um|--update-md5sum)
  738 				PKGMK_UPDATE_MD5SUM="yes" ;;
  739 			-im|--ignore-md5sum)
  740 				PKGMK_IGNORE_MD5SUM="yes" ;;
  741 			-cm|--check-md5sum)
  742 				PKGMK_CHECK_MD5SUM="yes" ;;
  743 			-us|--update-signature)
  744 				PKGMK_UPDATE_SIGNATURE="yes" ;;
  745 			-cs|--check-signature)
  746 				PKGMK_CHECK_SIGNATURE="yes" ;;
  747 			-is|--ignore-signature)
  748 				PKGMK_IGNORE_SIGNATURE="yes" ;;
  749 			-rs|--referesh-signature)
  750 				PKGMK_REFRESH_SIGNATURE="yes" ;;
  751 			-ns|--no-strip)
  752 				PKGMK_NO_STRIP="yes" ;;
  753 			-f|--force)
  754 				PKGMK_FORCE="yes" ;;
  755 			-c|--clean)
  756 				PKGMK_CLEAN="yes" ;;
  757 			-kw|--keep-work)
  758 				PKGMK_KEEP_WORK="yes" ;;
  759 			-pk|--public-key)
  760 				if [ ! "$2" ]; then
  761 					echo "`basename $PKGMK_COMMAND`: option $1 requires an argument"
  762 					exit 1
  763 				fi
  764 				PKGMK_PUBLICKEY="$2"
  765 				shift ;;
  766 			-sk|--secret-key)
  767 				if [ ! "$2" ]; then
  768 					echo "`basename $PKGMK_COMMAND`: option $1 requires an argument"
  769 					exit 1
  770 				fi
  771 				PKGMK_PRIVATEKEY="$2"
  772 				shift ;;
  773 			-cf|--config-file)
  774 				if [ ! "$2" ]; then
  775 					echo "`basename $PKGMK_COMMAND`: option $1 requires an argument"
  776 					exit 1
  777 				fi
  778 				PKGMK_CONFFILE="$2"
  779 				shift ;;
  780 			-v|--version)
  781 				echo "`basename $PKGMK_COMMAND` (pkgutils) $PKGMK_VERSION"
  782 				exit 0 ;;
  783 			-h|--help)
  784 				print_help
  785 				exit 0 ;;
  786 			*)
  787 				echo "`basename $PKGMK_COMMAND`: invalid option $1"
  788 				exit 1 ;;
  789 		esac
  790 		shift
  791 	done
  792 }
  793 
  794 main() {
  795 	# multilib
  796 	PKGMK_ARCH=64
  797 	if [ -f ".32bit" ]; then
  798 		PKGMK_ARCH=32
  799 	fi
  800 
  801 	local FILE TARGET
  802 	
  803 	parse_options "$@"
  804 	
  805 	if [ "$PKGMK_RECURSIVE" = "yes" ]; then
  806 		recursive "$@"
  807 		exit 0
  808 	fi
  809 	
  810 	for FILE in $PKGMK_PKGFILE $PKGMK_CONFFILE; do
  811 		if [ ! -f $FILE ]; then
  812 			error "File '$FILE' not found."
  813 			exit 1
  814 		fi
  815 		. $FILE
  816 	done
  817 	
  818 	check_directory "$PKGMK_SOURCE_DIR"
  819 	check_directory "$PKGMK_PACKAGE_DIR"
  820 	check_directory "`dirname $PKGMK_WORK_DIR`"
  821 	
  822 	check_pkgfile
  823 
  824 	case $PKGMK_COMPRESSION_MODE in
  825 		gz|bz2|xz)
  826 			TARGET="$PKGMK_PACKAGE_DIR/$name#$version-$release.pkg.tar.$PKGMK_COMPRESSION_MODE"
  827 			;;
  828 		*)
  829 			error "Compression mode '$PKGMK_COMPRESSION_MODE' not supported"
  830 			exit 1
  831 			;;
  832 	esac
  833 
  834 	if [ "$PKGMK_CLEAN" = "yes" ]; then
  835 		clean
  836 		exit 0
  837 	fi
  838 	
  839 	if [ "$PKGMK_UPDATE_FOOTPRINT" = "yes" ]; then
  840 		update_footprint
  841 		exit 0
  842 	fi
  843 	
  844 	if [ "$PKGMK_UPDATE_MD5SUM" = "yes" ]; then
  845 		download_source
  846 		check_file "$PKGMK_MD5SUM"
  847 		make_md5sum > $PKGMK_MD5SUM
  848 		info "Md5sum updated."
  849 		exit 0
  850 	fi
  851 	
  852 	if [ "$PKGMK_UPDATE_SIGNATURE" = "yes" ]; then
  853 		download_source
  854 		check_file "$PKGMK_SIGNATURE"
  855 		make_signature
  856 		info "Signature updated."
  857 		exit 0
  858 	fi
  859 
  860 	if [ "$PKGMK_REFRESH_SIGNATURE" = "yes" ]; then
  861 		check_file "$PKGMK_SIGNATURE"
  862 		refresh_signature
  863 		info "Signature refreshed."
  864 		exit 0
  865 	fi
  866 
  867 	if [ "$PKGMK_DOWNLOAD_ONLY" = "yes" ]; then
  868 		download_source
  869 		exit 0
  870 	fi
  871 	
  872 	if [ "$PKGMK_EXTRACT_ONLY" = "yes" ]; then
  873 		download_source
  874 		make_work_dir
  875 		info "Extracting sources of package '$name-$version'."
  876 		unpack_source
  877 		exit 0
  878 	fi
  879 	
  880 	if [ "$PKGMK_UP_TO_DATE" = "yes" ]; then
  881 		if [ "`build_needed`" = "yes" ]; then
  882 			info "Package '$TARGET' is not up to date."
  883 		else
  884 			info "Package '$TARGET' is up to date."
  885 		fi
  886 		exit 0
  887 	fi
  888 	
  889 	if [ "`build_needed`" = "no" ] && [ "$PKGMK_FORCE" = "no" ] && [ "$PKGMK_CHECK_MD5SUM" = "no" ] && [ "$PKGMK_CHECK_SIGNATURE" = "no" ]; then
  890 		info "Package '$TARGET' is up to date."
  891 	else
  892 		download_source
  893 		build_package
  894 	fi
  895 	
  896 	if [ "$PKGMK_INSTALL" != "no" ]; then
  897 		install_package
  898 	fi
  899 	
  900 	exit 0
  901 }
  902 
  903 trap "interrupted" SIGHUP SIGINT SIGQUIT SIGTERM
  904 
  905 export LC_ALL=POSIX
  906 
  907 readonly PKGMK_VERSION="#VERSION#"
  908 readonly PKGMK_COMMAND="$0"
  909 readonly PKGMK_ROOT="$PWD"
  910 
  911 PKGMK_CONFFILE="/etc/pkgmk.conf"
  912 PKGMK_PKGFILE="Pkgfile"
  913 PKGMK_FOOTPRINT=".footprint"
  914 PKGMK_MD5SUM=".md5sum"
  915 PKGMK_NOSTRIP=".nostrip"
  916 PKGMK_SIGNATURE=".signature"
  917 
  918 PKGMK_SOURCE_MIRRORS=()
  919 PKGMK_SOURCE_DIR="$PWD"
  920 PKGMK_PACKAGE_DIR="$PWD"
  921 PKGMK_WORK_DIR="$PWD/work"
  922 
  923 PKGMK_COMPRESSION_MODE="gz"
  924 
  925 PKGMK_INSTALL="no"
  926 PKGMK_RECURSIVE="no"
  927 PKGMK_DOWNLOAD="no"
  928 PKGMK_DOWNLOAD_ONLY="no"
  929 PKGMK_EXTRACT_ONLY="no"
  930 PKGMK_UP_TO_DATE="no"
  931 PKGMK_UPDATE_FOOTPRINT="no"
  932 PKGMK_IGNORE_FOOTPRINT="no"
  933 PKGMK_IGNORE_NEW="no"
  934 PKGMK_FORCE="no"
  935 PKGMK_KEEP_WORK="no"
  936 PKGMK_UPDATE_MD5SUM="no"
  937 PKGMK_IGNORE_MD5SUM="no"
  938 PKGMK_CHECK_MD5SUM="no"
  939 PKGMK_UPDATE_SIGNATURE="no"
  940 PKGMK_IGNORE_SIGNATURE="no"
  941 PKGMK_CHECK_SIGNATURE="no"
  942 PKGMK_REFRESH_SIGNATURE="no"
  943 PKGMK_PRIVATEKEY=""
  944 PKGMK_NO_STRIP="no"
  945 PKGMK_CLEAN="no"
  946 
  947 main "$@"
  948 
  949 # End of file

Generated by cgit