Changeset View
Changeset View
Standalone View
Standalone View
tools/tools/nanobsd/fill_pkg.sh
#!/bin/sh | #!/bin/sh | ||||
# | # | ||||
# Copyright (c) 2014 Lev Serebryakov. | |||||
# Copyright (c) 2009 Poul-Henning Kamp. | # Copyright (c) 2009 Poul-Henning Kamp. | ||||
# All rights reserved. | # All rights reserved. | ||||
# | # | ||||
# Redistribution and use in source and binary forms, with or without | # Redistribution and use in source and binary forms, with or without | ||||
# modification, are permitted provided that the following conditions | # modification, are permitted provided that the following conditions | ||||
# are met: | # are met: | ||||
# 1. Redistributions of source code must retain the above copyright | # 1. Redistributions of source code must retain the above copyright | ||||
# notice, this list of conditions and the following disclaimer. | # notice, this list of conditions and the following disclaimer. | ||||
Show All 11 Lines | |||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
# SUCH DAMAGE. | # SUCH DAMAGE. | ||||
# | # | ||||
# $FreeBSD$ | # $FreeBSD$ | ||||
# | # | ||||
# Usage: | # Usage: | ||||
# $0 PACKAGE_DUMP NANO_PACKAGE_DIR /usr/ports/foo/bar ... | # $0 PACKAGE_DUMP NANO_PACKAGE_DIR /usr/ports/foo/bar [package.txz]... | ||||
# | # | ||||
# Will symlink the packages listed, including their runtime dependencies, | # Will symlink the packages listed, including their runtime dependencies, | ||||
# from the PACKAGE_DUMP to the NANO_PACKAGE_DIR. | # from the PACKAGE_DUMP to the NANO_PACKAGE_DIR. | ||||
# | # | ||||
NANO_PKG_DUMP=$1 | : ${PORTSDIR:=/usr/ports} | ||||
shift; | |||||
if [ ! -d $NANO_PKG_DUMP ] ; then | |||||
echo "$NANO_PKG_DUMP not a directory" 1>&2 | |||||
exit 1 | |||||
fi | |||||
NANO_PACKAGE_DIR=$1 | usage () { | ||||
shift; | echo "Usage: $0 [-v] package-dump-dir nano-package-dir port-dir-or-pkg ..." 1>&2 | ||||
exit 2 | |||||
} | |||||
msg () { | |||||
local l | |||||
l=$1 ; shift | |||||
[ "$l" -le "$VERBOSE" ] && echo $* | |||||
} | |||||
ports_recurse() ( | ports_recurse() ( | ||||
of=$1 | local outputfile dumpdir type fullpath pkgname p | ||||
shift | outputfile=$1 ; shift | ||||
for d | dumpdir=$1 ; shift | ||||
do | for p do | ||||
if [ ! -d $d ] ; then | if [ -d "$p" -a -f "$p/Makefile" ] ; then | ||||
echo "Missing port $d" 1>&2 | msg 3 "$p: full path to port" | ||||
pkgname=`cd "$p" && make -V pkgname` | |||||
type=port | |||||
fullpath=$p | |||||
elif [ -d "${PORTSDIR}/$p" -a -f "${PORTSDIR}/$p/Makefile" ] ; then | |||||
msg 3 "$p: path to port relative to ${PORTSDIR}}" | |||||
pkgname=`cd "${PORTSDIR}/$p" && make -V pkgname` | |||||
type=port | |||||
fullpath=${PORTSDIR}/$p | |||||
elif [ "${p%.txz}" != "$p" -a -f "$p" ] && pkg info -F "$p" > /dev/null 2>&1 ; then | |||||
msg 3 "$p: full package file name" | |||||
pkgname=`basename "$p" | sed 's/\.txz$//I'` | |||||
type=pkg | |||||
fullpath=$p | |||||
elif [ "${p%.txz}" != "$p" -a -f "$dumpdir/$p" ] && pkg info -F "$dumpdir/$p" > /dev/null 2>&1 ; then | |||||
msg 3 "$p: package file name relative to $dumpdir" | |||||
pkgname=`basename "$p" | sed 's/\.txz$//I'` | |||||
type=pkg | |||||
fullpath=$dumpdir/$p | |||||
elif [ -f "$dumpdir/$p.txz" ] && pkg info -F "$dumpdir/$p.txz" > /dev/null 2>&1 ; then | |||||
msg 3 "$p: package name relative to $dumpdir" | |||||
pkgname=`basename "$p"` | |||||
type=pkg | |||||
fullpath=$dumpdir/$p.txz | |||||
else | |||||
echo "Missing port or package $p" 1>&2 | |||||
exit 2 | exit 2 | ||||
fi | fi | ||||
if grep -q "^$d\$" $of ; then | if grep -q "^$pkgname\$" "$outputfile" ; then | ||||
msg 3 "$pkgname was added already" | |||||
true | true | ||||
else | elif [ "$type" = "port" ] ; then | ||||
( | ( | ||||
cd $d | cd "$fullpath" | ||||
rd=`make -V RUN_DEPENDS ${PORTS_OPTS}` | rd=`make -V RUN_DEPENDS ${PORTS_OPTS}` | ||||
ld=`make -V LIB_DEPENDS ${PORTS_OPTS}` | ld=`make -V LIB_DEPENDS ${PORTS_OPTS}` | ||||
for x in $rd $ld | for dep in $rd $ld ; do | ||||
do | arg=`echo $dep | sed 's/^[^:]*:\([^:]*\).*$/\1/'` | ||||
ports_recurse $of `echo $x | | msg 2 "Check $arg as requirement for port $pkgname" | ||||
sed 's/^[^:]*:\([^:]*\).*$/\1/'` | ports_recurse "$outputfile" "$dumpdir" "$arg" | ||||
done | done | ||||
) | ) | ||||
echo $d >> $of | msg 1 "Add $pkgname" | ||||
echo "$pkgname" >> "$outputfile" | |||||
else | |||||
dir=`dirname "$p"` # Get directory from SPECIFIED path, not from full path | |||||
if [ "$dir" = "." ] ; then | |||||
dir="" | |||||
else | |||||
dir=${dir}/ | |||||
fi | fi | ||||
deps=`pkg info -dF "$fullpath" | grep -v "$pkgname:"` | |||||
for dep in $deps ; do | |||||
arg=`echo $dep | sed -e "s|^|$dir|" -e 's/$/.txz/'` | |||||
msg 2 "Check $arg as requirement for package $pkgname" | |||||
ports_recurse "$outputfile" "$dumpdir" "$arg" | |||||
done | done | ||||
msg 1 "Add $pkgname" | |||||
echo "$pkgname" >> "$outputfile" | |||||
fi | |||||
done | |||||
) | ) | ||||
rm -rf $NANO_PACKAGE_DIR | VERBOSE=0 | ||||
mkdir -p $NANO_PACKAGE_DIR | |||||
PL=$NANO_PACKAGE_DIR/_list | while getopts v opt ; do | ||||
true > $PL | case "$opt" in | ||||
for i | v) VERBOSE=$(($VERBOSE + 1)) ;; | ||||
do | [?]) usage ;; | ||||
ports_recurse `pwd`/$PL $i | esac | ||||
done | done | ||||
shift $(( ${OPTIND} - 1 )) | |||||
for i in `cat $PL` | if [ "$#" -lt 3 ] ; then | ||||
do | usage | ||||
p=`(cd $i && make -V PKGNAME)` | fi | ||||
if [ -f $NANO_PKG_DUMP/$p.t[bx]z ] ; then | |||||
ln -s $NANO_PKG_DUMP/$p.t[bx]z $NANO_PACKAGE_DIR | NANO_PKG_DUMP=`realpath $1` | ||||
shift; | |||||
if [ ! -d "$NANO_PKG_DUMP" ] ; then | |||||
echo "$NANO_PKG_DUMP is not a directory" 1>&2 | |||||
usage | |||||
fi | |||||
NANO_PKG_DIR=`realpath $1` | |||||
shift; | |||||
if [ ! -d "$NANO_PKG_DIR" ] ; then | |||||
echo "$NANO_PKG_DIR is not a directory" 1>&2 | |||||
usage | |||||
fi | |||||
# Cleanup | |||||
rm -rf "$NANO_PKG_DIR/"* | |||||
PL=$NANO_PKG_DIR/_list | |||||
true > "$PL" | |||||
for p do | |||||
ports_recurse "$PL" "$NANO_PKG_DUMP" "$p" | |||||
done | |||||
for i in `cat "$PL"` ; do | |||||
if [ -f "$NANO_PKG_DUMP/$i.txz" ] ; then | |||||
ln -s "$NANO_PKG_DUMP/$i.txz" "$NANO_PKG_DIR" | |||||
else | else | ||||
echo "Package $p misssing in $NANO_PKG_DUMP" 1>&2 | echo "Package $i misssing in $NANO_PKG_DUMP" 1>&2 | ||||
exit 1 | exit 1 | ||||
fi | fi | ||||
done | done | ||||
rm -f $PL | rm -f "$PL" | ||||
exit 0 | exit 0 |