From 3d79fb7036e5c42fbe00689f78c222fe66a22a44 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Fri, 8 May 2009 13:33:34 +0000 Subject: use .in files for scripts --- Makefile | 47 +++- abuild | 830 --------------------------------------------------------- abuild.in | 849 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ buildrepo | 133 ---------- buildrepo.in | 133 ++++++++++ devbuild | 61 ----- devbuild.in | 61 +++++ mkalpine | 40 --- mkalpine.in | 40 +++ 9 files changed, 1122 insertions(+), 1072 deletions(-) delete mode 100755 abuild create mode 100755 abuild.in delete mode 100755 buildrepo create mode 100755 buildrepo.in delete mode 100755 devbuild create mode 100755 devbuild.in delete mode 100755 mkalpine create mode 100755 mkalpine.in diff --git a/Makefile b/Makefile index 9e89c77..b284d47 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,50 @@ -PACKAGE=abuild -VERSION:=$(shell awk -F= '$$1 == "abuild_ver" {print $$2}' abuild) -USR_BIN_FILES=abuild devbuild mkalpine buildrepo -SAMPLES=sample.APKBUILD sample.initd sample.confd sample.pre-install \ - sample.post-install -DISTFILES=$(USR_BIN_FILES) $(SAMPLES) Makefile abuild.conf initramfs-init \ - +PACKAGE := abuild +VERSION := 1.14 prefix ?= /usr sysconfdir ?= /etc datadir ?= $(prefix)/share/$(PACKAGE) +USR_BIN_FILES := abuild devbuild mkalpine buildrepo +SAMPLES := sample.APKBUILD sample.initd sample.confd \ + sample.pre-install sample.post-install + +SCRIPTS := $(USR_BIN_FILES) +SCRIPT_SOURCES := $(addsuffix .in,$(SCRIPTS)) + +DISTFILES=$(SCRIPT_SOURCES) $(SAMPLES) Makefile abuild.conf + +GIT_REV := $(shell test -d .git && git describe || echo exported) +ifneq ($(GIT_REV), exported) +FULL_VERSION := $(patsubst $(PACKAGE)-%,%,$(GIT_REV)) +FULL_VERSION := $(patsubst v%,%,$(FULL_VERSION)) +else +FULL_VERSION := $(VERSION) +endif + +SED := sed +TAR := tar + +SED_REPLACE := -e 's:@VERSION@:$(FULL_VERSION):g' \ + -e 's:@prefix@:$(prefix):g' \ + -e 's:@sysconfdir@:$(sysconfdir):g' \ + -e 's:@datadir@:$(datadir):g' + +.SUFFIXES: .sh.in .in +.sh.in.sh: + ${SED} ${SED_REPLACE} ${SED_EXTRA} $< > $@ + +.in: + ${SED} ${SED_REPLACE} ${SED_EXTRA} $< > $@ + + + + P=$(PACKAGE)-$(VERSION) +all: $(SCRIPTS) + help: @echo "$(P) makefile" @echo "usage: make install [ DESTDIR= ]" @@ -29,7 +61,6 @@ install: $(USR_BIN_FILES) $(SAMPLES) abuild.conf functions.sh fi cp $(SAMPLES) $(DESTDIR)/$(prefix)/share/abuild cp functions.sh $(DESTDIR)/$(datadir)/ - cp initramfs-init $(DESTDIR)/$(datadir)/ dist: $(P).tar.bz2 diff --git a/abuild b/abuild deleted file mode 100755 index 8f1e040..0000000 --- a/abuild +++ /dev/null @@ -1,830 +0,0 @@ -#!/bin/sh - -# script to build apk packages (light version og makepkg) -# Copyright (c) 2008 Natanael Copa -# -# Distributed under GPL-2 -# -# Depends on: busybox utilities, fakeroot, -# - -abuild_ver=1.14 - -startdir="$PWD" -srcdir=${srcdir:-"$startdir/src"} -pkgdirbase=${pkgdirbase:-"$startdir/pkg"} -pkgrel=0 -repo=${startdir%/*} -repo=${repo##*/} - -# defaults -SRCDEST=${SRCDEST:-$startdir} -PKGDEST=${PKGDEST:-$startdir} -BUILD_BASE="binutils gcc make patch uclibc-dev" - -SUDO=${SUDO:-"sudo"} - -default_cmds="sanitycheck builddeps clean fetch unpack rootpkg" - -# read config -ABUILD_CONF=${ABUILD_CONF:-"/etc/abuild.conf"} -[ -f "$ABUILD_CONF" ] && . "$ABUILD_CONF" - -# source functions -datadir=/usr/share/abuild - -# if abuild was not run from PATH, then look for func lib at same location -if [ -z "$FUNCLIB" ]; then - FUNCLIB="${0##/*}/functions.sh" - [ -f "$FUNCLIB" ] || FUNCLIB=$datadir/functions.sh -fi - -if ! [ -f "$FUNCLIB" ]; then - echo "$FUNCLIB: not found" >&2 - exit 1 -fi -. "$FUNCLIB" - -set_xterm_title() { - if [ "$TERM" = xterm ]; then - printf "\033]0;$1\007" >&2 - fi -} - -cleanup() { - set_xterm_title "" - if [ -z "$install_after" ] && [ -n "$uninstall_after" ]; then - $SUDO apk del $uninstall_after - fi -} - -die() { - error "$@" - cleanup - exit 1 -} - -# check if apkbuild is basicly sane -sanitycheck() { - local i - msg "Checking sanity of $APKBUILD..." - [ -z "$pkgname" ] && die "Missing pkgname in APKBUILD" - [ -z "${pkgname##* *}" ] && die "pkgname contains spaces" - [ -z "$pkgver" ] && die "Missing pkgver in APKBUILD" - [ "${pkgver##[0-9]}" == "$pkgver" ] && \ - die "pkgver does not start with a digit" - [ -z "$pkgrel" ] && warning "Missing pkgrel in APKBUILD. Using pkgrel=0" - [ -z "$pkgdesc" ] && die "Missing pkgdesc in APKBUILD" - [ -z "$url" ] && die "Missing url in APKBUILD" - [ -z "$license" ] && die "Missing license in APKBULID" - - if [ -n "$source" ]; then - for i in $source; do - md5sums_has ${i##*/} || die "${i##*/} is missing in md5sums" - case "$i" in - https://*) makedepends_has wget || die "wget must be in makedepends when source has https://" ;; - esac - done - fi - - if [ -n "$md5sums" ]; then - for i in $(echo "$md5sums" | awk '{ print $2 }'); do - source_has $i || die "$i is missing in source" - done - fi - - # common spelling errors - [ -n "$depend" ] && die "APKBUILD contains 'depend'. It should be depends" - [ -n "$makedepend" ] && die "APKBUILD contains 'makedepend'. It should be makedepends" - - grep '^# Maintainer:' $APKBUILD >/dev/null || warning "No maintainer" - return 0 -} - -md5check() { - local dummy f - if [ -z "$source" ]; then - return 0 - fi - if [ -z "$md5sums" ]; then - die "Use 'abuild checksum' to generate/update the checksum(s)" - fi - if [ "$(echo $source | wc -l)" -ne "$(echo $md5sums | wc -l)" ]; then - die "Number of md5sums does not correspond to number of sources" - fi - fetch || return 1 - msg "Checking md5sums..." - cd "$srcdir" && echo "$md5sums" | md5sum -c -} - -uri_fetch() { - local uri="$1" - local d="${s##*/}" # $(basename $s) - local opts - [ -n "$quiet" ] && opts="-q" - [ -f "$SRCDEST/$d" ] && return 0 - - - # we need GNU wget for this - case "$uri" in - https://*) opts="--no-check-certificate";; - esac - - mkdir -p "$SRCDEST" - if [ -f "$SRCDEST/$d.part" ]; then - msg "Partial download found. Trying to resume" - opts="$opts -c" - fi - msg "Fetching $uri" - wget $opts -O "$SRCDEST/$d.part" "$uri" \ - && mv "$SRCDEST/$d.part" "$SRCDEST/$d" -} - -is_remote() { - case "$1" in - http://*|ftp://*|https://*) - return 0;; - esac - return 1 -} - -fetch() { - local s - mkdir -p "$srcdir" - for s in $source; do - if is_remote "$s"; then - uri_fetch "$s" || return 1 - ln -sf "$SRCDEST/${s##*/}" "$srcdir"/ - else - ln -sf "$startdir/$s" "$srcdir/" - fi - done -} - -# unpack the sources -unpack() { - local u - md5check || return 1 - mkdir -p "$srcdir" - for u in $source; do - local s="$SRCDEST/${u##*/}" # $(basename $s) - case "$s" in - *.tar.gz|*.tgz) - msg "Unpacking $s..." - tar -C "$srcdir" -zxf "$s" || return 1;; - *.tar.bz2) - msg "Unpacking $s..." - tar -C "$srcdir" -jxf "$s" || return 1;; - *.tar.lzma) - msg "Unpacking $s..." - unlzma -c "$s" | tar -C "$srcdir" -x \ - || return 1;; - *.zip) - msg "Unpacking $s..." - unzip "$s" -d "$srcdir" || return 1;; - esac - done -} - -# cleanup source and package dir -clean() { - msg "Cleaning temporary build dirs..." - rm -rf "$srcdir" - rm -rf "$pkgdir" - local i - for i in $subpackages; do - rm -rf "$pkgdir-$(get_split_func $i)" - done -} - -# cleanup fetched sources -cleancache() { - local s - for s in $source; do - if is_remote "$s"; then - msg "Cleaning downloaded ${s##*/}..." - rm -f "$SRCDEST/${s##*/}" - fi - done -} - -cleanpkg() { - local i - msg "Cleaning built packages..." - for i in $pkgname $subpackages; do - local p="$i-$pkgver-r$pkgrel" - rm -f "$PKGDEST/$p.apk" "$PKGDEST/$p.src.tar.gz" - done -} - -# clean all packages except current -cleanoldpkg() { - local i j - msg "Cleaning all packages except $pkgver-r$pkgrel..." - for i in $pkgname $subpackages; do - for j in "$PKGDEST"/${i%:*}-[0-9]*.apk; do - [ "$j" != "$PKGDEST/${i%:*}-$pkgver-r$pkgrel.apk" ] \ - && rm -f "$j" - done - done - return 0 -} - -runpart() { - local part=$1 - [ -n "$DEBUG" ] && msg "$part" - $part || die "$part failed" -} - -# override those in your build script -build() { - die "No build() function found in $APKBUILD" -} - -get_split_func() { - # get the 'func' from "sub-pkg:func" - local func=${1##*:} - - # get 'func' from "sub-pkg-func" if there was no :func - [ "$func" = "$1" ] && func=${func##*-} - echo $func -} - -subpkg() { - if [ -z "$subpackages" ]; then - return 0 - fi - local i - cd "$startdir" - for i in $subpackages; do - local func=$(get_split_func $i) - # call abuild recursively, setting subpkg{dir,name} - msg "Running split function $func..." - subpkgdir="$pkgdirbase/${i%:*}" subpkgname="${i%:*}" \ - $0 $func package || return 1 - done -} - -package_apk() { - local name=${subpkgname:-$pkgname} - [ -z "${name##* *}" ] && die "package name contains spaces" - local dir=${subpkgdir:-$pkgdir} - local pkg="$name-$pkgver-r$pkgrel.apk" - local sub - - [ ! -d "$dir" ] && die "Missing $dir" - cd "$dir" - msg "Creating ${subpkgname:+sub}package $pkg..." - local builddate=$(date -u "+%s") - local size=$(du -sk | awk '{print $1 * 1024}') - - echo "# Generated by $(basename $0) $abuild_ver" >.PKGINFO - if [ -n "$FAKEROOTKEY" ]; then - echo "# using $(fakeroot -v)" >> .PKGINFO - fi - echo "# $(date -u)" >> .PKGINFO - cat >> .PKGINFO </dev/null ; then - msg "Script found. busybox added as a dependency for $pkg" - deps="$deps busybox" - break - fi - done - fi - - for i in $license; do - echo "license = $i" >>.PKGINFO - done - for i in $replaces; do - echo "replaces = $i" >>.PKGINFO - done - for i in $deps; do - echo "depend = $i" >>.PKGINFO - done - for i in $conflicts; do - echo "conflict = $i" >>.PKGINFO - done - for i in $provides; do - echo "provides = $i" >>.PKGINFO - done - for i in $backup; do - echo "backup = $i" >>.PKGINFO - done - - local metafiles=".PKGINFO" - for i in $install; do - script=${i#$name} - case "$script" in - .install) - warning "Deprecated .install script found." - script=.INSTALL - ;; - .pre-install|.post-install|.pre-upgrade|.post-upgrade|.pre-deinstall|.post-deinstall) - msg "Adding $script" - ;; - *) error "$script: Invalid install script" - return 1 - ;; - esac - cp "$srcdir/$i" "$dir/$script" || return 1 - chmod +x "$dir/$script" - metafiles="$metafiles $script" - done - - set * - [ "$1" = '*' ] && set -- - ( cd "$dir" && tar -zcf "$PKGDEST/$pkg" $metafiles $@ ) -} - -package() { - options_has "!strip" || stripbin - package_apk -} - -# predefined splitfunc doc -default_doc() { - depends="$depends_doc" - install="$install_doc" - local i - for i in doc man info html sgml licenses gtk-doc; do - if [ -d "$pkgdir/usr/share/$i" ]; then - mkdir -p "$subpkgdir/usr/share" - mv "$pkgdir/usr/share/$i" "$subpkgdir/usr/share/" - fi - done - - rm -f "$subpkgdir/usr/share/info/dir" - -# # compress info and man pages -# find "$subpkgdir/usr/share" \( -name '*.info' -o -name '*.info-[1-9]' \ -# -o -name '*.[1-9]' \) -exec gzip {} \; - - # remove if empty, ignore error (not empty) - rmdir "$pkgdir/usr/share" "$pkgdir/usr" 2>/dev/null - -# [ -d "$subpkgdir/usr/share/man" ] && depends="man" - return 0 -} - -doc() { - default_doc -} - -# predefined splitfunc mod -default_mod() { - depends="$kernel $depends_mod" - install="$install_mod" - for i in firmware modules; do - if [ -d "$pkgdir/lib/$i" ]; then - rm -rf "$subpkgdir/lib" - mkdir -p "$subpkgdir/lib" - mv "$pkgdir/lib/$i" "$subpkgdir/lib" - fi - done -} - -mod() { - default_mod -} - -# predefined splitfunc dev -default_dev() { - depends="$pkgname $depends_dev" - install="$install_dev" - cd "$pkgdir" || return 0 - for i in usr/include usr/lib/pkgconfig usr/share/aclocal\ - usr/share/gettext usr/bin/*-config \ - $(find -name include -type d) \ - $(find usr/ -name '*.[acho]' -o -name '*.la' \ - 2>/dev/null); do - if [ -e "$pkgdir/$i" ] || [ -L "$pkgdir/$i" ]; then - d="$subpkgdir/${i%/*}" # dirname $i - mkdir -p "$d" - mv "$pkgdir/$i" "$d" - rmdir "$pkgdir/${i%/*}" 2>/dev/null - fi - done - return 0 -} - -dev() { - default_dev -} - -# build and package in fakeroot -rootpkg() { - cd "$startdir" - msg "Entering fakeroot..." - fakeroot $0 build subpkg package -} - -srcpkg() { - local p="$pkgname-$pkgver-$pkgrel" - local prefix="${startdir##*/}" - local i files="$prefix/APKBUILD" - for i in $source; do - files="$files $prefix/${i##*/}" - done - mkdir -p "$PKGDEST" - msg "Creating source package $p.src.tar.gz..." - (cd .. && tar -zcf "$PKGDEST/$p.src.tar.gz" $files) -} - -# check if package is up to date -up2date() { - local pkg="$PKGDEST/$pkgname-$pkgver-r$pkgrel.apk" - local i s - cd "$startdir" - for i in $pkgname $subpackages; do - [ -f "$PKGDEST/$pkgname-$pkgver-r$pkgrel.apk" ] || return 1 - done - [ -n "$keep" ] && return 0 - - for i in $source APKBUILD; do - local s - if is_remote "$i"; then - s="$SRCDEST/${i##*/}" # $(basename $i) - else - s="$startdir/${i##*/}" - fi - if [ "$s" -nt "$pkg" ]; then - return 1 - fi - done - return 0 -} - -# source all APKBUILDs and output: -# 1) origin of package -# 2) all dependencies -# the output is i in a format easy parseable for awk -depparse_aports() { - # lets run this in a subshell since we source all APKBUILD here - ( - aportsdir=$(realpath ${APKBUILD%/APKBUILD}/../..) - for i in $aportsdir/*/*/APKBUILD; do - pkgname= - subpackages= - depends= - makedepends= - . $i - dir=${i%/APKBUILD} - deps= - # filter out conflicts from deps - for j in $depends $makedepends; do - case "$j" in - !*) continue;; - esac - deps="$deps $j" - done - for j in $pkgname $subpackages; do - echo "o ${j%%:*} $dir" - set -- $deps - echo -n "d ${j%%:*} $1" - shift - while [ $# -gt 0 ]; do - echo -n ",$1" - shift - done - echo - done - done - ) -} - -deptrace() { - local deps="$@" - [ -z "$deps" ] && deps="$BUILD_BASE $depends $makedepends" - ( depparse_aports - if [ -z "$upgrade" ]; then - # list installed pkgs and prefix with 'i ' - apk info -q | sort | sed 's/^/i /' - fi - ) | awk -v pkgs="$deps" ' - - function depgraph(pkg, a, i) { - if (visited[pkg]) - return 0; - visited[pkg] = 1; - split(deps[pkg], a, ","); - for (i in a) - depgraph(a[i]); - print pkg ":" origin[pkg]; - - } - - $1 == "i" { visited[$2] = 1 } - $1 == "o" { origin[$2] = $3 } - $1 == "d" { deps[$2] = $3 } - END { - split(pkgs, pkgarray); - for (i in pkgarray) - depgraph(pkgarray[i]); - } - ' -} - -# build and install dependencies -builddeps() { - local deps alldeps pkg i dir ver missing - msg "Building dependencies..." - deps="$BUILD_BASE $makedepends" - - # add depends unless it is a subpackage - for i in $depends; do - subpackages_has $i || deps="$deps $i" - done - - # find which deps are missing - for i in $deps; do - if [ "${i#\!}" != "$i" ]; then - apk info -e ${i#\!} \ - && die "Conflicting package ${i#\!} is installed." - elif ! apk info -e $i; then - if [ -z "$install_deps" ] && [ -z "$recursive" ]; then - die "Missing dependency $i. Use -r to autoinstall or -R to build" - fi - missing="$missing $i" - fi - done - - [ -z "$missing" ] && return 0 - - if [ -n "$install_deps" ] && $SUDO apk add $missing; then - uninstall_after="$missing $uninstall_after" - return 0 - fi - - [ -z "$recursive" ] && return 1 - - for i in $(deptrace $missing); do - # i = pkg:dir - local dir=${i#*:} - local pkg=${i%:*} - msg "Entering $dir" - cd "$dir" || return 1 - $0 -k -i $pkg || return 1 - uninstall_after="$pkg $uninstall_after" - done -} - -# replace the md5sums in the APKBUILD -checksum() { - local s files - [ -z "$source" ] && return 0 - fetch - msg "Updating the md5sums in APKBUILD..." - for s in $source; do - files="$files ${s##*/}" - done - md5sums="$(cd "$srcdir" && md5sum $files)" || die "md5sum failed" - sed -i -e '/^md5sums="/,/"\$/d; /^md5sums=''/,/''\$/d' "$APKBUILD" - echo "md5sums=\"$md5sums\"" >>"$APKBUILD" -} - -stripbin() { - local bin - cd "${subpkgdir:-$pkgdir}" || return 1 - msg "Stripping binaries" - find . -type f 2>/dev/null | while read bin; do - local opt= - case "$(file -biz "$bin")" in - */x-sharedlib*|*/x-archive*) - strip --strip-debug "$bin";; - */x-executable*) - strip "$bin";; - esac - done - return 0 -} - -# simply list target apks -listpkg() { - local i - for i in $pkgname $subpackages; do - echo "${i%:*}-$pkgver-r$pkgrel.apk" - done -} - -source_has() { - local i - for i in $source; do - [ "$1" = "${i##*/}" ] && return 0 - done - return 1 -} - -subpackages_has() { - local i - for i in $subpackages; do - [ "$1" = "${i%:*}" ] && return 0 - done - return 1 -} - -list_has() { - local needle="$1" - local i - shift - for i in $@; do - [ "$needle" = "$i" ] && return 0 - [ "$needle" = "!$i" ] && return 1 - done - return 1 -} - -options_has() { - list_has "$1" $options -} - -depends_has() { - list_has "$1" $depends -} - -makedepends_has() { - list_has "$1" $makedepends -} - -md5sums_has() { - list_has "$1" $md5sums -} - -# install package after build -post_add() { - local pkgf="$PKGDEST/$1-$pkgver-r$pkgrel.apk" - local deps i - if ! subpackages_has $1 && [ "$1" != "$pkgname" ]; then - die "$1 is not built by this APKBUILD" - fi - # recursively install dependencies that are provided by this APKBUILD - deps=$(apk index "$pkgf" 2>/dev/null | awk -F: '$1=="D" { print $2 }') - for i in $deps; do - if subpackages_has $i || [ "$i" = "$pkgname" ]; then - post_add $i || return 1 - fi - done - $SUDO apk add -u "$pkgf" || die "Failed to install $1" -} - -# create new aport from templates -newaport() { - local pn=${newname%-[0-9]*} - local pv - if [ "$pn" != "$newname" ]; then - pv=${newname#$pn-} - fi - if [ -e "$pn"/APKBUILD ]; then - error "$pn/APKBUILD already exist" - return 1 - fi - mkdir -p "$pn" - cd "$pn" - sed -e '1,/^\#*$/d' \ - -e "s/^\(# Contributor: \).*/\1$PACKAGER/" \ - -e "s/^\(# Maintainer: \).*/\1$PACKAGER/" \ - -e "s/^pkgname=.*/pkgname=$pn/" \ - -e "s/^pkgver=.*/pkgver=$pv/" \ - "$datadir"/sample.APKBUILD > APKBUILD || return 1 - #-e '1,/^\#$/d' \ - if [ -n "$cpinitd" ]; then - cp "$datadir"/sample.initd $pn.initd - cp "$datadir"/sample.confd $pn.confd - cp "$datadir"/sample.pre-install $pn.pre-install - cp "$datadir"/sample.post-install $pn.post-install - sed -i -e "s/^install=.*/install=\"\$pkgname.pre-install \$pkgname.post-install\"/" \ - -e "s/^source=\"\(.*\)\"/source=\"\1\n\t$pn.initd\n\t$pn.confd\n\t\$install\n\t\"/" \ - APKBUILD - - fi -} - -installdeps() { - sudo apk add $depends $makedepends -} - -uninstalldeps (){ - sudo apk del $depends $makedepends -} - -usage() { - echo "$(basename $0) $abuild_ver" - echo "usage: ${0##*/} [options] [-i PKG] [-P REPODEST] [-p PKGDEST]" - echo " [-s SRCDEST] [cmd] ..." - echo " ${0##*/} [-c] -n PKGNAME[-PKGVER]" - echo "Options:" - echo " -f Force specified cmd, even if they are already done" - echo " -h Show this help" - echo " -i Install PKG after successul build" - echo " -k Keep built packages, even if APKBUILD or sources are newer" - echo " -p Set package destination directory" - echo " -P Set PKGDEST to REPODEST/, where repo is the parents dir name" - echo " -q Quiet" - echo " -r Install missing dependencies from system repository (using sudo)" - echo " -R Recursively build and install missing dependencies (using sudo)" - echo " -s Set source package destination directory" - echo " -u Recursively build and upgrade all dependencies (using sudo)" - echo "" - echo " -n Create a new APKBUILD in a directory named PKGNAME" - echo " -c Copy a sample init.d, conf.d and install script to new directory" - echo "" - echo "Commands:" - echo " checksum Generate checksum to be included in APKBUILD" - echo " fetch Fetch sources to \$SRCDEST and verify checksums" - echo " sanitycheck Basic sanity check of APKBUILD" - echo " md5check Check md5sums" - echo " unpack Unpack sources to \$srcdir" - echo " build Compile and install package into \$pkgdir" - echo " listpkg List target packages" - echo " package Create package in \$PKGDEST" - echo " rootpkg Run '$0 build package' as fakeroot" - echo " clean Remove temp build and install dirs" - echo " cleanoldpkg Remove binary packages except current version" - echo " cleanpkg Remove already built binary and source package" - echo " cleancache Remove downloaded files from \$SRCDEST" - echo " srcpkg Make a source package" - echo " up2date Compare target and sources dates" - echo " installdeps Install packages listed in makedepends and depends" - echo " uninstalldeps Uninstall packages listed in makedepends and depends" - echo "" - exit 0 -} - -APKBUILD="${APKBUILD:-./APKBUILD}" -unset force -unset recursive -while getopts "cfhi:kin:p:P:qrRs:u" opt; do - case $opt in - 'c') cpinitd=1;; - 'f') force=1;; - 'h') usage;; - 'i') install_after="$install_after $OPTARG";; - 'k') keep=1;; - 'n') newname=$OPTARG;; - 'p') PKGDEST=$OPTARG;; - 'P') REPODEST=$OPTARG;; - 'q') quiet=1;; - 'r') install_deps=1;; - 'R') recursive=1;; - 's') SRCDEST=$OPTARG;; - 'u') upgrade=1 - recursive=1;; - esac -done -shift $(( $OPTIND - 1 )) - -# If REPODEST is set then it will override the PKGDEST -if [ -n "$REPODEST" ]; then - PKGDEST="$REPODEST/$repo" -fi - -# source the buildfile -if [ -z "$newname" ]; then - [ -f "$APKBUILD" ] || die "Could not find $APKBUILD (PWD=$PWD)" - . "$APKBUILD" -fi - -# If we are handling a sub package then reset subpackages and install -if [ -n "$subpkgname" ]; then - subpackages= - install= -fi -pkgdir="${pkgdirbase}/$pkgname" - -trap 'die "Aborted by user"' INT -set_xterm_title "abuild: $pkgname" - -if [ -z "$1" ] && [ -n "$newname" ]; then - set "newaport" -fi - -if [ -z "$1" ]; then - if up2date && [ -z "$force" ]; then - msg "Package is up to date" - else - set $default_cmds - fi -fi - -while [ $# -gt 0 ]; do - runpart $1 - shift -done - -for i in $install_after; do - post_add $i -done - -cleanup - diff --git a/abuild.in b/abuild.in new file mode 100755 index 0000000..1c58ee1 --- /dev/null +++ b/abuild.in @@ -0,0 +1,849 @@ +#!/bin/sh + +# script to build apk packages (light version og makepkg) +# Copyright (c) 2008 Natanael Copa +# +# Distributed under GPL-2 +# +# Depends on: busybox utilities, fakeroot, +# + +abuild_ver=@VERSION@ +sysconfdir=@sysconfdir@ + +startdir="$PWD" +srcdir=${srcdir:-"$startdir/src"} +pkgdirbase=${pkgdirbase:-"$startdir/pkg"} +pkgrel=0 +repo=${startdir%/*} +repo=${repo##*/} + +# defaults +SRCDEST=${SRCDEST:-$startdir} +PKGDEST=${PKGDEST:-$startdir} +BUILD_BASE="binutils gcc make patch uclibc-dev" + +SUDO=${SUDO:-"sudo"} + +default_cmds="sanitycheck builddeps clean fetch unpack rootpkg" + +# read config +ABUILD_CONF=${ABUILD_CONF:-"$sysconfdir/abuild.conf"} +[ -f "$ABUILD_CONF" ] && . "$ABUILD_CONF" + +# source functions +datadir=/usr/share/abuild + +#colors +if [ -n "$USE_COLORS" ]; then + NORMAL="\033[1;0m" + STRONG="\033[1;1m" + RED="\033[1;31m" + GREEN="\033[1;32m" + YELLOW="\033[1;33m" + BLUE="\033[1;34m" +fi + + +# functions +msg() { + local prompt="$GREEN>>>${NORMAL}" + local fake="${FAKEROOTKEY:+${BLUE}*${NORMAL}}" + local name="${STRONG}${subpkgname:-$pkgname}${NORMAL}" + [ -z "$quiet" ] && printf "${prompt} ${name}${fake}: $@\n" >&2 +} + +warning() { + local prompt="${YELLOW}>>> WARNING:${NORMAL}" + local fake="${FAKEROOTKEY:+${BLUE}*${NORMAL}}" + local name="${STRONG}${subpkgname:-$pkgname}${NORMAL}" + printf "${prompt} ${name}${fake}: $@\n" >&2 +} + +error() { + local prompt="${RED}>>> ERROR:${NORMAL}" + local fake="${FAKEROOTKEY:+${BLUE}*${NORMAL}}" + local name="${STRONG}${subpkgname:-$pkgname}${NORMAL}" + printf "${prompt} ${name}${fake}: $@\n" >&2 +} + + +set_xterm_title() { + if [ "$TERM" = xterm ]; then + printf "\033]0;$1\007" >&2 + fi +} + +cleanup() { + set_xterm_title "" + if [ -z "$install_after" ] && [ -n "$uninstall_after" ]; then + $SUDO apk del $uninstall_after + fi +} + +die() { + error "$@" + cleanup + exit 1 +} + +# check if apkbuild is basicly sane +sanitycheck() { + local i + msg "Checking sanity of $APKBUILD..." + [ -z "$pkgname" ] && die "Missing pkgname in APKBUILD" + [ -z "${pkgname##* *}" ] && die "pkgname contains spaces" + [ -z "$pkgver" ] && die "Missing pkgver in APKBUILD" + [ "${pkgver##[0-9]}" == "$pkgver" ] && \ + die "pkgver does not start with a digit" + [ -z "$pkgrel" ] && warning "Missing pkgrel in APKBUILD. Using pkgrel=0" + [ -z "$pkgdesc" ] && die "Missing pkgdesc in APKBUILD" + [ -z "$url" ] && die "Missing url in APKBUILD" + [ -z "$license" ] && die "Missing license in APKBULID" + + if [ -n "$source" ]; then + for i in $source; do + md5sums_has ${i##*/} || die "${i##*/} is missing in md5sums" + case "$i" in + https://*) makedepends_has wget || die "wget must be in makedepends when source has https://" ;; + esac + done + fi + + if [ -n "$md5sums" ]; then + for i in $(echo "$md5sums" | awk '{ print $2 }'); do + source_has $i || die "$i is missing in source" + done + fi + + # common spelling errors + [ -n "$depend" ] && die "APKBUILD contains 'depend'. It should be depends" + [ -n "$makedepend" ] && die "APKBUILD contains 'makedepend'. It should be makedepends" + + grep '^# Maintainer:' $APKBUILD >/dev/null || warning "No maintainer" + return 0 +} + +md5check() { + local dummy f + if [ -z "$source" ]; then + return 0 + fi + if [ -z "$md5sums" ]; then + die "Use 'abuild checksum' to generate/update the checksum(s)" + fi + if [ "$(echo $source | wc -l)" -ne "$(echo $md5sums | wc -l)" ]; then + die "Number of md5sums does not correspond to number of sources" + fi + fetch || return 1 + msg "Checking md5sums..." + cd "$srcdir" && echo "$md5sums" | md5sum -c +} + +uri_fetch() { + local uri="$1" + local d="${s##*/}" # $(basename $s) + local opts + [ -n "$quiet" ] && opts="-q" + [ -f "$SRCDEST/$d" ] && return 0 + + + # we need GNU wget for this + case "$uri" in + https://*) opts="--no-check-certificate";; + esac + + mkdir -p "$SRCDEST" + if [ -f "$SRCDEST/$d.part" ]; then + msg "Partial download found. Trying to resume" + opts="$opts -c" + fi + msg "Fetching $uri" + wget $opts -O "$SRCDEST/$d.part" "$uri" \ + && mv "$SRCDEST/$d.part" "$SRCDEST/$d" +} + +is_remote() { + case "$1" in + http://*|ftp://*|https://*) + return 0;; + esac + return 1 +} + +fetch() { + local s + mkdir -p "$srcdir" + for s in $source; do + if is_remote "$s"; then + uri_fetch "$s" || return 1 + ln -sf "$SRCDEST/${s##*/}" "$srcdir"/ + else + ln -sf "$startdir/$s" "$srcdir/" + fi + done +} + +# unpack the sources +unpack() { + local u + md5check || return 1 + mkdir -p "$srcdir" + for u in $source; do + local s="$SRCDEST/${u##*/}" # $(basename $s) + case "$s" in + *.tar.gz|*.tgz) + msg "Unpacking $s..." + tar -C "$srcdir" -zxf "$s" || return 1;; + *.tar.bz2) + msg "Unpacking $s..." + tar -C "$srcdir" -jxf "$s" || return 1;; + *.tar.lzma) + msg "Unpacking $s..." + unlzma -c "$s" | tar -C "$srcdir" -x \ + || return 1;; + *.zip) + msg "Unpacking $s..." + unzip "$s" -d "$srcdir" || return 1;; + esac + done +} + +# cleanup source and package dir +clean() { + msg "Cleaning temporary build dirs..." + rm -rf "$srcdir" + rm -rf "$pkgdirbase" +} + +# cleanup fetched sources +cleancache() { + local s + for s in $source; do + if is_remote "$s"; then + msg "Cleaning downloaded ${s##*/}..." + rm -f "$SRCDEST/${s##*/}" + fi + done +} + +cleanpkg() { + local i + msg "Cleaning built packages..." + for i in $pkgname $subpackages; do + local p="$i-$pkgver-r$pkgrel" + rm -f "$PKGDEST/$p.apk" "$PKGDEST/$p.src.tar.gz" + done +} + +# clean all packages except current +cleanoldpkg() { + local i j + msg "Cleaning all packages except $pkgver-r$pkgrel..." + for i in $pkgname $subpackages; do + for j in "$PKGDEST"/${i%:*}-[0-9]*.apk; do + [ "$j" != "$PKGDEST/${i%:*}-$pkgver-r$pkgrel.apk" ] \ + && rm -f "$j" + done + done + return 0 +} + +runpart() { + local part=$1 + [ -n "$DEBUG" ] && msg "$part" + $part || die "$part failed" +} + +# override those in your build script +build() { + die "No build() function found in $APKBUILD" +} + +get_split_func() { + # get the 'func' from "sub-pkg:func" + local func=${1##*:} + + # get 'func' from "sub-pkg-func" if there was no :func + [ "$func" = "$1" ] && func=${func##*-} + echo $func +} + +subpkg() { + if [ -z "$subpackages" ]; then + return 0 + fi + local i + cd "$startdir" + for i in $subpackages; do + local func=$(get_split_func $i) + # call abuild recursively, setting subpkg{dir,name} + msg "Running split function $func..." + subpkgdir="$pkgdirbase/${i%:*}" subpkgname="${i%:*}" \ + $0 $func package || return 1 + done +} + +package_apk() { + local name=${subpkgname:-$pkgname} + [ -z "${name##* *}" ] && die "package name contains spaces" + local dir=${subpkgdir:-$pkgdir} + local pkg="$name-$pkgver-r$pkgrel.apk" + local sub + + [ ! -d "$dir" ] && die "Missing $dir" + cd "$dir" + msg "Creating ${subpkgname:+sub}package $pkg..." + local builddate=$(date -u "+%s") + local size=$(du -sk | awk '{print $1 * 1024}') + + echo "# Generated by $(basename $0) $abuild_ver" >.PKGINFO + if [ -n "$FAKEROOTKEY" ]; then + echo "# using $(fakeroot -v)" >> .PKGINFO + fi + echo "# $(date -u)" >> .PKGINFO + cat >> .PKGINFO </dev/null ; then + msg "Script found. busybox added as a dependency for $pkg" + deps="$deps busybox" + break + fi + done + fi + + for i in $license; do + echo "license = $i" >>.PKGINFO + done + for i in $replaces; do + echo "replaces = $i" >>.PKGINFO + done + for i in $deps; do + echo "depend = $i" >>.PKGINFO + done + for i in $conflicts; do + echo "conflict = $i" >>.PKGINFO + done + for i in $provides; do + echo "provides = $i" >>.PKGINFO + done + for i in $backup; do + echo "backup = $i" >>.PKGINFO + done + + local metafiles=".PKGINFO" + for i in $install; do + script=${i#$name} + case "$script" in + .install) + warning "Deprecated .install script found." + script=.INSTALL + ;; + .pre-install|.post-install|.pre-upgrade|.post-upgrade|.pre-deinstall|.post-deinstall) + msg "Adding $script" + ;; + *) error "$script: Invalid install script" + return 1 + ;; + esac + cp "$srcdir/$i" "$dir/$script" || return 1 + chmod +x "$dir/$script" + metafiles="$metafiles $script" + done + + set * + [ "$1" = '*' ] && set -- + ( cd "$dir" && tar -zcf "$PKGDEST/$pkg" $metafiles $@ ) +} + +package() { + options_has "!strip" || stripbin + package_apk +} + +# predefined splitfunc doc +default_doc() { + depends="$depends_doc" + install="$install_doc" + local i + for i in doc man info html sgml licenses gtk-doc; do + if [ -d "$pkgdir/usr/share/$i" ]; then + mkdir -p "$subpkgdir/usr/share" + mv "$pkgdir/usr/share/$i" "$subpkgdir/usr/share/" + fi + done + + rm -f "$subpkgdir/usr/share/info/dir" + +# # compress info and man pages +# find "$subpkgdir/usr/share" \( -name '*.info' -o -name '*.info-[1-9]' \ +# -o -name '*.[1-9]' \) -exec gzip {} \; + + # remove if empty, ignore error (not empty) + rmdir "$pkgdir/usr/share" "$pkgdir/usr" 2>/dev/null + +# [ -d "$subpkgdir/usr/share/man" ] && depends="man" + return 0 +} + +doc() { + default_doc +} + +# predefined splitfunc mod +default_mod() { + depends="$kernel $depends_mod" + install="$install_mod" + for i in firmware modules; do + if [ -d "$pkgdir/lib/$i" ]; then + rm -rf "$subpkgdir/lib" + mkdir -p "$subpkgdir/lib" + mv "$pkgdir/lib/$i" "$subpkgdir/lib" + fi + done +} + +mod() { + default_mod +} + +# predefined splitfunc dev +default_dev() { + depends="$pkgname $depends_dev" + install="$install_dev" + cd "$pkgdir" || return 0 + for i in usr/include usr/lib/pkgconfig usr/share/aclocal\ + usr/share/gettext usr/bin/*-config \ + $(find -name include -type d) \ + $(find usr/ -name '*.[acho]' -o -name '*.la' \ + 2>/dev/null); do + if [ -e "$pkgdir/$i" ] || [ -L "$pkgdir/$i" ]; then + d="$subpkgdir/${i%/*}" # dirname $i + mkdir -p "$d" + mv "$pkgdir/$i" "$d" + rmdir "$pkgdir/${i%/*}" 2>/dev/null + fi + done + return 0 +} + +dev() { + default_dev +} + +# build and package in fakeroot +rootpkg() { + cd "$startdir" + msg "Entering fakeroot..." + fakeroot $0 build subpkg package +} + +srcpkg() { + local p="$pkgname-$pkgver-$pkgrel" + local prefix="${startdir##*/}" + local i files="$prefix/APKBUILD" + for i in $source; do + files="$files $prefix/${i##*/}" + done + mkdir -p "$PKGDEST" + msg "Creating source package $p.src.tar.gz..." + (cd .. && tar -zcf "$PKGDEST/$p.src.tar.gz" $files) +} + +# check if package is up to date +up2date() { + local pkg="$PKGDEST/$pkgname-$pkgver-r$pkgrel.apk" + local i s + cd "$startdir" + for i in $pkgname $subpackages; do + [ -f "$PKGDEST/$pkgname-$pkgver-r$pkgrel.apk" ] || return 1 + done + [ -n "$keep" ] && return 0 + + for i in $source APKBUILD; do + local s + if is_remote "$i"; then + s="$SRCDEST/${i##*/}" # $(basename $i) + else + s="$startdir/${i##*/}" + fi + if [ "$s" -nt "$pkg" ]; then + return 1 + fi + done + return 0 +} + +# source all APKBUILDs and output: +# 1) origin of package +# 2) all dependencies +# the output is i in a format easy parseable for awk +depparse_aports() { + # lets run this in a subshell since we source all APKBUILD here + ( + aportsdir=$(realpath ${APKBUILD%/APKBUILD}/../..) + for i in $aportsdir/*/*/APKBUILD; do + pkgname= + subpackages= + depends= + makedepends= + . $i + dir=${i%/APKBUILD} + deps= + # filter out conflicts from deps + for j in $depends $makedepends; do + case "$j" in + !*) continue;; + esac + deps="$deps $j" + done + for j in $pkgname $subpackages; do + echo "o ${j%%:*} $dir" + set -- $deps + echo -n "d ${j%%:*} $1" + shift + while [ $# -gt 0 ]; do + echo -n ",$1" + shift + done + echo + done + done + ) +} + +deptrace() { + local deps="$@" + [ -z "$deps" ] && deps="$BUILD_BASE $depends $makedepends" + ( depparse_aports + if [ -z "$upgrade" ]; then + # list installed pkgs and prefix with 'i ' + apk info -q | sort | sed 's/^/i /' + fi + ) | awk -v pkgs="$deps" ' + + function depgraph(pkg, a, i) { + if (visited[pkg]) + return 0; + visited[pkg] = 1; + split(deps[pkg], a, ","); + for (i in a) + depgraph(a[i]); + print pkg ":" origin[pkg]; + + } + + $1 == "i" { visited[$2] = 1 } + $1 == "o" { origin[$2] = $3 } + $1 == "d" { deps[$2] = $3 } + END { + split(pkgs, pkgarray); + for (i in pkgarray) + depgraph(pkgarray[i]); + } + ' +} + +# build and install dependencies +builddeps() { + local deps alldeps pkg i dir ver missing + msg "Building dependencies..." + deps="$BUILD_BASE $makedepends" + + # add depends unless it is a subpackage + for i in $depends; do + subpackages_has $i || deps="$deps $i" + done + + # find which deps are missing + for i in $deps; do + if [ "${i#\!}" != "$i" ]; then + apk info -e ${i#\!} \ + && die "Conflicting package ${i#\!} is installed." + elif ! apk info -e $i; then + if [ -z "$install_deps" ] && [ -z "$recursive" ]; then + die "Missing dependency $i. Use -r to autoinstall or -R to build" + fi + missing="$missing $i" + fi + done + + [ -z "$missing" ] && return 0 + + if [ -n "$install_deps" ] && $SUDO apk add $missing; then + uninstall_after="$missing $uninstall_after" + return 0 + fi + + [ -z "$recursive" ] && return 1 + + for i in $(deptrace $missing); do + # i = pkg:dir + local dir=${i#*:} + local pkg=${i%:*} + msg "Entering $dir" + cd "$dir" || return 1 + $0 -k -i $pkg || return 1 + uninstall_after="$pkg $uninstall_after" + done +} + +# replace the md5sums in the APKBUILD +checksum() { + local s files + [ -z "$source" ] && return 0 + fetch + msg "Updating the md5sums in APKBUILD..." + for s in $source; do + files="$files ${s##*/}" + done + md5sums="$(cd "$srcdir" && md5sum $files)" || die "md5sum failed" + sed -i -e '/^md5sums="/,/"\$/d; /^md5sums=''/,/''\$/d' "$APKBUILD" + echo "md5sums=\"$md5sums\"" >>"$APKBUILD" +} + +stripbin() { + local bin + cd "${subpkgdir:-$pkgdir}" || return 1 + msg "Stripping binaries" + find . -type f 2>/dev/null | while read bin; do + local opt= + case "$(file -biz "$bin")" in + */x-sharedlib*|*/x-archive*) + strip --strip-debug "$bin";; + */x-executable*) + strip "$bin";; + esac + done + return 0 +} + +# simply list target apks +listpkg() { + local i + for i in $pkgname $subpackages; do + echo "${i%:*}-$pkgver-r$pkgrel.apk" + done +} + +source_has() { + local i + for i in $source; do + [ "$1" = "${i##*/}" ] && return 0 + done + return 1 +} + +subpackages_has() { + local i + for i in $subpackages; do + [ "$1" = "${i%:*}" ] && return 0 + done + return 1 +} + +list_has() { + local needle="$1" + local i + shift + for i in $@; do + [ "$needle" = "$i" ] && return 0 + [ "$needle" = "!$i" ] && return 1 + done + return 1 +} + +options_has() { + list_has "$1" $options +} + +depends_has() { + list_has "$1" $depends +} + +makedepends_has() { + list_has "$1" $makedepends +} + +md5sums_has() { + list_has "$1" $md5sums +} + +# install package after build +post_add() { + local pkgf="$PKGDEST/$1-$pkgver-r$pkgrel.apk" + local deps i + if ! subpackages_has $1 && [ "$1" != "$pkgname" ]; then + die "$1 is not built by this APKBUILD" + fi + # recursively install dependencies that are provided by this APKBUILD + deps=$(apk index "$pkgf" 2>/dev/null | awk -F: '$1=="D" { print $2 }') + for i in $deps; do + if subpackages_has $i || [ "$i" = "$pkgname" ]; then + post_add $i || return 1 + fi + done + $SUDO apk add -u "$pkgf" || die "Failed to install $1" +} + +# create new aport from templates +newaport() { + local pn=${newname%-[0-9]*} + local pv + if [ "$pn" != "$newname" ]; then + pv=${newname#$pn-} + fi + if [ -e "$pn"/APKBUILD ]; then + error "$pn/APKBUILD already exist" + return 1 + fi + mkdir -p "$pn" + cd "$pn" + sed -e '1,/^\#*$/d' \ + -e "s/^\(# Contributor: \).*/\1$PACKAGER/" \ + -e "s/^\(# Maintainer: \).*/\1$PACKAGER/" \ + -e "s/^pkgname=.*/pkgname=$pn/" \ + -e "s/^pkgver=.*/pkgver=$pv/" \ + "$datadir"/sample.APKBUILD > APKBUILD || return 1 + #-e '1,/^\#$/d' \ + if [ -n "$cpinitd" ]; then + cp "$datadir"/sample.initd $pn.initd + cp "$datadir"/sample.confd $pn.confd + cp "$datadir"/sample.pre-install $pn.pre-install + cp "$datadir"/sample.post-install $pn.post-install + sed -i -e "s/^install=.*/install=\"\$pkgname.pre-install \$pkgname.post-install\"/" \ + -e "s/^source=\"\(.*\)\"/source=\"\1\n\t$pn.initd\n\t$pn.confd\n\t\$install\n\t\"/" \ + APKBUILD + + fi +} + +installdeps() { + sudo apk add $depends $makedepends +} + +uninstalldeps (){ + sudo apk del $depends $makedepends +} + +usage() { + echo "$(basename $0) $abuild_ver" + echo "usage: ${0##*/} [options] [-i PKG] [-P REPODEST] [-p PKGDEST]" + echo " [-s SRCDEST] [cmd] ..." + echo " ${0##*/} [-c] -n PKGNAME[-PKGVER]" + echo "Options:" + echo " -f Force specified cmd, even if they are already done" + echo " -h Show this help" + echo " -i Install PKG after successul build" + echo " -k Keep built packages, even if APKBUILD or sources are newer" + echo " -p Set package destination directory" + echo " -P Set PKGDEST to REPODEST/, where repo is the parents dir name" + echo " -q Quiet" + echo " -r Install missing dependencies from system repository (using sudo)" + echo " -R Recursively build and install missing dependencies (using sudo)" + echo " -s Set source package destination directory" + echo " -u Recursively build and upgrade all dependencies (using sudo)" + echo "" + echo " -n Create a new APKBUILD in a directory named PKGNAME" + echo " -c Copy a sample init.d, conf.d and install script to new directory" + echo "" + echo "Commands:" + echo " checksum Generate checksum to be included in APKBUILD" + echo " fetch Fetch sources to \$SRCDEST and verify checksums" + echo " sanitycheck Basic sanity check of APKBUILD" + echo " md5check Check md5sums" + echo " unpack Unpack sources to \$srcdir" + echo " build Compile and install package into \$pkgdir" + echo " listpkg List target packages" + echo " package Create package in \$PKGDEST" + echo " rootpkg Run '$0 build package' as fakeroot" + echo " clean Remove temp build and install dirs" + echo " cleanoldpkg Remove binary packages except current version" + echo " cleanpkg Remove already built binary and source package" + echo " cleancache Remove downloaded files from \$SRCDEST" + echo " srcpkg Make a source package" + echo " up2date Compare target and sources dates" + echo " installdeps Install packages listed in makedepends and depends" + echo " uninstalldeps Uninstall packages listed in makedepends and depends" + echo "" + exit 0 +} + +APKBUILD="${APKBUILD:-./APKBUILD}" +unset force +unset recursive +while getopts "cfhi:kin:p:P:qrRs:u" opt; do + case $opt in + 'c') cpinitd=1;; + 'f') force=1;; + 'h') usage;; + 'i') install_after="$install_after $OPTARG";; + 'k') keep=1;; + 'n') newname=$OPTARG;; + 'p') PKGDEST=$OPTARG;; + 'P') REPODEST=$OPTARG;; + 'q') quiet=1;; + 'r') install_deps=1;; + 'R') recursive=1;; + 's') SRCDEST=$OPTARG;; + 'u') upgrade=1 + recursive=1;; + esac +done +shift $(( $OPTIND - 1 )) + +# If REPODEST is set then it will override the PKGDEST +if [ -n "$REPODEST" ]; then + PKGDEST="$REPODEST/$repo" +fi + +# source the buildfile +if [ -z "$newname" ]; then + [ -f "$APKBUILD" ] || die "Could not find $APKBUILD (PWD=$PWD)" + . "$APKBUILD" +fi + +# If we are handling a sub package then reset subpackages and install +if [ -n "$subpkgname" ]; then + subpackages= + install= +fi +pkgdir="${pkgdirbase}/$pkgname" + +trap 'die "Aborted by user"' INT +set_xterm_title "abuild: $pkgname" + +if [ -z "$1" ] && [ -n "$newname" ]; then + set "newaport" +fi + +if [ -z "$1" ]; then + if up2date && [ -z "$force" ]; then + msg "Package is up to date" + else + set $default_cmds + fi +fi + +while [ $# -gt 0 ]; do + runpart $1 + shift +done + +for i in $install_after; do + post_add $i +done + +cleanup + diff --git a/buildrepo b/buildrepo deleted file mode 100755 index 5b4133d..0000000 --- a/buildrepo +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/sh - -program=${0##*/} - -aportsdir=${APORTSDIR:-$HOME/aports} -repodir=${REPODIR:-$HOME/packages} - - -usage() { - echo "usage: $program [-a APORTSDIR] [-d REPODIR] [-hp] [-l LOGPREFIX ]" - echo " [-r DEPREPO] REPOSITORY..." - - echo "options:" - echo " -a Set the aports base dir to APORTSDIR instead of $aportsdir" - echo " -d Set destination repository base dir to REPODIR instead of $repodir" - echo " -h Show this help and exit" - echo " -l Send build to logfile, prefixed by LOGPREFIX" - echo " -p Purge obsolete packages from REPODIR after build" - echo " -r Dependencies are found in DEPREPO" - exit 1 -} - - -listpackages() { - cd "$aportsdir/$1" - for i in */APKBUILD; do - APKBUILD=$i abuild listpkg - done -} - -build() { - local repo="$1" i indexupdate needbuild - - cd "$aportsdir/$repo" || return 1 - mkdir -p "$repodir/$repo" - if ! [ -f "$repodir/$repo"/APK_INDEX.gz ]; then - indexupdate="APK_INDEX.gz" - fi - - # first we try copy everything possible and find out which we need - # to rebuild. By doing this we might save us for rebuilding - # needed when running 'abuild -R' - for i in */APKBUILD; do - export REPODEST="$repodir" - cd "$aportsdir/$repo"/${i%/*} || return 1 - if abuild -k -q up2date 2>/dev/null; then - continue - fi - - # try link or copy the files if they are in the ports dir - pkgs=$(abuild listpkg) - if cp -p -l $pkgs "$repodir/$repo"/ 2>/dev/null \ - || cp -p $pkgs "$repodir/$repo"/ 2>/dev/null; then - echo ">>> Copying " $pkgs - else - needbuild="$needbuild $i" - fi - indexupdate="$indexupdate $i" - done - - # build the postponed packages if any - if [ -n "$needbuild" ]; then - for i in $needbuild; do - cd "$aportsdir/$repo"/${i%/*} || return 1 - abuild -k -R || return 1 - done - fi - - # kill old packages in repo - if [ -n "$dopurge" ]; then - local tmp=$(mktemp /tmp/$program-XXXXXX) - local purgefiles - cd "$repodir/$1" || return 1 - trap 'rm -f "$tmp"; exit 1' INT - ( listpackages "$1") >$tmp - purge=$(ls *.apk 2>/dev/null | grep -v -w -f $tmp) - if [ -n "$purge" ]; then - rm -f $purge - indexupdate="$indexupdate $purge" - fi - rm -f "$tmp" - fi - - # check if we have any .apk newer than our index - cd "$repodir/$repo" - if [ -z "$indexupdate" ]; then - for i in *.apk; do - if [ $i -nt APK_INDEX.gz ]; then - indexupdate=1 - break; - fi - done - fi - - # generate the repository index if needed - if [ -z "$indexupdate" ]; then - echo ">>> Index for $repo is up-to-date" - else - echo ">>> Generating Index for $repo..." - if which apk >/dev/null; then - local deps - for i in $deprepo; do - deps="--repo $repodir/$i" - done - apk $deps index *.apk | gzip -9 > APK_INDEX.gz - fi - fi -} - -while getopts "a:d:hl:pr:" opt; do - case "$opt" in - a) aportsdir=$OPTARG;; - d) repodir=$OPTARG;; - h) usage >&2;; - l) logprefix=$OPTARG;; - p) dopurge=1;; - r) deprepo="$deprepo $OPTARG";; - esac -done -shift $(($OPTIND - 1)) - -[ $# -eq 0 ] && usage >&2 - -while [ $# -gt 0 ]; do - if [ -n "$logprefix" ]; then - build $1 >$logprefix.$1.log 2>&1 || exit 1 - else - build $1 || exit 1 - fi - deprepo="$deprepo $1" - shift -done - diff --git a/buildrepo.in b/buildrepo.in new file mode 100755 index 0000000..5b4133d --- /dev/null +++ b/buildrepo.in @@ -0,0 +1,133 @@ +#!/bin/sh + +program=${0##*/} + +aportsdir=${APORTSDIR:-$HOME/aports} +repodir=${REPODIR:-$HOME/packages} + + +usage() { + echo "usage: $program [-a APORTSDIR] [-d REPODIR] [-hp] [-l LOGPREFIX ]" + echo " [-r DEPREPO] REPOSITORY..." + + echo "options:" + echo " -a Set the aports base dir to APORTSDIR instead of $aportsdir" + echo " -d Set destination repository base dir to REPODIR instead of $repodir" + echo " -h Show this help and exit" + echo " -l Send build to logfile, prefixed by LOGPREFIX" + echo " -p Purge obsolete packages from REPODIR after build" + echo " -r Dependencies are found in DEPREPO" + exit 1 +} + + +listpackages() { + cd "$aportsdir/$1" + for i in */APKBUILD; do + APKBUILD=$i abuild listpkg + done +} + +build() { + local repo="$1" i indexupdate needbuild + + cd "$aportsdir/$repo" || return 1 + mkdir -p "$repodir/$repo" + if ! [ -f "$repodir/$repo"/APK_INDEX.gz ]; then + indexupdate="APK_INDEX.gz" + fi + + # first we try copy everything possible and find out which we need + # to rebuild. By doing this we might save us for rebuilding + # needed when running 'abuild -R' + for i in */APKBUILD; do + export REPODEST="$repodir" + cd "$aportsdir/$repo"/${i%/*} || return 1 + if abuild -k -q up2date 2>/dev/null; then + continue + fi + + # try link or copy the files if they are in the ports dir + pkgs=$(abuild listpkg) + if cp -p -l $pkgs "$repodir/$repo"/ 2>/dev/null \ + || cp -p $pkgs "$repodir/$repo"/ 2>/dev/null; then + echo ">>> Copying " $pkgs + else + needbuild="$needbuild $i" + fi + indexupdate="$indexupdate $i" + done + + # build the postponed packages if any + if [ -n "$needbuild" ]; then + for i in $needbuild; do + cd "$aportsdir/$repo"/${i%/*} || return 1 + abuild -k -R || return 1 + done + fi + + # kill old packages in repo + if [ -n "$dopurge" ]; then + local tmp=$(mktemp /tmp/$program-XXXXXX) + local purgefiles + cd "$repodir/$1" || return 1 + trap 'rm -f "$tmp"; exit 1' INT + ( listpackages "$1") >$tmp + purge=$(ls *.apk 2>/dev/null | grep -v -w -f $tmp) + if [ -n "$purge" ]; then + rm -f $purge + indexupdate="$indexupdate $purge" + fi + rm -f "$tmp" + fi + + # check if we have any .apk newer than our index + cd "$repodir/$repo" + if [ -z "$indexupdate" ]; then + for i in *.apk; do + if [ $i -nt APK_INDEX.gz ]; then + indexupdate=1 + break; + fi + done + fi + + # generate the repository index if needed + if [ -z "$indexupdate" ]; then + echo ">>> Index for $repo is up-to-date" + else + echo ">>> Generating Index for $repo..." + if which apk >/dev/null; then + local deps + for i in $deprepo; do + deps="--repo $repodir/$i" + done + apk $deps index *.apk | gzip -9 > APK_INDEX.gz + fi + fi +} + +while getopts "a:d:hl:pr:" opt; do + case "$opt" in + a) aportsdir=$OPTARG;; + d) repodir=$OPTARG;; + h) usage >&2;; + l) logprefix=$OPTARG;; + p) dopurge=1;; + r) deprepo="$deprepo $OPTARG";; + esac +done +shift $(($OPTIND - 1)) + +[ $# -eq 0 ] && usage >&2 + +while [ $# -gt 0 ]; do + if [ -n "$logprefix" ]; then + build $1 >$logprefix.$1.log 2>&1 || exit 1 + else + build $1 || exit 1 + fi + deprepo="$deprepo $1" + shift +done + diff --git a/devbuild b/devbuild deleted file mode 100755 index 054d02d..0000000 --- a/devbuild +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/sh - -# This scripts will: -# 1. create a dist package for current subproject -# 2. update the APKBUILD and build the package -# 3. build the alpine iso -# -# The following is assumed from the subproject: -# * that PACKAGE and VERSION is set in Makefile or defined in a local -# devbuild.conf file -# * that 'make dist' will generate a valid dist package -# - -program=${0##*/} - -# rebuild env. Those values can be overridden in either -# /etc/devbuildrc or $HOME/.devbuildrc -DISTFILES=/var/cache/distfiles -APORTS_DIR=$HOME/aports -ALPINE_DIR=$HOME/abuild - -# for the local project. Those values can be overridden by -# a .devbuildrc in the subprojects dir -PACKAGE=$(grep '^PACKAGE' Makefile | sed 's/.*=[[:blank:]]*//') -VERSION=$(grep '^VERSION' Makefile | sed 's/.*=[[:blank:]]*//') -SUFFIX=.tar.bz2 -REPO=core - -# let user override the above defaults -for i in /etc/${program}rc $HOME/.${program}rc ./.${program}rc; do - if [ -f $i ]; then - . $i - fi -done - -# generate a new dist package -tarball=${PACKAGE}-${VERSION}${SUFFIX} -make dist || exit 1 -cp $tarball "$DISTFILES/" || exit 1 - -# update the APKBUILD, in a subshell -( - cd $APORTS_DIR/$REPO/$PACKAGE || exit 1 - . ./APKBUILD - if [ "$pkgver" = "$VERSION" ]; then - pkgrel=$(( $pkgrel + 1 )) - else - pkgrel="0" - fi - sed -i -e " s/^pkgver=.*/pkgver=$VERSION/; - s/^pkgrel=.*/pkgrel=$pkgrel/; - /^md5sums=\"/,/\"\$/d" APKBUILD || exit 1 - export SRCDEST="$DISTFILES" - abuild checksum - abuild - abuild cleanoldpkg -) || exit 1 - -# rebuild the iso -cd "$ALPINE_DIR" && fakeroot ./mkalpine - diff --git a/devbuild.in b/devbuild.in new file mode 100755 index 0000000..054d02d --- /dev/null +++ b/devbuild.in @@ -0,0 +1,61 @@ +#!/bin/sh + +# This scripts will: +# 1. create a dist package for current subproject +# 2. update the APKBUILD and build the package +# 3. build the alpine iso +# +# The following is assumed from the subproject: +# * that PACKAGE and VERSION is set in Makefile or defined in a local +# devbuild.conf file +# * that 'make dist' will generate a valid dist package +# + +program=${0##*/} + +# rebuild env. Those values can be overridden in either +# /etc/devbuildrc or $HOME/.devbuildrc +DISTFILES=/var/cache/distfiles +APORTS_DIR=$HOME/aports +ALPINE_DIR=$HOME/abuild + +# for the local project. Those values can be overridden by +# a .devbuildrc in the subprojects dir +PACKAGE=$(grep '^PACKAGE' Makefile | sed 's/.*=[[:blank:]]*//') +VERSION=$(grep '^VERSION' Makefile | sed 's/.*=[[:blank:]]*//') +SUFFIX=.tar.bz2 +REPO=core + +# let user override the above defaults +for i in /etc/${program}rc $HOME/.${program}rc ./.${program}rc; do + if [ -f $i ]; then + . $i + fi +done + +# generate a new dist package +tarball=${PACKAGE}-${VERSION}${SUFFIX} +make dist || exit 1 +cp $tarball "$DISTFILES/" || exit 1 + +# update the APKBUILD, in a subshell +( + cd $APORTS_DIR/$REPO/$PACKAGE || exit 1 + . ./APKBUILD + if [ "$pkgver" = "$VERSION" ]; then + pkgrel=$(( $pkgrel + 1 )) + else + pkgrel="0" + fi + sed -i -e " s/^pkgver=.*/pkgver=$VERSION/; + s/^pkgrel=.*/pkgrel=$pkgrel/; + /^md5sums=\"/,/\"\$/d" APKBUILD || exit 1 + export SRCDEST="$DISTFILES" + abuild checksum + abuild + abuild cleanoldpkg +) || exit 1 + +# rebuild the iso +cd "$ALPINE_DIR" && fakeroot ./mkalpine + diff --git a/mkalpine b/mkalpine deleted file mode 100755 index e31980a..0000000 --- a/mkalpine +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -# check if what we need is here -needed="cramfs syslinux cdrkit" -for i in $needed; do - if ! apk info -e $i; then - missing="$missing $i" - fi -done - -# try install the missing parts -if [ -n "$missing" ]; then - if ! sudo apk add $missing; then - echo "Need $missing to build alpine" >&2 - exit 1 - fi -fi - -# first look for alpine.mk in current dir. Fallback to /usr/share/abuild -mk=./alpine.mk -if ! [ -f $mk ]; then - mk=/usr/share/abuild/alpine.mk -fi - -make -f "$mk" APK_BIN= $@ -rc=$? - -# beep when done -if [ $rc -eq 0 ]; then - for i in $(seq 0 3); do - echo -n -e "\007" - sleep 0.2 - done -fi - -# uninstall the stuff we installed -[ -n "$missing" ] && sudo apk del $missing - - -exit $? diff --git a/mkalpine.in b/mkalpine.in new file mode 100755 index 0000000..e31980a --- /dev/null +++ b/mkalpine.in @@ -0,0 +1,40 @@ +#!/bin/sh + +# check if what we need is here +needed="cramfs syslinux cdrkit" +for i in $needed; do + if ! apk info -e $i; then + missing="$missing $i" + fi +done + +# try install the missing parts +if [ -n "$missing" ]; then + if ! sudo apk add $missing; then + echo "Need $missing to build alpine" >&2 + exit 1 + fi +fi + +# first look for alpine.mk in current dir. Fallback to /usr/share/abuild +mk=./alpine.mk +if ! [ -f $mk ]; then + mk=/usr/share/abuild/alpine.mk +fi + +make -f "$mk" APK_BIN= $@ +rc=$? + +# beep when done +if [ $rc -eq 0 ]; then + for i in $(seq 0 3); do + echo -n -e "\007" + sleep 0.2 + done +fi + +# uninstall the stuff we installed +[ -n "$missing" ] && sudo apk del $missing + + +exit $? -- cgit v1.2.3-60-g2f50