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.
230 lines
6.4 KiB
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}"
|
|
}
|