From 716ca530e1c4515d8683c9d5be3d56b301758b66 Mon Sep 17 00:00:00 2001 From: James <> Date: Wed, 4 Nov 2015 11:49:21 +0000 Subject: trunk-47381 --- scripts/ipkg-build | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100755 scripts/ipkg-build (limited to 'scripts/ipkg-build') diff --git a/scripts/ipkg-build b/scripts/ipkg-build new file mode 100755 index 0000000..73cd87c --- /dev/null +++ b/scripts/ipkg-build @@ -0,0 +1,160 @@ +#!/bin/sh + +# ipkg-build -- construct a .ipk from a directory +# Carl Worth +# based on a script by Steve Redler IV, steve@sr-tech.com 5-21-2001 +# 2003-04-25 rea@sr.unh.edu +# Updated to work on Familiar Pre0.7rc1, with busybox tar. +# Note it Requires: binutils-ar (since the busybox ar can't create) +# For UID debugging it needs a better "find". +set -e + +version=1.0 +FIND="$(which find)" +FIND="${FIND:-$(which gfind)}" +TAR="${TAR:-$(which tar)}" +SVN="$(which svn)" +GIT="$(which git)" +export GZIP="-n" + +# look up date of last commit +if [ -d "$TOPDIR/.git" ]; then + TIMESTAMP=$(cd $TOPDIR; $GIT log -1 -s --format=%ci) +elif [ -d "$TOPDIR/.svn" ]; then + TIMESTAMP=$($SVN info "$TOPDIR" | sed -n "s/^Last Changed Date: \(.*\)/\1/p") +else + TIMESTAMP=$(date) +fi + +ipkg_extract_value() { + sed -e "s/^[^:]*:[[:space:]]*//" +} + +required_field() { + field=$1 + + grep "^$field:" < $CONTROL/control | ipkg_extract_value +} + +pkg_appears_sane() { + local pkg_dir=$1 + + local owd=$PWD + cd $pkg_dir + + PKG_ERROR=0 + pkg=`required_field Package` + version=`required_field Version | sed 's/Version://; s/^.://g;'` + arch=`required_field Architecture` + + if echo $pkg | grep '[^a-zA-Z0-9_.+-]'; then + echo "*** Error: Package name $name contains illegal characters, (other than [a-z0-9.+-])" >&2 + PKG_ERROR=1; + fi + + if [ -f $CONTROL/conffiles ]; then + rm -f $CONTROL/conffiles.resolved + + for cf in `$FIND $(sed -e "s!^/!$pkg_dir/!" $CONTROL/conffiles) -type f`; do + echo "${cf#$pkg_dir}" >> $CONTROL/conffiles.resolved + done + + rm $CONTROL/conffiles + mv $CONTROL/conffiles.resolved $CONTROL/conffiles + chmod 0644 $CONTROL/conffiles + fi + + cd $owd + return $PKG_ERROR +} + +### +# ipkg-build "main" +### +ogargs="" +noclean=0 +usage="Usage: $0 [-c] [-C] [-o owner] [-g group] []" +while getopts "cg:ho:v" opt; do + case $opt in + o ) owner=$OPTARG + ogargs="--owner=$owner" + ;; + g ) group=$OPTARG + ogargs="$ogargs --group=$group" + ;; + c ) ;; + C ) noclean=1;; + v ) echo $version + exit 0 + ;; + h ) echo $usage >&2 ;; + \? ) echo $usage >&2 + esac +done + + +shift $(($OPTIND - 1)) + +# continue on to process additional arguments + +case $# in +1) + dest_dir=$PWD + ;; +2) + dest_dir=$2 + if [ "$dest_dir" = "." -o "$dest_dir" = "./" ] ; then + dest_dir=$PWD + fi + ;; +*) + echo $usage >&2 + exit 1 + ;; +esac + +pkg_dir=$1 + +if [ ! -d $pkg_dir ]; then + echo "*** Error: Directory $pkg_dir does not exist" >&2 + exit 1 +fi + +# CONTROL is second so that it takes precedence +CONTROL= +[ -d $pkg_dir/CONTROL ] && CONTROL=CONTROL +if [ -z "$CONTROL" ]; then + echo "*** Error: Directory $pkg_dir has no CONTROL subdirectory." >&2 + exit 1 +fi + +if ! pkg_appears_sane $pkg_dir; then + echo >&2 + echo "ipkg-build: Please fix the above errors and try again." >&2 + exit 1 +fi + +tmp_dir=$dest_dir/IPKG_BUILD.$$ +mkdir $tmp_dir + +echo $CONTROL > $tmp_dir/tarX +# Preserve permissions (-p) when creating data.tar.gz as non-root user +( cd $pkg_dir && $TAR $ogargs -X $tmp_dir/tarX --format=gnu --sort=name -czpf $tmp_dir/data.tar.gz --mtime="$TIMESTAMP" . ) + +installed_size=`stat -c "%s" $tmp_dir/data.tar.gz` +sed -i -e "s/^Installed-Size: .*/Installed-Size: $installed_size/" \ + $pkg_dir/$CONTROL/control + +( cd $pkg_dir/$CONTROL && $TAR $ogargs --format=gnu --sort=name -czf $tmp_dir/control.tar.gz --mtime="$TIMESTAMP" . ) +rm $tmp_dir/tarX + +echo "2.0" > $tmp_dir/debian-binary + +pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk +rm -f $pkg_file +( cd $tmp_dir && $TAR $ogargs --format=gnu --sort=name -zcf $pkg_file --mtime="$TIMESTAMP" ./debian-binary ./data.tar.gz ./control.tar.gz ) + +rm $tmp_dir/debian-binary $tmp_dir/data.tar.gz $tmp_dir/control.tar.gz +rmdir $tmp_dir + +echo "Packaged contents of $pkg_dir into $pkg_file" -- cgit v1.2.3