You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/app-admin/eselect-boost/files/boost.eselect-0.3

230 lines
6.4 KiB

# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id: boost.eselect-0.3,v 1.3 2011/08/28 06:48:29 ulm Exp $
# This eclass-module has been initially written by Łukasz Michalik <lmi@ift.uni.wroc.pl>
# Corrections and extensions by Tiziano Müller <dev-zero@gentoo.org>
DESCRIPTION="Manage boost installations"
MAINTAINER="dev-zero@gentoo.org"
VERSION="0.3"
_boost_tools="bcp bjam compiler_status inspect library_status process_jam_log quickbook wave"
# ... meaning: <none> and -debug:
_suffices="|-debug"
find_targets() {
local f
# use ls here to get a really empty set in case no boost is installed
for d in $(ls -d "${ROOT}"/usr/share/boost-eselect/profiles/* 2>/dev/null) ; do
for p in "${d}"/* ; do
echo "boost-$(basename ${d})/$(basename ${p})"
done
done
}
remove_installation() {
echo "Removing symlinks from old version"
local link
for link in "${ROOT}/usr/include/boost" "${ROOT}/usr/share/boostbook" ; do
if [[ -L "${link}" ]] ; then
rm "${link}" || die -q "Couldn't remove \"${link}\" symlink"
else
[[ -e "${link}" ]] && die -q "\"${link}\" exists and isn't a symlink"
fi
done
pushd "${ROOT}/usr/%LIBDIR%" 1>/dev/null
local lib
for lib in libboost_*.{a,so} ; do
[[ -L "${lib}" && "${lib}" != libboost_*[[:digit:]]_[[:digit:]][[:digit:]]@(${_suffices}).@(a|so) ]] || continue
rm "${lib}" || die -q "Unable to remove \"/usr/%LIBDIR%/${lib}\" symlink"
done
popd 1>/dev/null
pushd "${ROOT}"/usr/bin 1>/dev/null
local tool
for tool in ${_boost_tools} ; do
[[ -L "${tool}" ]] && ( rm "${tool}" || die -q "Unable to remove \"/usr/bin/${tool}\" symlink" )
done
popd 1>/dev/null
local mod="mpi.so"
for moddir in "${ROOT}"/usr/%LIBDIR%/python*/site-packages ; do
if [ -L "${moddir}/${mod}" ] ; then
rm "${moddir}/${mod}" || die -q "Unable to remove \"${moddir}/${mod}\" symlink"
else
[[ -e "${moddir}/${mod}" ]] && die -q "\"${moddir}/${mod}\" exists and isn't a symlink"
fi
done
if [ -L "${ROOT}/etc/eselect/boost/active" ] ; then
rm "${ROOT}/etc/eselect/boost/active" || die -q "Unable to remove \"${ROOT}/etc/eselect/boost/active\" symlink"
else
[[ -e "${ROOT}/etc/eselect/boost/active" ]] && die -q "\"${ROOT}/etc/eselect/boost/active\" exists and isn't a symlink"
fi
}
set_installation() {
[[ -z "${1}" ]] && die -q "Too few parameters to set_installation()"
local target="${1}"
echo "Creating symlinks for ${target}"
local profile="${target/*\/}"
local version="${target/\/${profile}}"
version="${version/boost-}"
version="${version/./_}"
cd "${ROOT}/etc/eselect/boost"
ln -s "${ROOT}/usr/share/boost-eselect/profiles/${target//boost-}" active || die -q "Couldn't create symlink active -> /usr/share/boost-eselect/profiles/${target//boost-}/${profile}"
. "${ROOT}/usr/share/boost-eselect/profiles/${target//boost-}"
for t in ${dirs} ${bins} ${libs} ; do
[[ -e "${ROOT}${t}" ]] || die -q "\"${t}\" listed as target does not exist"
pushd "$(dirname ${ROOT}${t})" 1>/dev/null
local ts=$(basename "${t}")
local tt="${ts//-${version}}"
tt="${tt//${suffix}}"
ln -s ${ts} ${tt} || die -q "Couldn't create symlink \"$(pwd)/${tt}\""
popd 1>/dev/null
done
[[ -d "${ROOT}${includes}" ]] || die -q "\"${includes}\" does not exist"
pushd "${ROOT}/usr/include" 1>/dev/null
ln -s ${includes//\/usr\/include\/} boost || die -q "Couldn't create symlink \"/usr/include/boost\""
popd 1>/dev/null
for t in ${python} ; do
pushd "$(dirname ${ROOT}${t})/.." 1>/dev/null
local ts="$(basename $(dirname ${ROOT}${t}))/${t//*\/}"
ts="${ts//${suffix}}"
local tt=${t//*\/}
ln -s "${ts}" "${tt}" || die -q "Couldn't create symlink \"$(pwd)/${tt}\""
popd 1>/dev/null
done
}
### show action ###
describe_show() {
echo "Show the current boost version used"
}
do_show() {
local include
write_list_start "Current boost version:"
if [[ -L "${ROOT}"/usr/include/boost ]] ; then
include=$(basename $(dirname $(canonicalise "${ROOT}"/usr/include/boost )))
write_kv_list_entry "${include%/}" ""
else
write_kv_list_entry "(unset)" ""
fi
}
### list action ###
describe_list() {
echo "List available boost versions"
}
do_list() {
local targets=( $(find_targets ) )
write_list_start "Available boost versions:"
if [[ -n "${targets[@]}" ]] ; then
local i
local active_slot=$(canonicalise "${ROOT}/etc/eselect/boost/active")
active_slot=${active_slot/"${ROOT}/usr/share/boost-eselect/profiles/"/boost-}
for (( i = 0 ; i < ${#targets[@]} ; i = i + 1 )) ; do
if [[ "${targets[${i}]}" == ${active_slot} ]] ; then
targets[${i}]="${targets[${i}]} $(highlight '*' )"
fi
done
write_numbered_list "${targets[@]}"
else
write_kv_list_entry "(none found)" ""
fi
}
### set action ###
describe_set() {
echo "Set a new boost version"
}
describe_set_parameters() {
echo "<target>"
}
describe_set_options() {
echo "target : Target name or number (from 'list' action)"
}
do_set() {
if [[ -z "${1}" ]] ; then
# no parameter
die -q "You didn't tell me what to set the version to"
fi
local target="${1}"
if is_number "${target}" ; then
targets=($(find_targets))
target="${targets[$((${target} - 1))]}"
fi
remove_installation
set_installation "${target}"
}
### update action ###
describe_update() {
echo "Automatically update boost version used"
}
do_update() {
# set default profile
profile="default"
# extract profile if there's already one boost version selected
if [ -L "${ROOT}"/etc/eselect/boost/active ] ; then
profile=$(basename $(canonicalise "${ROOT}/etc/eselect/boost/active"))
fi
echo "Previously selected profile: ${profile}"
remove_installation
local targets=($(find_targets))
[[ ${#targets[@]} -gt 0 ]] || die -q "No slotted boost version found"
# contains surely the highest available version, but maybe not the right profile
local last_target="${targets[@]:(-1)}"
# strip profile
local target_version="${last_target//\/*}"
# in case the previously used profile isn't available anymore
local target="${target_version}/default"
local matching_profile_found=0
for (( i = 0 ; i < ${#targets[@]} ; i = i + 1 )) ; do
if [[ "${targets[${i}]}" == "${target_version}/${profile}" ]] ; then
target="${targets[${i}]}"
matching_profile_found=1
break
fi
done
if [[ "${matching_profile_found}" == 1 ]] ; then
echo "Found a matching profile \"${profile}\" for the new version."
else
echo "Didn't find the previously selected profile \"${profile}\" for the new version. Resetting to \"default\"."
fi
set_installation "${target}"
}