pkgsrc/pkgtools/pkgtasks/files/shlibs.subr
jlam db8c40249f Import pkgtasks-1-1.9 as pkgsrc/pkgtools/pkgtasks.
pkgtasks is a shell script library to ease writing POSIX-compliant
shell scripts to handle common tasks during installation or removal
of a package, e.g.,

  * creating groups and users needed by the package

  * creating and removing directories with special permissions and
    ownership,

  * copying example config files to their final locations during
    package installation, and removing them during package removal
    if they don't differ from the example ones,

  * reminding the user of files that may be customized after
    package installation.
2017-06-01 01:58:34 +00:00

179 lines
4.6 KiB
Text

# Copyright (c) 2017 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Johnny C. Lam.
#
# 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
#
# NAME
# shlibs.subr -- update the shared library cache
#
# SYNOPSIS
# task_shlibs [-s] add | remove
#
# DESCRIPTION
# The task_shlibs function supports two actions: "add" and "remove".
#
# Both the "add" and "remove" actions rebuild the system database
# of run-time library search paths so that the system can find the
# package's shared libraries.
#
# The available options are as follows:
#
# -s Silent; don't write to standard output.
#
# The task_shlibs function reads standard input line by line and
# looks for lines of the form:
#
# # SHLIB: <directory> [...]
#
# The directory paths are all passed as shell positional paramters
# to the ${LDCONFIG_ADD_CMD} and ${LDCONFIG_REMOVE_CMD} command
# lines.
#
# If any directory paths are relative, then they are assumed to be
# relative to ${PKG_PREFIX}.
#
# RETURN VALUES
# Returns 0 on success, and >0 if an error occurs.
#
# ENVIRONMENT
# The following variables are used if they are set:
#
# LDCONFIG
# The name or path to the ldconfig(8) utility.
#
# LDCONFIG_ADD_CMD
# LDCONFIG_REMOVE_CMD
# The command-line to be invoked to update the system
# run-time library paths cache when adding or removing
# a package.
#
# Possible: any shell command-line
# Default: ${LDCONFIG}
#
# PKGNAME
# The name of the package.
#
# PKG_DESTDIR
# A "destdir" prefix that is prepended to all filessystem
# paths. The default value is the empty string.
#
# PKG_PREFIX
# The installation prefix of the package. The default is
# "/usr/pkg".
#
# TASK_MSG
# String prepended to all normal message written to
# standard output.
#
__task_shlibs__="yes"
task_load echo
task_load quote
task_shlibs()
{
: ${LDCONFIG_ADD_CMD:=_task_shlibs_run}
: ${LDCONFIG_REMOVE_CMD:=_task_shlibs_run}
: ${PKGNAME:=${0##*/}}
: ${TASK_MSG:=""}
local arg
local echo="task_echo"
local OPTIND=1
while getopts ":s" arg "$@"; do
case $arg in
s) echo=":" ;;
*) return 127 ;;
esac
done
shift $(( ${OPTIND} - 1 ))
[ $# -gt 0 ] || return 127
local action="$1"; shift
case $action in
add|remove)
: "valid actions" ;;
*) return 0 ;;
esac
# Guard against ${PKG_PREFIX} == "/".
local prefix
case ${PKG_PREFIX}/ in
//) prefix= ;;
*) prefix=${PKG_PREFIX} ;;
esac
local quoted paths
paths=
local hash tag path
while read hash tag dirs; do
# Filter for "# SHLIB:".
case $hash/$tag in
"#/SHLIB:")
: "use this line" ;;
*) continue ;;
esac
case $dirs in
"") # skip lines without any required args
continue ;;
esac
# Canonicalize paths.
set -o noglob; set -- $dirs; set +o noglob
for path; do
case $path in
"") # skip empty pathnames
continue ;;
[!/]*) path="$prefix/$path" ;;
esac
path="${PKG_DESTDIR}$path"
task_quote "$path"
paths="$paths $quoted"
done
done
[ -n "$paths" ] || return 0
local result=0
case $action in
add) ( eval set -- $paths; ${LDCONFIG_ADD_CMD} ) >/dev/null ||
result=1 ;;
remove) ( eval set -- $paths; ${LDCONFIG_REMOVE_CMD} ) >/dev/null ||
result=1 ;;
esac
if [ $result -eq 0 ]; then
$echo "${TASK_MSG}> shared library cache rebuilt"
else
$echo "${TASK_MSG}! shared library cache not rebuilt"
fi
return $result
}
_task_shlibs_run()
{
: ${LDCONFIG:=ldconfig}
${LDCONFIG}
}