#! /bin/sh # # opkhelper # src/opkbuild # Build opkg packages. # # Copyright (C) 2012 Patrick "P. J." McDermott # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . . @@LIBDIR@@/opkhelper/controlfields print_usage() { printf 'Usage: [-r assume-uid0-cmd] %s\n' "$1" } error() { printf 'opkbuild: [%s] Error\n' "${1}" cd .. rm -Rf tmp 2> /dev/null exit 1 } opts=$(getopt -n "${0}" -o 'r:' -- "${@}") if [ ${?} -ne 0 ]; then print_usage "${0}" >&2 exit 1; fi eval set -- "${opts}" while true; do case "${1}" in -r) uid0_cmd=${2} shift 2 ;; --) shift break ;; *) print_usage "${0}" >&2 exit 1 ;; esac done if [ -z "${uid0_cmd}" ]; then uid0_cmd=fakeroot fi ${uid0_cmd} true if [ ${?} -ne 0 ]; then printf 'opkbuild: Error running command to gain UID 0\n' >&2 exit 1 fi # Sanity checks. printf 'opkbuild: Checking for sanity...\n' if [ ! -f format -o ! -f build -o ! -f control ]; then printf 'Error: Current working directory is not a source package.\n' >&2 exit 1 fi if [ "$(cat format)" != '1.0' ]; then printf 'Error: Source package is of an incompatible version.\n' >&2 exit 1 fi # Make work area. printf 'opkbuild: Making work area...\n' mkdir tmp cd tmp # Get source package name and version. printf 'opkbuild: Reading source package control fields...\n' srcpkg=$(oh_get_field Source) version=$(oh_get_field Version) # Check build dependencies. oh-checkbuilddeps || error "${srcpkg}-src" printf '\n' # Build *-src package. printf 'opkbuild: Attempting to build package "%s"...\n' "${srcpkg}-src" printf 'opkbuild: Installing files for package "%s"...\n' "${srcpkg}-src" ${uid0_cmd} mkdir -p ${srcpkg}-src.data/usr/src/${srcpkg}_${version} || error "${srcpkg}-src" for file in ../*; do case ${file} in ../tmp) ;; ../*) ${uid0_cmd} cp -R ${file} \ ${srcpkg}-src.data/usr/src/${srcpkg}_${version} || error "${srcpkg}-src" ;; esac done ( ${uid0_cmd} oh-gencontrol -s;) || error "${srcpkg}-src" ( ${uid0_cmd} oh-buildopk ${srcpkg}-src;) || error "${srcpkg}-src" ( ${uid0_cmd} rm -Rf ${srcpkg}-src.data;) || error "${srcpkg}-src" printf 'opkbuild: Package "%s" complete!\n\n' "${srcpkg}-src" # Build other binary packages. for binpkgdir in ../*.pkg/; do binpkg=${binpkgdir#'../'} binpkg=${binpkg%'.pkg/'} # TODO: Check architecture. if true; then printf 'opkbuild: Attempting to build package "%s"...\n' "${binpkg}" # Make installation directory. # TODO: Maybe this should be an FHS-compliant filesystem hierarchy. mkdir dest || error "${binpkg}" # Copy or extract software sources to src. if [ -d ../src ]; then cp -Rp ../src src || error "${binpkg}" elif [ -f ../${pkgname}_${pkgver}.tar.gz ]; then tar -xzf ../${pkgname}_${pkgver}.tar.gz || error "${binpkg}" fi # TODO: Other compression formats, putting things in src/, ... # Apply patches. oh-applypatches # Build the package. ${uid0_cmd} ../build ${binpkg} || error "${binpkg}" printf 'opkbuild: Package "%s" complete!\n\n' "${binpkg}" # Clean up everything except the build stamps. for file in *; do case ${file} in *.buildstamp) ;; *) ${uid0_cmd} rm -Rf ${file} || error "${binpkg}" ;; esac done fi done # Clean up tmp. cd .. rm -Rf tmp