xbps-src: re-introduce etc/virtual.

The `etc/virtual` file declares the default package to be built for
virtual dependencies declared as "virtual?foo" in $depends.

Before this change, the run-time dependency was added as is to the final
binary package but no pkg providing this virtual pkg was built.

With this file we declare the *default* pkg to be built.

NOTE: "virtual?foo" is only applicable to *run* time dependencies, i.e
only those declared in $depends.
This commit is contained in:
Juan RP 2016-04-27 20:16:59 +02:00
parent 78c601e18e
commit d2bac19750
4 changed files with 248 additions and 173 deletions

View file

@ -118,6 +118,14 @@ Native and cross compiler/linker flags are set per architecture in `common/build
and `common/cross-profiles` respectively. Ideally those settings are good enough by default, and `common/cross-profiles` respectively. Ideally those settings are good enough by default,
and there's no need to set your own unless you know what you are doing. and there's no need to set your own unless you know what you are doing.
#### Virtual packages
The `etc/defaults.virtual` file contains the default replacements for virtual packages,
used as dependencies in the source packages tree.
If you want to customize those replacements, copy `etc/defaults.virtual` to `etc/virtual`
and edit it accordingly to your needs.
### Directory hierarchy ### Directory hierarchy
The following directory hierarchy is used with a default configuration file: The following directory hierarchy is used with a default configuration file:

View file

@ -1,6 +1,8 @@
# vim: set ts=4 sw=4 et:
#
# This hook executes the following tasks: # This hook executes the following tasks:
# - Generates rdeps file with run-time dependencies for xbps-create(8) # - Generates rdeps file with run-time dependencies for xbps-create(1)
# - Generates shlib-requires file for xbps-create(8) # - Generates shlib-requires file for xbps-create(1)
add_rundep() { add_rundep() {
local dep="$1" i= rpkgdep= _depname= _rdeps= found= local dep="$1" i= rpkgdep= _depname= _rdeps= found=
@ -30,8 +32,22 @@ add_rundep() {
fi fi
} }
store_pkgdestdir_rundeps() {
if [ -n "$run_depends" ]; then
: > ${PKGDESTDIR}/rdeps
for f in ${run_depends}; do
_curdep="$(echo "$f" | sed -e 's,\(.*\)?.*,\1,')"
if [ -z "$($XBPS_UHELPER_CMD getpkgdepname ${_curdep} 2>/dev/null)" -a \
-z "$($XBPS_UHELPER_CMD getpkgname ${_curdep} 2>/dev/null)" ]; then
_curdep="${_curdep}>=0"
fi
printf "${_curdep} " >> ${PKGDESTDIR}/rdeps
done
fi
}
hook() { hook() {
local depsftmp f j tmplf mapshlibs sorequires local depsftmp f j tmplf mapshlibs sorequires _curdep
# Disable trap on ERR, xbps-uhelper cmd might return error... but not something # Disable trap on ERR, xbps-uhelper cmd might return error... but not something
# to be worried about because if there are broken shlibs this hook returns # to be worried about because if there are broken shlibs this hook returns
@ -42,8 +58,7 @@ hook() {
tmplf=$XBPS_SRCPKGDIR/$pkgname/template tmplf=$XBPS_SRCPKGDIR/$pkgname/template
if [ -n "$noarch" -o -n "$noverifyrdeps" ]; then if [ -n "$noarch" -o -n "$noverifyrdeps" ]; then
echo "$run_depends" > ${PKGDESTDIR}/rdeps store_pkgdestdir_rundeps
sed 's,virtual?,,g' -i ${PKGDESTDIR}/rdeps
return 0 return 0
fi fi
@ -155,12 +170,8 @@ hook() {
msg_error "$pkgver: cannot guess required shlibs, aborting!\n" msg_error "$pkgver: cannot guess required shlibs, aborting!\n"
fi fi
if [ -n "$run_depends" ]; then store_pkgdestdir_rundeps
echo "$run_depends" > ${PKGDESTDIR}/rdeps
fi
if [ -s ${PKGDESTDIR}/rdeps ]; then
sed 's,virtual?,,g' -i ${PKGDESTDIR}/rdeps
fi
for f in ${shlib_requires}; do for f in ${shlib_requires}; do
sorequires+="${f} " sorequires+="${f} "
done done

View file

@ -17,15 +17,30 @@ setup_pkg_depends() {
if [ -z "${_pkgdepname}" ]; then if [ -z "${_pkgdepname}" ]; then
_pkgdepname="$($XBPS_UHELPER_CMD getpkgname ${_depname} 2>/dev/null)" _pkgdepname="$($XBPS_UHELPER_CMD getpkgname ${_depname} 2>/dev/null)"
fi fi
if [ -s ${XBPS_DISTDIR}/etc/virtual ]; then
_replacement=$(egrep "^${_pkgdepname:-${_depname}}[[:blank:]]" ${XBPS_DISTDIR}/etc/virtual|cut -d ' ' -f2)
elif [ -s ${XBPS_DISTDIR}/etc/defaults.virtual ]; then
_replacement=$(egrep "^${_pkgdepname:-${_depname}}[[:blank:]]" ${XBPS_DISTDIR}/etc/defaults.virtual|cut -d ' ' -f2)
fi
if [ "${_rpkgname}" = "virtual" ]; then
if [ -z "${_replacement}" ]; then
msg_error "$pkgver: failed to resolve virtual dependency for '$j' (missing from etc/virtual)\n"
fi
_pkgdepname="$($XBPS_UHELPER_CMD getpkgdepname ${_replacement} 2>/dev/null)"
if [ -z "${_pkgdepname}" ]; then
_pkgdepname="$($XBPS_UHELPER_CMD getpkgname ${_replacement} 2>/dev/null)"
fi
if [ -z "${_pkgdepname}" ]; then
_pkgdepname="${_replacement}>=0"
fi
run_depends+=" ${_depname}?${_pkgdepname}"
#echo "Adding dependency virtual: ${_depname}?${_pkgdepname}"
else
if [ -z "${_pkgdepname}" ]; then if [ -z "${_pkgdepname}" ]; then
_pkgdep="${_depname}>=0" _pkgdep="${_depname}>=0"
else else
_pkgdep="${_depname}" _pkgdep="${_depname}"
fi fi
if [ "${_rpkgname}" = "virtual" ]; then
run_depends+=" virtual?${_pkgdep}"
else
run_depends+=" ${_pkgdep}" run_depends+=" ${_pkgdep}"
fi fi
done done
@ -165,7 +180,7 @@ srcpkg_get_pkgver() {
# #
install_pkg_deps() { install_pkg_deps() {
local pkg="$1" targetpkg="$2" target="$3" cross="$4" cross_prepare="$5" local pkg="$1" targetpkg="$2" target="$3" cross="$4" cross_prepare="$5"
local rval _realpkg curpkgdepname pkgn iver local rval _realpkg _vpkg _curpkg curpkgdepname pkgn iver
local i j found rundep repo local i j found rundep repo
local -a host_binpkg_deps binpkg_deps host_missing_deps missing_deps missing_rdeps local -a host_binpkg_deps binpkg_deps host_missing_deps missing_deps missing_rdeps
@ -259,10 +274,12 @@ install_pkg_deps() {
# #
for i in ${run_depends}; do for i in ${run_depends}; do
_realpkg="${i%\?*}" _realpkg="${i%\?*}"
if [ "${_realpkg}" = "virtual" ]; then _curpkg="${_realpkg}"
# ignore virtual dependencies _vpkg="${i#*\?}"
echo " [runtime] ${i#*\?}: virtual dependency." if [ "${_realpkg}" != "${_vpkg}" ]; then
continue _realpkg="${_vpkg}"
else
unset _curpkg
fi fi
pkgn=$($XBPS_UHELPER_CMD getpkgdepname "${_realpkg}") pkgn=$($XBPS_UHELPER_CMD getpkgdepname "${_realpkg}")
if [ -z "$pkgn" ]; then if [ -z "$pkgn" ]; then
@ -282,16 +299,28 @@ install_pkg_deps() {
set -- ${_props} set -- ${_props}
$XBPS_UHELPER_CMD pkgmatch ${1} "${_realpkg}" $XBPS_UHELPER_CMD pkgmatch ${1} "${_realpkg}"
if [ $? -eq 1 ]; then if [ $? -eq 1 ]; then
echo " [runtime] ${_realpkg}: found ($2)" if [ -n "${_curpkg}" ]; then
echo " [runtime] ${_curpkg}:${_realpkg} (virtual dependency): found $1 ($2)"
else
echo " [runtime] ${_realpkg}: found $1 ($2)"
fi
shift 2 shift 2
continue continue
else
if [ -n "${_curpkg}" ]; then
echo " [runtime] ${_curpkg}:${_realpkg} (virtual dependency): not found."
else else
echo " [runtime] ${_realpkg}: not found." echo " [runtime] ${_realpkg}: not found."
fi fi
fi
shift 2 shift 2
else
if [ -n "${_curpkg}" ]; then
echo " [runtime] ${_curpkg}:${_realpkg} (virtual dependency): not found."
else else
echo " [runtime] ${_realpkg}: not found." echo " [runtime] ${_realpkg}: not found."
fi fi
fi
missing_rdeps+=("${_realpkg}") missing_rdeps+=("${_realpkg}")
done done

27
etc/defaults.virtual Normal file
View file

@ -0,0 +1,27 @@
# --*-- shell --*--
#
# etc/defaults.virtual
# default configuration of etc/virtual
#
# DO NOT EDIT THIS FILE DIRECTLY; IT MAY BE REPLACED DURING UPDATES,
# EDIT etc/virtual INSTEAD.
#
# This file specifies a mapping between virtual packages and real packages
# available in the source packages collection (srcpkgs).
#
# The format uses 2 arguments delimited by a blank: <vpkgname> <realpkgname>
#
# When building a package with "xbps-src", those dependencies declared like
# "virtual?foo" will use the replacement package defined in `etc/virtual`.
#
# NOTE: this mapping is only there to be able to build a default package
# to resolve the virtual package dependency later on with xbps-install(1).
#
# NOTE: Create your own etc/virtual file to override these defaults.
awk gawk
java-environment openjdk
java-runtime openjdk-jre
ntp-daemon chrony
xserver-abi-input xorg-server
xserver-abi-video xorg-server