DESCRIPTION="Manage boost installations" _boost_tools="bcp bjam compiler_status inspect library_status process_jam_log quickbook wave" find_targets() { local f for f in "${ROOT}"/usr/include/boost-[[:digit:]]* ; do [[ -d "${f}" ]] && echo $(basename "${f}") done } find_mpi_targets() { local f version="${1}" for f in "${ROOT}"/usr/lib/python[[:digit:]].[[:digit:]]/site-packages/mpi_"${version}"/mpi.so ; do echo "${f}" done } remove_installation() { local link for link in "${ROOT}/usr/include/boost" "${ROOT}/usr/share/boostbook" \ "${ROOT}"/usr/lib/python[[:digit:]].[[:digit:]]/site-packages/mpi.so ; 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/lib" 1>/dev/null local lib for lib in libboost_*.{a,so} ; do [[ -L "${lib}" && "${lib}" != libboost_*[[:digit:]]_[[:digit:]][[:digit:]].@(a|so) ]] || continue rm "${lib}" || die -q "Unable to remove \"/usr/lib/${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 } set_installation() { [[ -z "${2}" ]] && die -q "Too few parameters to set_installation()" local target="${1}" local version="${2}" if [[ -d "${ROOT}/usr/include/${target}" ]] ; then pushd "${ROOT}/usr/include" 1>/dev/null ln -s "${target}/boost" boost || die -q "Couldn't create symlink \"/usr/include/boost\"" popd 1>/dev/null pushd "${ROOT}/usr/share/" 1>/dev/null [[ -d "boostbook-${version}" ]] && \ ( ln -s "boostbook-${version}" "boostbook" || die -q "Couldn't create symlink \"/usr/bin/${tool}\"" ) popd 1>/dev/null local mpi_targets=($(find_mpi_targets ${version})) if [[ ${#mpi_targets[@]} -gt 0 ]]; then local target="${mpi_targets[@]:(-1)}" local link="$(dirname $(dirname ${target}))/mpi.so" [[ -f "${target}" ]] && ( ln -s "${target}" "${link}" \ || die -q "Couldn't create symlink \"${link}\"" ) fi pushd "${ROOT}/usr/lib/" 1>/dev/null local lib for lib in libboost_*-"${version}".{a,so} ; do [[ -e "${lib}" ]] && \ ( ln -s "${lib}" "${lib//-${version}}" || die -q "Couldn't create symlink \"/usr/bin/${lib}\"" ) done popd 1>/dev/null pushd "${ROOT}/usr/bin/" 1>/dev/null local tool for tool in ${_boost_tools} ; do [[ -e "${tool}" ]] && die -q "\"/usr/bin/${tool}\" exists and isn't a symlink" [[ -e "${tool}-${version}" ]] && \ ( ln -s "${tool}-${version}" "${tool}" || die -q "Couldn't create symlink \"/usr/bin/${tool}\"" ) done popd 1>/dev/null else die -q "Target \"${target}\" doesn't appear to be valid!" fi } ### 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 for (( i = 0 ; i < ${#targets[@]} ; i = i + 1 )) ; do [[ "${targets[${i}]}" == $(basename $(dirname $(canonicalise "${ROOT}"/usr/include/boost))) ]] && \ targets[${i}]="${targets[${i}]} $(highlight '*' )" 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 "" } 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 local version="${target//boost-}" if [[ -L "${ROOT}"/usr/include/boost ]] ; then if ! remove_installation ; then die -q "Couldn't unset existing installation" elif ! set_installation "${target}" "${version}" ; then die -q "Couldn't set a new installation" fi elif [[ -e "${ROOT}"/usr/include/boost ]] ; then die -q "Sorry, existing boost installation confuses me" else set_installation "${target}" "${version}" || die -q "Couldn't set a new version" fi } ### update action ### describe_update() { echo "Automaticly update boost version used" } do_update() { local current= if [[ -L "${ROOT}/usr/include/boost" ]]; then current=$(basename $(canonicalise "${ROOT}/usr/include/boost") ) if [[ ! -e $(canonicalise "${ROOT}/usr/include/boost") ]]; then # clean up dead symlinks remove_installation || die -q "Couldn't remove existing installation" fi elif [[ -e "${ROOT}/usr/include/boost" ]]; then die -q "Sorry, \"/usr/include/boost\" exists but is not a symlink" fi local targets=($(find_targets)) if [[ ${#targets[@]} -gt 0 ]]; then remove_installation || die -q "Couldn't remove existing installation" local target="${targets[@]:(-1)}" set_installation "${target}" "${target//boost-}" || die -q "Couldn't set a new symlink" else die -q "No slotted boost version found" fi }