diff --git a/sys-devel/llvm/llvm-2.8-r2.ebuild b/sys-devel/llvm/llvm-2.8-r2.ebuild index 5d56e49..87cc797 100644 --- a/sys-devel/llvm/llvm-2.8-r2.ebuild +++ b/sys-devel/llvm/llvm-2.8-r2.ebuild @@ -12,7 +12,7 @@ HOMEPAGE="http://llvm.org/" SRC_URI="http://llvm.org/releases/${PV}/${P}.tgz -> ${P}-r1.tgz" LICENSE="UoI-NCSA" -SLOT="0" +SLOT="${PV}" KEYWORDS="amd64 ppc x86 ~amd64-linux ~x86-linux ~ppc-macos" IUSE="debug +libffi llvm-gcc multitarget ocaml test udis86" @@ -25,7 +25,9 @@ DEPEND="dev-lang/perl libffi? ( virtual/libffi ) ocaml? ( dev-lang/ocaml ) udis86? ( dev-libs/udis86[pic(+)] )" -RDEPEND="dev-lang/perl" +RDEPEND="dev-lang/perl + app-admin/eselect-llvm" + S=${WORKDIR}/${PN}-${PV/_pre*} @@ -75,7 +77,7 @@ src_prepare() { -i tools/llvm-config/llvm-config.in.in || die "llvm-config sed failed" einfo "Fixing rpath and CFLAGS" - sed -e 's,\$(RPATH) -Wl\,\$(\(ToolDir\|LibDir\)),$(RPATH) -Wl\,'"${EPREFIX}"/usr/$(get_libdir)/${PN}, \ + sed -e "s@\$(RPATH) -Wl,\$(\(ToolDir\|LibDir\))@\$(RPATH) -Wl,'${EPREFIX}/usr/$(get_libdir)/${PN}-${SLOT}'@" \ -e '/OmitFramePointer/s/-fomit-frame-pointer//' \ -i Makefile.rules || die "rpath sed failed" @@ -157,27 +159,110 @@ src_compile() { src_install() { emake KEEP_SYMBOLS=1 DESTDIR="${D}" install || die "install failed" + # Register slot for app-admin/eselect-llvm + local eselect_dir="/usr/share/eselect-llvm/slots/${SLOT}" + dodir "${eselect_dir}" + eselect_dir="${ED}/${eselect_dir}" + echo "${CATEGORY}/${PF}" > "${eselect_dir}/ebuild" + + with_slot_suffix() { + local file=$(echo "$1" | sed -e "s/-${SLOT}//") + local ext="" + if [[ "${file}" =~ \. ]] ; then + ext=".${file#*.}" + fi + local base="${file%%.*}" + echo "${base}-${SLOT}${ext}" + } + + make_versioned() { + local dir=$1 + local candidates=(${ED%/}/${dir}) + if [[ ! ${dir##*/} ]] ; then + dir=${dir%/} + candidates=( "${candidates}"* ) + else + dir=$(dirname "${dir}") + fi + + pushd ${ED%/}/${dir} >/dev/null || die + + local candidate + for candidate in "${candidates[@]}" ; do + if [[ -h "${candidate}" ]] ; then + # Add slot suffix to symlink target + local target=$(readlink -s "${candidate}") + local slotted_target=$(with_slot_suffix "${target}") + if [[ -e "${target}" ]] || [[ -e "${slotted_target}" ]] ; then + ln -sf "${slotted_target}" "${candidate}" \ + || die "Could not update symlink" + fi + fi + + local base_name=$(basename "${candidate}") + local slotted_name=$(with_slot_suffix "${base_name}") + mv "${candidate}" "${ED}/${dir}/${slotted_name}" \ + || die "Could not rename ${candidate} to ${slotted_name}" + echo "/${dir#/}/${base_name}" >> "${eselect_dir}/versioned" + done + + popd >/dev/null || die + } + + # Trailing slash => version the content + # No trailing slash => version the directory itself + local paths=( + /usr/bin/ + /usr/$(get_libdir)/ + /usr/include/ + /usr/share/man/man1/ + ) + use vim-syntax && paths+=( /usr/share/vim/vimfiles/syntax/ ) + + local path + for path in "${paths[@]}" ; do + make_versioned "${path}" + done + # Fix install_names on Darwin. The build system is too complicated # to just fix this, so we correct it post-install local lib= f= odylib= if [[ ${CHOST} == *-darwin* ]] ; then for lib in lib{EnhancedDisassembly,LLVM-${PV},BugpointPasses,LLVMHello,LTO,profile_rt}.dylib ; do # libEnhancedDisassembly is Darwin10 only, so non-fatal - [[ -f ${ED}/usr/lib/${PN}/${lib} ]] || continue + [[ -f ${ED}/usr/lib/${PN}-${SLOT}/${lib} ]] || continue ebegin "fixing install_name of $lib" install_name_tool \ - -id "${EPREFIX}"/usr/lib/${PN}/${lib} \ - "${ED}"/usr/lib/${PN}/${lib} + -id "${EPREFIX}"/usr/lib/${PN}-${SLOT}/${lib} \ + "${ED}"/usr/lib/${PN}-${SLOT}/${lib} eend $? done - for f in "${ED}"/usr/bin/* "${ED}"/usr/lib/${PN}/libLTO.dylib ; do + for f in "${ED}"/usr/bin/* "${ED}"/usr/lib/${PN}-${SLOT}/libLTO.dylib ; do odylib=$(scanmacho -BF'%n#f' "${f}" | tr ',' '\n' | grep libLLVM-${PV}.dylib) ebegin "fixing install_name reference to ${odylib} of ${f##*/}" install_name_tool \ -change "${odylib}" \ - "${EPREFIX}"/usr/lib/${PN}/libLLVM-${PV}.dylib \ + "${EPREFIX}"/usr/lib/${PN}-${SLOT}/libLLVM-${PV}.dylib \ "${f}" eend $? done fi } + +pkg_postinst() { + if [[ $(eselect ${PN} show) = "(none)" ]] ; then + eselect ${PN} set ${SLOT} + fi +} + +pkg_prerm() { + if [[ $(eselect ${PN} show) = ${SLOT} ]] ; then + eselect ${PN} clear + fi +} + +pkg_postrm() { + if [[ -z ${REPLACED_BY_VERSION} ]] ; then + eselect ${PN} update + fi +}