Files
pkgsrc-ng/pkgtools/pbulk/files/pbulk/scripts/pkg-build
2016-11-18 22:39:22 +01:00

224 lines
6.8 KiB
Plaintext
Executable File

#!@SH@
# $NetBSD: pkg-build,v 1.30 2016/05/09 00:08:21 joerg Exp $
#
# Copyright (c) 2007, 2008 Joerg Sonnenberger <joerg@NetBSD.org>.
# All rights reserved.
#
# This code was developed as part of Google's Summer of Code 2007 program.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 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
# SUCH DAMAGE.
. @PBULK_CONFIG@
if [ "${config_version}" != "@PBULK_CONFIG_VERSION@" ]; then
echo "Your configuration has version ${config_version}."
echo "This version of pbulk expects version @PBULK_CONFIG_VERSION@."
exit 1
fi
default_sync_package() {
mkdir -p ${packages}/All
cp "$1" "${packages}/All/${pkgname}${pkg_sufx}"
}
cleanup() {
if [ "$keep_wrkdir" = yes ]; then
${make} pbulk-save-wrkdir INTO=${bulklog}/${pkgname}/wrkdir.tar.gz TAR="${tar}"
fi
if [ "$keep_prefix" = yes ] && [ -f ${bulklog}/${pkgname}/install.log ]; then
if [ "$cross_compile" != "no" ]; then
cur_destdir=${target_destdir}
else
cur_destdir=
fi
${tar} -czf ${bulklog}/${pkgname}/prefix.tar.gz ${cur_destdir}${prefix}
fi
${make} clean > /dev/null 2>&1 || true
${sync_buildlog} ${bulklog} ${pkgname}
exit 1
}
run_direct() { "$@"; }
run_su() { su ${unprivileged_user} -c '"$@"' make "$@"; }
run_make() {
local run_cmd
run_cmd=$1
shift
${run_cmd} ${make} "$@" \
BATCH=1 \
DEPENDS_TARGET=/nonexistent \
${MAKE_FLAGS} \
WRKLOG=${bulklog}/${pkgname}/work.log
}
run_usergroup() {
case "${usergroup_phase}" in
*configure)
[ "$1" != "configure" ] || ${make} create-usergroup clean
;;
*build)
[ "$1" != "build" ] || ${make} create-usergroup
;;
pre-install)
[ "$1" != "install" ] || ${make} create-usergroup
;;
esac
}
while read build_info_line; do
case "${build_info_line}" in
PKGNAME=*)
pkgname=${build_info_line#PKGNAME=}
;;
PKG_LOCATION=*)
pkgdir=${build_info_line#PKG_LOCATION=}
;;
DEPENDS=*)
dependencies=${build_info_line#DEPENDS=}
;;
CATEGORIES=*)
categories=${build_info_line#CATEGORIES=}
;;
MULTI_VERSION=*)
MAKE_FLAGS=${build_info_line#MULTI_VERSION=}
;;
USE_DESTDIR=*)
use_destdir=${build_info_line#USE_DESTDIR=}
;;
BOOTSTRAP_PKG=*)
is_bootstrap=${build_info_line#BOOTSTRAP_PKG=}
;;
USERGROUP_PHASE=*)
usergroup_phase=${build_info_line#USERGROUP_PHASE=}
esac
done
if [ "$use_unprivileged_checksum" != "no" ]; then
run_checksum=run_su
else
run_checksum=run_direct
fi
if [ "$use_destdir" = user-destdir ]; then
run_build=run_su
run_install=run_su
else
run_build=run_su
run_install=run_direct
fi
if [ `@ID@ -u` -ne 0 ]; then
run_checksum=run_direct
run_build=run_direct
run_install=run_direct
fi
${pkg_up_to_date_script} ${pkgname} ${dependencies} && exit 0
set -e
@PREFIX@/libexec/pbulk/client-clean
# Create the output directory and clean it up
mkdir -p ${bulklog}/${pkgname}
rm -f ${bulklog}/${pkgname}/*
touch ${bulklog}/${pkgname}/work.log
@CHOWN@ ${unprivileged_user} ${bulklog}/${pkgname}/work.log
pkg_add_normal() {
PKG_PATH=${packages}/All ${pkg_add} -K ${cur_pkgdb} "$@"
}
pkg_add_cross() {
PKG_PATH=${packages}/All ${pkg_add} -K ${cur_pkgdb} \
-m ${target_arch} -I -p ${target_destdir}${prefix} "$@"
echo "Fixing recorded cwd..."
${pkg_info} -K ${target_destdir}${pkgdb} | while read pkg junk; do
${sed} -e 's|@cwd '"${target_destdir}"'|@cwd |' \
${cur_pkgdb}/"${pkg}"/+CONTENTS > \
${cur_pkgdb}/"${pkg}"/+CONTENTS.tmp
mv ${cur_pkgdb}/"${pkg}"/+CONTENTS.tmp \
${cur_pkgdb}/"${pkg}"/+CONTENTS
done
}
if [ "$cross_compile" != "no" ]; then
pkg_add_cmd=pkg_add_cross
cur_pkgdb="${target_destdir}${pkgdb}"
else
pkg_add_cmd=pkg_add_normal
cur_pkgdb="${pkgdb}"
fi
# Go to target directory
cd ${pkgsrc}/${pkgdir}
# Clean build area, just in case
${make} clean > ${bulklog}/${pkgname}/pre-clean.log 2>&1
# Install all dependencies the package said it would need
if [ ! -z "$dependencies" ]; then
${pkg_add_cmd} $dependencies > ${bulklog}/${pkgname}/depends.log 2>&1
fi
# Build package, create a separate log file for each major phase
run_make ${run_checksum} checksum > ${bulklog}/${pkgname}/checksum.log 2>&1 || cleanup
run_usergroup configure > ${bulklog}/${pkgname}/configure.log 2>&1 || cleanup
run_make ${run_build} configure >> ${bulklog}/${pkgname}/configure.log 2>&1 || cleanup
run_usergroup build> ${bulklog}/${pkgname}/build.log 2>&1 || cleanup
run_make ${run_build} all >> ${bulklog}/${pkgname}/build.log 2>&1 || cleanup
run_usergroup install > ${bulklog}/${pkgname}/install.log 2>&1 || cleanup
run_make ${run_install} stage-install >> ${bulklog}/${pkgname}/install.log 2>&1 || cleanup
run_make run_direct stage-package-create > ${bulklog}/${pkgname}/package.log 2>&1 || cleanup
pkgfile=$(run_make run_direct show-var VARNAME=STAGE_PKGFILE)
# Add the package once to test install rules. This is not done for
# potential bootstrap packages as they might already be installed.
if [ -z "${is_bootstrap}" ]; then
if ! ${pkg_add_cmd} ${pkgfile} \
>> ${bulklog}/${pkgname}/package.log 2>&1; then
cleanup
fi
fi
# Test uninstall rules. This is not for cross-compiling as the install script
# is not run in that case anyway. This is also not done for packages marked as
# part of the bootstrap, those have the preserve flag set.
if [ "$cross_compile" = "no" ] && \
[ -z "${is_bootstrap}" ]; then
${pkg_delete} -K ${cur_pkgdb} ${pkgname} > ${bulklog}/${pkgname}/deinstall.log 2>&1 || cleanup
fi
# Comment the following out if you want to test all deinstall scripts.
# This is quite expensive and mostly redundant, so it is disabled by default.
#${pkg_delete} -r \* > /dev/null 2>&1 || cleanup
${sync_package} ${pkgfile} ${pkgname} "${categories}"
# Clean build area
${make} clean > ${bulklog}/${pkgname}/clean.log 2>&1 || true
# Cleanup build logs on success
rm -R ${bulklog}/${pkgname}