summaryrefslogtreecommitdiff
path: root/pkgmk.in
blob: a4d91c7341485c2a01c9643e8f0fccb620226459 (plain)
    1 #!/bin/bash
    2 #
    3 #  pkgutils
    4 #
    5 #  Copyright (c) 2000-2005 Per Liden
    6 #  Copyright (c) 2006-2017 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="--compression=none --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|*.tar.lz|*.zip|*.rpm|*.7z)
  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 		for FILE in "$PKGMK_PKGFILE" "$PKGMK_FOOTPRINT" ${source[@]}; do
  298 			ln -s $(get_filename -a $FILE) .
  299 		done
  300 
  301 		if [ "$PKGMK_PUBLICKEY" ]; then
  302 			err=$(signify -q -C -p "$PKGMK_PUBLICKEY" -x "$PKGMK_ROOT/$PKGMK_SIGNATURE" 2>&1)
  303 		else
  304 			err=$(signify -q -C -x "$PKGMK_ROOT/$PKGMK_SIGNATURE" 2>&1)
  305 		fi
  306 
  307 		RESULT=$?
  308 		cd $PKGMK_ROOT
  309 
  310 		if [ $RESULT -ne 0 ]; then
  311 			if [ "$err" = "signify: signature verification failed" ]; then
  312 				error "Failed verifying cryptographic digest"
  313 			else
  314 				error "Signature mismatch found:"
  315 				echo "$err" | while read n; do echo 'MISMATCH	'${n%%:*}; done
  316 			fi
  317 
  318 			if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  319 				rm -rf $PKGMK_WORK_DIR
  320 			fi
  321 
  322 			error "Building '$TARGET' failed."
  323 			exit $E_SIGNATURE
  324 		#else
  325 			#info "Signature verification succeeded."
  326 		fi
  327 	else
  328 		if [ "$PKGMK_IGNORE_MD5SUM" = "no" ] && [ "$PKGMK_CHECK_SIGNATURE" = "no" ]; then
  329 			warning "Signature file not found, falling back to old md5sum checking."
  330 			return 1;
  331 		fi
  332 		if [ "$PKGMK_CHECK_SIGNATURE" = "yes" ]; then
  333 			if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  334 				rm -rf $PKGMK_WORK_DIR
  335 			fi
  336 			info "Signature not found."
  337 			exit $E_SIGNATURE
  338 		fi
  339 
  340 		warning "Signature not found, creating new."
  341 		cd $PKGMK_ROOT
  342 		make_signature
  343 	fi
  344 
  345 	if [ "$PKGMK_CHECK_SIGNATURE" = "yes" ]; then
  346 		if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  347 			rm -rf $PKGMK_WORK_DIR
  348 		fi
  349 		info "Signature ok."
  350 		exit 0
  351 	fi
  352 
  353 	# remove soft links
  354 	find $SRC -maxdepth 1 -mindepth 1 -type l -delete
  355 	return 0
  356 }
  357 
  358 make_signature() {
  359 	local FILE LOCAL_FILENAMES
  360 	local REPO
  361 
  362 	for FILE in "$PKGMK_PKGFILE" "$PKGMK_FOOTPRINT" ${source[@]}; do
  363 		LOCAL_FILENAMES="$LOCAL_FILENAMES `get_filename $FILE`"
  364 	done
  365 
  366 	if [ ! "$PKGMK_PRIVATEKEY" ]; then
  367 		REPO=${PWD%/*}
  368 		REPO=${REPO##*/}
  369 		REPO=${REPO%.git}
  370 	fi
  371 
  372 	if [ "$REPO" ]; then
  373 		PKGMK_PRIVATEKEY="/etc/ports/${REPO}.sec"
  374 	fi
  375 
  376 	sha256sum --tag $LOCAL_FILENAMES | sed 's|^SHA256 (.*/\(.*\))\(.* = .*\)|SHA256 (\1)\2|' | \
  377 	signify -S -e -x - -q -s "$PKGMK_PRIVATEKEY" -m - > ${PKGMK_SIGNATURE}.tmp
  378 
  379 	if [ $? -ne 0 ]; then
  380 		rm ${PKGMK_SIGNATURE}.tmp
  381 		error "Creating signature failed"
  382 		exit $E_SIGNATURE
  383 	else
  384 		mv ${PKGMK_SIGNATURE}.tmp ${PKGMK_SIGNATURE}
  385 	fi
  386 }
  387 
  388 refresh_signature() {
  389 	if [ ! "$PKGMK_PRIVATEKEY" ]; then
  390 		REPO=${PWD%/*}
  391 		REPO=${REPO##*/}
  392 		REPO=${REPO%.git}
  393 	fi
  394 
  395 	if [ "$REPO" ]; then
  396 		PKGMK_PRIVATEKEY="/etc/ports/${REPO}.sec"
  397 	fi
  398 
  399 	tail -n +3 ${PKGMK_SIGNATURE} | \
  400 	signify -S -e -x - -q -s "$PKGMK_PRIVATEKEY" -m - > ${PKGMK_SIGNATURE}.tmp
  401 
  402 	if [ $? -ne 0 ]; then
  403 		rm ${PKGMK_SIGNATURE}.tmp
  404 		error "Refreshing signature failed"
  405 		exit $E_SIGNATURE
  406 	else
  407 		mv ${PKGMK_SIGNATURE}.tmp ${PKGMK_SIGNATURE}
  408 	fi
  409 }
  410 
  411 strip_files() {
  412 	local FILTER
  413 	local N=$(nproc)
  414 
  415 	cd $PKG
  416 
  417 	if [ -f $PKGMK_ROOT/$PKGMK_NOSTRIP ]; then
  418 		FILTER="grep -v -f $PKGMK_ROOT/$PKGMK_NOSTRIP"
  419 	else
  420 		FILTER="cat"
  421 	fi
  422 
  423 	find . -type f -printf "%P\n" | $FILTER                   \
  424 		| xargs -r -L10 -P$N                              \
  425 			file --no-buffer --separator '>'          \
  426 			-e apptype -e ascii -e encoding -e tokens \
  427 			-e cdf -e compress -e tar -e text         \
  428 		| awk '
  429 			BEGIN { FS = ">[ ]+" }
  430 			$0 ~ /ELF.*executable.*not stripped/    { print "--strip-all      \"" $1 "\"" }
  431 			$0 ~ /ELF.*shared object.*not stripped/ { print "--strip-unneeded \"" $1 "\"" }
  432 			$2 == "current ar archive"              { print "--strip-debug    \"" $1 "\"" }
  433 			' \
  434 		| xargs -r -L1 -P$N strip
  435 }
  436 
  437 compress_manpages() {
  438 	local FILE DIR TARGET
  439 
  440 	cd $PKG
  441 
  442 	find . -type f -path "*/man/man*/*" | while read FILE; do
  443 		if [ "$FILE" = "${FILE%%.gz}" ]; then
  444 			gzip -9 "$FILE"
  445 		fi
  446 	done
  447 
  448 	find . -type l -path "*/man/man*/*" | while read FILE; do
  449 		TARGET=`readlink -n "$FILE"`
  450 		TARGET="${TARGET##*/}"
  451 		TARGET="${TARGET%%.gz}.gz"
  452 		rm -f "$FILE"
  453 		FILE="${FILE%%.gz}.gz"
  454 		DIR=`dirname "$FILE"`
  455 
  456 		if [ -e "$DIR/$TARGET" ]; then
  457 			ln -sf "$TARGET" "$FILE"
  458 		fi
  459 	done
  460 }
  461 
  462 check_footprint() {
  463 	local FILE="$PKGMK_WORK_DIR/.tmp"
  464 
  465 	cd $PKGMK_ROOT
  466 
  467 	if [ -f $TARGET ]; then
  468 		make_footprint > $FILE.footprint
  469 		if [ -f $PKGMK_FOOTPRINT ]; then
  470 			sort -k 3 $PKGMK_FOOTPRINT > $FILE.footprint.orig
  471 			diff -w -t -U 0 $FILE.footprint.orig $FILE.footprint | \
  472 				sed '/^@@/d' | \
  473 				sed '/^+++/d' | \
  474 				sed '/^---/d' | \
  475 				sed 's/^+/NEW       /g' | \
  476 				sed 's/^-/MISSING   /g' > $FILE.footprint.diff
  477 			if [ -s $FILE.footprint.diff ]; then
  478 				if [ "$PKGMK_IGNORE_NEW" = "yes" ] && \
  479 				   [ -z "$(egrep -l ^MISSING $FILE.footprint.diff)" ] ; then
  480 					info "New files found:"
  481 				else
  482 					error "Footprint mismatch found:"
  483 					BUILD_SUCCESSFUL="no"
  484 				fi
  485 				cat $FILE.footprint.diff >&2
  486 			fi
  487 		else
  488 			warning "Footprint not found, creating new."
  489 			mv $FILE.footprint $PKGMK_FOOTPRINT
  490 		fi
  491 	else
  492 		error "Package '$TARGET' was not found."
  493 		BUILD_SUCCESSFUL="no"
  494 	fi
  495 }
  496 
  497 make_work_dir() {
  498 	PKG="$PKGMK_WORK_DIR/pkg"
  499 	SRC="$PKGMK_WORK_DIR/src"
  500 	umask 022
  501 
  502 	cd $PKGMK_ROOT
  503 	remove_work_dir
  504 	mkdir -p $SRC $PKG
  505 
  506 	if [ "$PKGMK_IGNORE_SIGNATURE" = "no" ] || [ "$PKGMK_CHECK_SIGNATURE" = "yes" ]; then
  507 		test -f $PKGMK_SIGNATURE && cp $PKGMK_SIGNATURE $PKGMK_WORK_DIR
  508 		if check_signature && test ! -f $PKGMK_MD5SUM
  509 		then
  510 			return 0
  511 		fi
  512 	fi
  513 	if [ "$PKGMK_IGNORE_MD5SUM" = "no" ]; then
  514 		check_md5sum
  515 	fi
  516 }
  517 
  518 remove_work_dir() {
  519 	rm -rf $PKGMK_WORK_DIR
  520 }
  521 
  522 
  523 build_package() {
  524 	local BUILD_SUCCESSFUL="no"
  525 	local COMPRESSION
  526 
  527 	check_file "$TARGET"
  528 	make_work_dir
  529 
  530 	if [ "$UID" != "0" ]; then
  531 		warning "Packages should be built as root."
  532 	fi
  533 
  534 	info "Building '$TARGET'."
  535 
  536 	unpack_source
  537 
  538 	cd $SRC
  539 	(set -e -x ; build)
  540 
  541 	if [ $? = 0 ]; then
  542 		if [ "$PKGMK_NO_STRIP" = "no" ]; then
  543 			strip_files
  544 		fi
  545 
  546 		compress_manpages
  547 
  548 		cd $PKG
  549 		info "Build result:"
  550 
  551 		case $PKGMK_COMPRESSION_MODE in
  552 			gz)  COMPRESSION="-z" ;;
  553 			xz)  COMPRESSION="-J" ;;
  554 			lz)  COMPRESSION="--lzip" ;;
  555 		esac
  556 		bsdtar -c $COMPRESSION -f $TARGET *  &&  bsdtar -t -v -f $TARGET
  557 
  558 		if [ $? = 0 ]; then
  559 			BUILD_SUCCESSFUL="yes"
  560 
  561 			if [ "$PKGMK_IGNORE_FOOTPRINT" = "yes" ]; then
  562 				warning "Footprint ignored."
  563 			else
  564 				check_footprint
  565 			fi
  566 		fi
  567 	fi
  568 
  569 	if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  570 		remove_work_dir
  571 	fi
  572 
  573 	if [ "$BUILD_SUCCESSFUL" = "yes" ]; then
  574 		info "Building '$TARGET' succeeded."
  575 	else
  576 		if [ -f $TARGET ]; then
  577 			touch -r $PKGMK_ROOT/$PKGMK_PKGFILE $TARGET &> /dev/null
  578 		fi
  579 		error "Building '$TARGET' failed."
  580 		exit 1
  581 	fi
  582 }
  583 
  584 install_package() {
  585 	local COMMAND
  586 
  587 	info "Installing '$TARGET'."
  588 
  589 	if [ "$PKGMK_INSTALL" = "install" ]; then
  590 		COMMAND="pkgadd $TARGET"
  591 	else
  592 		COMMAND="pkgadd -u $TARGET"
  593 	fi
  594 
  595 	cd $PKGMK_ROOT
  596 	echo "$COMMAND"
  597 	$COMMAND
  598 
  599 	if [ $? = 0 ]; then
  600 		info "Installing '$TARGET' succeeded."
  601 	else
  602 		error "Installing '$TARGET' failed."
  603 		exit 1
  604 	fi
  605 }
  606 
  607 recursive() {
  608 	local ARGS FILE DIR
  609 
  610 	ARGS=`echo "$@" | sed -e "s/--recursive//g" -e "s/-r//g"`
  611 
  612 	for FILE in `find $PKGMK_ROOT -name $PKGMK_PKGFILE | sort`; do
  613 		DIR="`dirname $FILE`/"
  614 		if [ -d $DIR ]; then
  615 			info "Entering directory '$DIR'."
  616 			(cd $DIR && $PKGMK_COMMAND $ARGS)
  617 			info "Leaving directory '$DIR'."
  618 		fi
  619 	done
  620 }
  621 
  622 clean() {
  623 	local FILE LOCAL_FILENAME
  624 
  625 	if [ -f $TARGET ]; then
  626 		info "Removing $TARGET"
  627 		rm -f $TARGET
  628 	fi
  629 
  630 	for FILE in ${source[@]}; do
  631 		LOCAL_FILENAME=`get_filename $FILE`
  632 		if [ -e $LOCAL_FILENAME ] && [ "$LOCAL_FILENAME" != "$FILE" ]; then
  633 			info "Removing $LOCAL_FILENAME"
  634 			rm -f $LOCAL_FILENAME
  635 		fi
  636 	done
  637 }
  638 
  639 update_footprint() {
  640 	if [ ! -f $TARGET ]; then
  641 		error "Unable to update footprint. File '$TARGET' not found."
  642 		exit 1
  643 	fi
  644 
  645 	check_file "$PKGMK_FOOTPRINT"
  646 	make_footprint > $PKGMK_FOOTPRINT
  647 	touch $TARGET
  648 
  649 	info "Footprint updated."
  650 }
  651 
  652 build_needed() {
  653 	local FILE RESULT
  654 
  655 	RESULT="yes"
  656 	if [ -f $TARGET ]; then
  657 		RESULT="no"
  658 		for FILE in $PKGMK_PKGFILE ${source[@]}; do
  659 			FILE=`get_filename $FILE`
  660 			if [ -e $FILE ] && [ ! $TARGET -nt $FILE ]; then
  661 				RESULT="yes"
  662 				break
  663 			fi
  664 		done
  665 	fi
  666 
  667 	echo $RESULT
  668 }
  669 
  670 interrupted() {
  671 	echo ""
  672 	error "Interrupted."
  673 
  674 	if [ "$PKGMK_KEEP_WORK" = "no" ]; then
  675 		rm -rf $PKGMK_WORK_DIR
  676 	fi
  677 
  678 	exit 1
  679 }
  680 
  681 print_help() {
  682 	echo "usage: `basename $PKGMK_COMMAND` [options]"
  683 	echo "options:"
  684 	echo "  -i,   --install             build and install package"
  685 	echo "  -u,   --upgrade             build and install package (as upgrade)"
  686 	echo "  -r,   --recursive           search for and build packages recursively"
  687 	echo "  -d,   --download            download missing source file(s)"
  688 	echo "  -do,  --download-only       do not build, only download missing source file(s)"
  689 	echo "  -eo,  --extract-only        do not build, only extract source file(s)"
  690 	echo "  -utd, --up-to-date          do not build, only check if package is up to date"
  691 	echo "  -uf,  --update-footprint    update footprint using result from last build"
  692 	echo "  -if,  --ignore-footprint    build package without checking footprint"
  693 	echo "  -in,  --ignore-new          build package, ignore new files in a footprint missmatch"
  694 	echo "  -um,  --update-md5sum       update md5sum"
  695 	echo "  -im,  --ignore-md5sum       build package without checking md5sum"
  696 	echo "  -cm,  --check-md5sum        do not build, only check md5sum"
  697 	echo "  -us,  --update-signature    update signature including sha256 checksums"
  698 	echo "  -cs,  --check-signature     check the validity of the port files"
  699 	echo "  -is,  --ignore-signature    build package without checking the signature"
  700 	echo "  -rs,  --refresh-signature   create new signature and keep existing sha256 checksums"
  701 	echo "  -sk,  --secret-key <file>   use <file> to sign the port"
  702 	echo "  -pk,  --public-key <file>   check the port signature using public-key <file>"
  703 	echo "  -ns,  --no-strip            do not strip executable binaries or libraries"
  704 	echo "  -f,   --force               build package even if it appears to be up to date"
  705 	echo "  -c,   --clean               remove package and downloaded files"
  706 	echo "  -kw,  --keep-work           keep temporary working directory"
  707 	echo "  -cf,  --config-file <file>  use alternative configuration file"
  708 	echo "  -v,   --version             print version and exit"
  709 	echo "  -h,   --help                print help and exit"
  710 }
  711 
  712 parse_options() {
  713 	while [ "$1" ]; do
  714 		case $1 in
  715 			-i|--install)
  716 				PKGMK_INSTALL="install" ;;
  717 			-u|--upgrade)
  718 				PKGMK_INSTALL="upgrade" ;;
  719 			-r|--recursive)
  720 				PKGMK_RECURSIVE="yes" ;;
  721 			-d|--download)
  722 				PKGMK_DOWNLOAD="yes" ;;
  723 			-do|--download-only)
  724 				PKGMK_DOWNLOAD="yes"
  725 				PKGMK_DOWNLOAD_ONLY="yes" ;;
  726 			-eo|--extract-only)
  727 				PKGMK_EXTRACT_ONLY="yes" ;;
  728 			-utd|--up-to-date)
  729 				PKGMK_UP_TO_DATE="yes" ;;
  730 			-uf|--update-footprint)
  731 				PKGMK_UPDATE_FOOTPRINT="yes" ;;
  732 			-if|--ignore-footprint)
  733 				PKGMK_IGNORE_FOOTPRINT="yes" ;;
  734 			-in|--ignore-new)
  735 				PKGMK_IGNORE_NEW="yes" ;;
  736 			-um|--update-md5sum)
  737 				PKGMK_UPDATE_MD5SUM="yes" ;;
  738 			-im|--ignore-md5sum)
  739 				PKGMK_IGNORE_MD5SUM="yes" ;;
  740 			-cm|--check-md5sum)
  741 				PKGMK_CHECK_MD5SUM="yes" ;;
  742 			-us|--update-signature)
  743 				PKGMK_UPDATE_SIGNATURE="yes" ;;
  744 			-cs|--check-signature)
  745 				PKGMK_CHECK_SIGNATURE="yes" ;;
  746 			-is|--ignore-signature)
  747 				PKGMK_IGNORE_SIGNATURE="yes" ;;
  748 			-rs|--referesh-signature)
  749 				PKGMK_REFRESH_SIGNATURE="yes" ;;
  750 			-ns|--no-strip)
  751 				PKGMK_NO_STRIP="yes" ;;
  752 			-f|--force)
  753 				PKGMK_FORCE="yes" ;;
  754 			-c|--clean)
  755 				PKGMK_CLEAN="yes" ;;
  756 			-kw|--keep-work)
  757 				PKGMK_KEEP_WORK="yes" ;;
  758 			-pk|--public-key)
  759 				if [ ! "$2" ]; then
  760 					echo "`basename $PKGMK_COMMAND`: option $1 requires an argument"
  761 					exit 1
  762 				fi
  763 				PKGMK_PUBLICKEY="$2"
  764 				shift ;;
  765 			-sk|--secret-key)
  766 				if [ ! "$2" ]; then
  767 					echo "`basename $PKGMK_COMMAND`: option $1 requires an argument"
  768 					exit 1
  769 				fi
  770 				PKGMK_PRIVATEKEY="$2"
  771 				shift ;;
  772 			-cf|--config-file)
  773 				if [ ! "$2" ]; then
  774 					echo "`basename $PKGMK_COMMAND`: option $1 requires an argument"
  775 					exit 1
  776 				fi
  777 				PKGMK_CONFFILE="$2"
  778 				shift ;;
  779 			-v|--version)
  780 				echo "`basename $PKGMK_COMMAND` (pkgutils) $PKGMK_VERSION"
  781 				exit 0 ;;
  782 			-h|--help)
  783 				print_help
  784 				exit 0 ;;
  785 			*)
  786 				echo "`basename $PKGMK_COMMAND`: invalid option $1"
  787 				exit 1 ;;
  788 		esac
  789 		shift
  790 	done
  791 }
  792 
  793 main() {
  794 	# multilib
  795 	PKGMK_ARCH=64
  796 	if [ -f ".32bit" ]; then
  797 		PKGMK_ARCH=32
  798 	fi
  799 
  800 	local FILE TARGET
  801 
  802 	parse_options "$@"
  803 
  804 	if [ "$PKGMK_RECURSIVE" = "yes" ]; then
  805 		recursive "$@"
  806 		exit 0
  807 	fi
  808 
  809 	for FILE in $PKGMK_PKGFILE $PKGMK_CONFFILE; do
  810 		if [ ! -f $FILE ]; then
  811 			error "File '$FILE' not found."
  812 			exit 1
  813 		fi
  814 		. $FILE
  815 	done
  816 
  817 	check_directory "$PKGMK_SOURCE_DIR"
  818 	check_directory "$PKGMK_PACKAGE_DIR"
  819 	check_directory "`dirname $PKGMK_WORK_DIR`"
  820 
  821 	check_pkgfile
  822 
  823 	case $PKGMK_COMPRESSION_MODE in
  824 		gz|xz|lz)
  825 			TARGET="$PKGMK_PACKAGE_DIR/$name#$version-$release.pkg.tar.$PKGMK_COMPRESSION_MODE"
  826 			;;
  827 		*)
  828 			error "Compression mode '$PKGMK_COMPRESSION_MODE' not supported"
  829 			exit 1
  830 			;;
  831 	esac
  832 
  833 	if [ "$PKGMK_CLEAN" = "yes" ]; then
  834 		clean
  835 		exit 0
  836 	fi
  837 
  838 	if [ "$PKGMK_UPDATE_FOOTPRINT" = "yes" ]; then
  839 		update_footprint
  840 		exit 0
  841 	fi
  842 
  843 	if [ "$PKGMK_UPDATE_MD5SUM" = "yes" ]; then
  844 		download_source
  845 		check_file "$PKGMK_MD5SUM"
  846 		make_md5sum > $PKGMK_MD5SUM
  847 		info "Md5sum updated."
  848 		exit 0
  849 	fi
  850 
  851 	if [ "$PKGMK_UPDATE_SIGNATURE" = "yes" ]; then
  852 		download_source
  853 		check_file "$PKGMK_SIGNATURE"
  854 		make_signature
  855 		info "Signature updated."
  856 		exit 0
  857 	fi
  858 
  859 	if [ "$PKGMK_REFRESH_SIGNATURE" = "yes" ]; then
  860 		check_file "$PKGMK_SIGNATURE"
  861 		refresh_signature
  862 		info "Signature refreshed."
  863 		exit 0
  864 	fi
  865 
  866 	if [ "$PKGMK_DOWNLOAD_ONLY" = "yes" ]; then
  867 		download_source
  868 		exit 0
  869 	fi
  870 
  871 	if [ "$PKGMK_EXTRACT_ONLY" = "yes" ]; then
  872 		download_source
  873 		make_work_dir
  874 		info "Extracting sources of package '$name-$version'."
  875 		unpack_source
  876 		exit 0
  877 	fi
  878 
  879 	if [ "$PKGMK_UP_TO_DATE" = "yes" ]; then
  880 		if [ "`build_needed`" = "yes" ]; then
  881 			info "Package '$TARGET' is not up to date."
  882 		else
  883 			info "Package '$TARGET' is up to date."
  884 		fi
  885 		exit 0
  886 	fi
  887 
  888 	if [ "`build_needed`" = "no" ] && [ "$PKGMK_FORCE" = "no" ] && [ "$PKGMK_CHECK_MD5SUM" = "no" ] && [ "$PKGMK_CHECK_SIGNATURE" = "no" ]; then
  889 		info "Package '$TARGET' is up to date."
  890 	else
  891 		download_source
  892 		build_package
  893 	fi
  894 
  895 	if [ "$PKGMK_INSTALL" != "no" ]; then
  896 		install_package
  897 	fi
  898 
  899 	exit 0
  900 }
  901 
  902 trap "interrupted" SIGHUP SIGINT SIGQUIT SIGTERM
  903 
  904 export LC_ALL=POSIX
  905 
  906 readonly PKGMK_VERSION="#VERSION#"
  907 readonly PKGMK_COMMAND="$0"
  908 readonly PKGMK_ROOT="$PWD"
  909 
  910 PKGMK_CONFFILE="/etc/pkgmk.conf"
  911 PKGMK_PKGFILE="Pkgfile"
  912 PKGMK_FOOTPRINT=".footprint"
  913 PKGMK_MD5SUM=".md5sum"
  914 PKGMK_NOSTRIP=".nostrip"
  915 PKGMK_SIGNATURE=".signature"
  916 
  917 PKGMK_SOURCE_MIRRORS=()
  918 PKGMK_SOURCE_DIR="$PWD"
  919 PKGMK_PACKAGE_DIR="$PWD"
  920 PKGMK_WORK_DIR="$PWD/work"
  921 
  922 PKGMK_COMPRESSION_MODE="gz"
  923 
  924 PKGMK_INSTALL="no"
  925 PKGMK_RECURSIVE="no"
  926 PKGMK_DOWNLOAD="no"
  927 PKGMK_DOWNLOAD_ONLY="no"
  928 PKGMK_EXTRACT_ONLY="no"
  929 PKGMK_UP_TO_DATE="no"
  930 PKGMK_UPDATE_FOOTPRINT="no"
  931 PKGMK_IGNORE_FOOTPRINT="no"
  932 PKGMK_IGNORE_NEW="no"
  933 PKGMK_FORCE="no"
  934 PKGMK_KEEP_WORK="no"
  935 PKGMK_UPDATE_MD5SUM="no"
  936 PKGMK_IGNORE_MD5SUM="no"
  937 PKGMK_CHECK_MD5SUM="no"
  938 PKGMK_UPDATE_SIGNATURE="no"
  939 PKGMK_IGNORE_SIGNATURE="no"
  940 PKGMK_CHECK_SIGNATURE="no"
  941 PKGMK_REFRESH_SIGNATURE="no"
  942 PKGMK_PRIVATEKEY=""
  943 PKGMK_NO_STRIP="no"
  944 PKGMK_CLEAN="no"
  945 
  946 main "$@"
  947 
  948 # End of file

Generated by cgit