123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- #!/usr/bin/env bash
- # ipkg-build -- construct a .ipk from a directory
- # Waldemar Brodkorb <wbx@openadk.org>
- # use cpio instead of tar for uid/gid handling
- # Carl Worth <cworth@east.isi.edu>
- # based on a script by Steve Redler IV <steve@sr-tech.com>
- set -e
- version=1.0
- ipkg_extract_value() {
- sed -e "s/^[^:]*:[[:space:]]*//"
- }
- required_field() {
- field=$1
- value=`grep "^$field:" < $CONTROL/control | ipkg_extract_value`
- if [ -z "$value" ]; then
- echo "*** Error: $CONTROL/control is missing field $field" >&2
- return 1
- fi
- echo $value
- return 0
- }
- disallowed_field() {
- field=$1
- value=`grep "^$field:" < $CONTROL/control | ipkg_extract_value`
- if [ -n "$value" ]; then
- echo "*** Error: $CONTROL/control contains disallowed field $field" >&2
- return 1
- fi
- echo $value
- return 0
- }
- pkg_appears_sane() {
- local pkg_dir=$1
- local owd=$PWD
- cd $pkg_dir
- PKG_ERROR=0
- tilde_files=`find . -name '*~'`
- if [ -n "$tilde_files" ]; then
- if [ "$noclean" = "1" ]; then
- echo "*** Warning: The following files have names ending in '~'.
- You probably want to remove them: " >&2
- ls -ld $tilde_files
- echo >&2
- else
- echo "*** Removing the following files: $tilde_files"
- rm -f "$tilde_files"
- fi
- fi
- if [ ! -f "$CONTROL/control" ]; then
- echo "*** Error: Control file $pkg_dir/$CONTROL/control not found." >&2
- cd $owd
- return 1
- fi
- pkg=`required_field Package`
- [ "$?" -ne 0 ] && PKG_ERROR=1
- version=`required_field Version | sed 's/Version://; s/^.://g;'`
- [ "$?" -ne 0 ] && PKG_ERROR=1
- arch=`required_field Architecture`
- [ "$?" -ne 0 ] && PKG_ERROR=1
- required_field Maintainer >/dev/null
- [ "$?" -ne 0 ] && PKG_ERROR=1
- required_field Description >/dev/null
- [ "$?" -ne 0 ] && PKG_ERROR=1
- section=`required_field Section`
- [ "$?" -ne 0 ] && PKG_ERROR=1
- if [ -z "$section" ]; then
- echo "The Section field should have one of the following values:" >&2
- echo "admin, base, boot, comm, editors, extras, games, graphics, kernel, lang, libs, misc, net, scm, text, web, x11" >&2
- fi
- priority=`required_field Priority`
- [ "$?" -ne 0 ] && PKG_ERROR=1
- if [ -z "$priority" ]; then
- echo "The Priority field should have one of the following values:" >&2
- echo "required, important, standard, optional, extra." >&2
- echo "If you don't know which priority value you should be using, then use \`optional'" >&2
- fi
- source=`required_field Source`
- [ "$?" -ne 0 ] && PKG_ERROR=1
- if [ -z "$source" ]; then
- echo "The Source field contain the URL's or filenames of the source code and any patches"
- echo "used to build this package. Either gnu-style tarballs or Debian source packages "
- echo "are acceptable. Relative filenames may be used if they are distributed in the same"
- echo "directory as the .ipk file."
- fi
- disallowed_filename=`disallowed_field Filename`
- [ "$?" -ne 0 ] && PKG_ERROR=1
- if echo $pkg | grep '[^a-z0-9.+-]'; then
- echo "*** Error: Package name $pkg contains illegal characters, (other than [a-z0-9.+-])" >&2
- PKG_ERROR=1;
- fi
- local bad_fields=`sed -ne 's/^\([^[:space:]][^:[:space:]]\+[[:space:]]\+\)[^:].*/\1/p' < $CONTROL/control | sed -e 's/\\n//'`
- if [ -n "$bad_fields" ]; then
- bad_fields=`echo $bad_fields`
- echo "*** Error: The following fields in $CONTROL/control are missing a ':'" >&2
- echo " $bad_fields" >&2
- echo "ipkg-build: This may be due to a missing initial space for a multi-line field value" >&2
- PKG_ERROR=1
- fi
- for script in $CONTROL/preinst $CONTROL/postinst $CONTROL/prerm $CONTROL/postrm; do
- if [ -f $script -a ! -x $script ]; then
- if [ "$noclean" = "1" ]; then
- echo "*** Error: package script $script is not executable" >&2
- PKG_ERROR=1
- else
- chmod a+x $script
- fi
- fi
- done
- if [ -f $CONTROL/conffiles ]; then
- for cf in `cat $CONTROL/conffiles`; do
- if [ ! -f ./$cf ]; then
- echo "*** Error: $CONTROL/conffiles mentions conffile $cf which does not exist" >&2
- PKG_ERROR=1
- fi
- done
- fi
- cd $owd
- return $PKG_ERROR
- }
- ###
- # ipkg-build "main"
- ###
- noclean=0
- usage="Usage: $0 [-C] <pkg_directory> [<destination_directory>]"
- while getopts ":h:v" opt; do
- case $opt in
- 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/DEBIAN ] && CONTROL=DEBIAN
- [ -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
- ( cd $pkg_dir && find . | grep -v $CONTROL | \
- sort | cpio --quiet -o -Hustar | gzip -n9 > $tmp_dir/data.tar.gz )
- ( cd $pkg_dir/$CONTROL && find . | \
- sort | cpio --quiet -o -Hustar | gzip -n9 > $tmp_dir/control.tar.gz )
- echo "2.0" > $tmp_dir/debian-binary
- pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk
- rm -f $pkg_file
- ( cd $tmp_dir && tar -czf $pkg_file ./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"
|