sys-devel/llvm: Fix bogus flags and paths in llvm-config, #565358

Fix llvm-config to avoid bogus results. In particular:

1. Limit --cflags and --cxxflags to package-specific flags. Do not
output the whole flag-string used during the build. This fixes libclc
build issues when LLVM build flags were not tolerated by clang.

2. Fix library names and paths to use shared library suffix rather than
static library suffix, especially that we do not install static
libraries.

3. Wipe out --system-libs since they should not be required for dynamic
linking.

4. Ban --obj-root and --src-root when running outside source tree, since
we are not installing any sources and therefore their results would
always be bogus.

Based on patch provided by Steven Newbury.

Fixes: https://bugs.gentoo.org/565358
This commit is contained in:
Michał Górny
2015-12-02 20:27:50 +01:00
parent 118931f8c4
commit 8eff1b8029
3 changed files with 642 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
From 8a51e9673859eb3fb819f0d1dad5e2a60d1a3c0a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
Date: Wed, 2 Dec 2015 16:04:56 +0100
Subject: [PATCH] llvm-config: Clean up exported values, update for shared
linking
Gentoo-specific fixup for llvm-config, including:
- wiping build-specific CFLAGS, CXXFLAGS,
- updating library suffixes for shared libs,
- wiping --system-libs for shared linking,
- banning --obj-root and --src-root due to no sources installed.
Thanks to Steven Newbury for the initial patch.
Bug: https://bugs.gentoo.org/565358
Bug: https://bugs.gentoo.org/501684
---
tools/llvm-config/CMakeLists.txt | 11 ++++++++---
tools/llvm-config/llvm-config.cpp | 22 ++++++++++++++++------
utils/llvm-build/llvmbuild/main.py | 4 +++-
4 files changed, 27 insertions(+), 10 deletions(-)
diff --git a/tools/llvm-config/CMakeLists.txt b/tools/llvm-config/CMakeLists.txt
index edbd8c9..9a801bd 100644
--- a/tools/llvm-config/CMakeLists.txt
+++ b/tools/llvm-config/CMakeLists.txt
@@ -22,12 +22,17 @@ get_property(COMPILE_FLAGS TARGET llvm-config PROPERTY COMPILE_FLAGS)
set(LLVM_SRC_ROOT ${LLVM_MAIN_SRC_DIR})
set(LLVM_OBJ_ROOT ${LLVM_BINARY_DIR})
set(LLVM_CPPFLAGS "${CMAKE_CPP_FLAGS} ${CMAKE_CPP_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
-set(LLVM_CFLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
-set(LLVM_CXXFLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${COMPILE_FLAGS} ${LLVM_DEFINITIONS}")
+# Just use CMAKE_CPP_FLAGS for CFLAGS and CXXFLAGS, otherwise compiler
+# specific flags will be set when we don't know what compiler will be used
+# with external project utilising llvm-config. C++ Standard is required.
+# TODO: figure out if we can remove -std=c++11 and move it to revdeps.
+set(LLVM_CFLAGS "${CMAKE_CPP_FLAGS} ${CMAKE_C_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
+set(LLVM_CXXFLAGS "${CMAKE_CPP_FLAGS} -std=c++11 ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
# Use the C++ link flags, since they should be a superset of C link flags.
set(LLVM_LDFLAGS "${CMAKE_CXX_LINK_FLAGS}")
set(LLVM_BUILDMODE ${CMAKE_BUILD_TYPE})
-set(LLVM_SYSTEM_LIBS ${SYSTEM_LIBS})
+# We don't do static libs, so we don't need to supply any system-libs
+set(LLVM_SYSTEM_LIBS "")
string(REPLACE ";" " " LLVM_TARGETS_BUILT "${LLVM_TARGETS_TO_BUILD}")
configure_file(${BUILDVARIABLES_SRCPATH} ${BUILDVARIABLES_OBJPATH} @ONLY)
diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp
index 879b9ab..d2c43fa 100644
--- a/tools/llvm-config/llvm-config.cpp
+++ b/tools/llvm-config/llvm-config.cpp
@@ -323,10 +323,19 @@ int main(int argc, char **argv) {
#else
OS << "ON\n";
#endif
- } else if (Arg == "--obj-root") {
- OS << ActivePrefix << '\n';
- } else if (Arg == "--src-root") {
- OS << LLVM_SRC_ROOT << '\n';
+ } else if (Arg == "--obj-root" || Arg == "--src-root") {
+ if (IsInDevelopmentTree) {
+ if (Arg == "--obj-root") {
+ OS << ActivePrefix << '\n';
+ } else {
+ OS << LLVM_SRC_ROOT << '\n';
+ }
+ } else {
+ // sources are not installed
+ llvm::errs() << "llvm-config: sources not installed, "
+ << Arg << " not available\n";
+ exit(1);
+ }
} else {
usage();
}
@@ -360,8 +369,9 @@ int main(int argc, char **argv) {
OS << ActiveLibDir << '/' << Lib;
} else if (PrintLibs) {
// If this is a typical library name, include it using -l.
- if (Lib.startswith("lib") && Lib.endswith(".a")) {
- OS << "-l" << Lib.slice(3, Lib.size()-2);
+ if (Lib.startswith("lib") && Lib.endswith(LTDL_SHLIB_EXT)) {
+ // sizeof counts trailing NUL
+ OS << "-l" << Lib.slice(3, Lib.size()-sizeof(LTDL_SHLIB_EXT)+1);
continue;
}
diff --git a/utils/llvm-build/llvmbuild/main.py b/utils/llvm-build/llvmbuild/main.py
index 353741f..4ba5e91 100644
--- a/utils/llvm-build/llvmbuild/main.py
+++ b/utils/llvm-build/llvmbuild/main.py
@@ -393,6 +393,8 @@ subdirectories = %s
//
//===----------------------------------------------------------------------===//
+#include "llvm/Config/config.h"
+
""")
f.write('struct AvailableComponent {\n')
f.write(' /// The name of the component.\n')
@@ -413,7 +415,7 @@ subdirectories = %s
if library_name is None:
library_name_as_cstr = '0'
else:
- library_name_as_cstr = '"lib%s.a"' % library_name
+ library_name_as_cstr = '"lib%s" LTDL_SHLIB_EXT' % library_name
f.write(' { "%s", %s, %d, { %s } },\n' % (
name, library_name_as_cstr, is_installed,
', '.join('"%s"' % dep
--
2.6.3

View File

@@ -0,0 +1,525 @@
# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=5
: ${CMAKE_MAKEFILE_GENERATOR:=ninja}
PYTHON_COMPAT=( python2_7 pypy )
inherit check-reqs cmake-utils eutils flag-o-matic multilib \
multilib-minimal python-r1 toolchain-funcs pax-utils
DESCRIPTION="Low Level Virtual Machine"
HOMEPAGE="http://llvm.org/"
SRC_URI="http://llvm.org/releases/${PV}/${P}.src.tar.xz
clang? ( http://llvm.org/releases/${PV}/compiler-rt-${PV}.src.tar.xz
http://llvm.org/releases/${PV}/cfe-${PV}.src.tar.xz
http://llvm.org/releases/${PV}/clang-tools-extra-${PV}.src.tar.xz )
lldb? ( http://llvm.org/releases/${PV}/lldb-${PV}.src.tar.xz )
!doc? ( http://dev.gentoo.org/~voyageur/distfiles/${P}-manpages.tar.bz2 )"
LICENSE="UoI-NCSA"
SLOT="0/${PV}"
KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~sparc ~x86 ~amd64-fbsd ~x86-fbsd ~x64-freebsd ~amd64-linux ~arm-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos"
IUSE="clang debug doc gold libedit +libffi lldb multitarget ncurses ocaml
python +static-analyzer test xml video_cards_radeon kernel_Darwin"
COMMON_DEPEND="
sys-libs/zlib:0=
clang? (
python? ( ${PYTHON_DEPS} )
static-analyzer? (
dev-lang/perl:*
${PYTHON_DEPS}
)
xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )
)
gold? ( >=sys-devel/binutils-2.22:*[cxx] )
libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] )
libffi? ( >=virtual/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] )
ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] )
ocaml? (
>=dev-lang/ocaml-4.00.0:0=
dev-ml/findlib
dev-ml/ocaml-ctypes
!!<=sys-devel/llvm-3.7.0-r1[ocaml] )"
# configparser-3.2 breaks the build (3.3 or none at all are fine)
DEPEND="${COMMON_DEPEND}
dev-lang/perl
>=sys-devel/make-3.81
>=sys-devel/flex-2.5.4
>=sys-devel/bison-1.875d
|| ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5
( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx )
)
|| ( >=sys-devel/binutils-2.18 >=sys-devel/binutils-apple-5.1 )
kernel_Darwin? ( sys-libs/libcxx )
clang? ( xml? ( virtual/pkgconfig ) )
doc? ( dev-python/sphinx )
gold? ( sys-libs/binutils-libs )
libffi? ( virtual/pkgconfig )
lldb? ( dev-lang/swig )
!!<dev-python/configparser-3.3.0.2
ocaml? ( test? ( dev-ml/ounit ) )
${PYTHON_DEPS}"
RDEPEND="${COMMON_DEPEND}
clang? ( !<=sys-devel/clang-${PV}-r99 )
abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r2
!app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] )"
PDEPEND="clang? ( =sys-devel/clang-${PV}-r100 )"
# pypy gives me around 1700 unresolved tests due to open file limit
# being exceeded. probably GC does not close them fast enough.
REQUIRED_USE="${PYTHON_REQUIRED_USE}
lldb? ( clang xml )
test? ( || ( $(python_gen_useflags 'python*') ) )"
S=${WORKDIR}/${P/_}.src
pkg_pretend() {
# in megs
# !clang !debug !multitarget -O2 400
# !clang !debug multitarget -O2 550
# clang !debug !multitarget -O2 950
# clang !debug multitarget -O2 1200
# !clang debug multitarget -O2 5G
# clang !debug multitarget -O0 -g 12G
# clang debug multitarget -O2 16G
# clang debug multitarget -O0 -g 14G
local build_size=550
use clang && build_size=1200
if use debug; then
ewarn "USE=debug is known to increase the size of package considerably"
ewarn "and cause the tests to fail."
ewarn
(( build_size *= 14 ))
elif is-flagq '-g?(gdb)?([1-9])'; then
ewarn "The C++ compiler -g option is known to increase the size of the package"
ewarn "considerably. If you run out of space, please consider removing it."
ewarn
(( build_size *= 10 ))
fi
# Multiply by number of ABIs :).
local abis=( $(multilib_get_enabled_abis) )
(( build_size *= ${#abis[@]} ))
local CHECKREQS_DISK_BUILD=${build_size}M
check-reqs_pkg_pretend
if [[ ${MERGE_TYPE} != binary ]]; then
echo 'int main() {return 0;}' > "${T}"/test.cxx || die
ebegin "Trying to build a C++11 test program"
if ! $(tc-getCXX) -std=c++11 -o /dev/null "${T}"/test.cxx; then
eerror "LLVM-${PV} requires C++11-capable C++ compiler. Your current compiler"
eerror "does not seem to support -std=c++11 option. Please upgrade your compiler"
eerror "to gcc-4.7 or an equivalent version supporting C++11."
die "Currently active compiler does not support -std=c++11"
fi
eend ${?}
fi
}
pkg_setup() {
pkg_pretend
}
src_unpack() {
default
if use clang; then
mv "${WORKDIR}"/cfe-${PV/_}.src "${S}"/tools/clang \
|| die "clang source directory move failed"
mv "${WORKDIR}"/compiler-rt-${PV/_}.src "${S}"/projects/compiler-rt \
|| die "compiler-rt source directory move failed"
mv "${WORKDIR}"/clang-tools-extra-${PV/_}.src "${S}"/tools/clang/tools/extra \
|| die "clang-tools-extra source directory move failed"
fi
if use lldb; then
mv "${WORKDIR}"/lldb-${PV/_}.src "${S}"/tools/lldb \
|| die "lldb source directory move failed"
fi
}
src_prepare() {
# Make ocaml warnings non-fatal, bug #537308
sed -e "/RUN/s/-warn-error A//" -i test/Bindings/OCaml/*ml || die
# Fix libdir for ocaml bindings install, bug #559134
epatch "${FILESDIR}"/cmake/${P}-ocaml-multilib.patch
# Do not build/install ocaml docs with USE=-doc, bug #562008
epatch "${FILESDIR}"/cmake/${P}-ocaml-build_doc.patch
# Make it possible to override Sphinx HTML install dirs
# https://llvm.org/bugs/show_bug.cgi?id=23780
epatch "${FILESDIR}"/cmake/0002-cmake-Support-overriding-Sphinx-HTML-doc-install-dir.patch
# Prevent race conditions with parallel Sphinx runs
# https://llvm.org/bugs/show_bug.cgi?id=23781
epatch "${FILESDIR}"/cmake/0003-cmake-Add-an-ordering-dep-between-HTML-man-Sphinx-ta.patch
# Prevent installing libgtest
# https://llvm.org/bugs/show_bug.cgi?id=18341
epatch "${FILESDIR}"/cmake/0004-cmake-Do-not-install-libgtest.patch
# Fix llvm-config for shared linking and sane flags
# https://bugs.gentoo.org/show_bug.cgi?id=565358
epatch "${FILESDIR}"/llvm-3.7-llvm-config.patch
if use clang; then
# Automatically select active system GCC's libraries, bugs #406163 and #417913
epatch "${FILESDIR}"/clang-3.5-gentoo-runtime-gcc-detection-v3.patch
epatch "${FILESDIR}"/clang-3.6-gentoo-install.patch
sed -i -e "s^@EPREFIX@^${EPREFIX}^" \
tools/clang/tools/scan-build/scan-build || die
# Install clang runtime into /usr/lib/clang
# https://llvm.org/bugs/show_bug.cgi?id=23792
epatch "${FILESDIR}"/cmake/clang-0001-Install-clang-runtime-into-usr-lib-without-suffix.patch
epatch "${FILESDIR}"/cmake/compiler-rt-0001-cmake-Install-compiler-rt-into-usr-lib-without-suffi.patch
# Do not force -march flags on arm platforms
# https://bugs.gentoo.org/show_bug.cgi?id=562706
epatch "${FILESDIR}"/cmake/${P}-compiler_rt_arm_march_flags.patch
# Make it possible to override CLANG_LIBDIR_SUFFIX
# (that is used only to find LLVMgold.so)
# https://llvm.org/bugs/show_bug.cgi?id=23793
epatch "${FILESDIR}"/cmake/clang-0002-cmake-Make-CLANG_LIBDIR_SUFFIX-overridable.patch
# Fix WX sections, bug #421527
find "${S}"/projects/compiler-rt/lib/builtins -type f -name \*.S -exec sed \
-e '$a\\n#if defined(__linux__) && defined(__ELF__)\n.section .note.GNU-stack,"",%progbits\n#endif' \
-i {} \; || die
fi
if use lldb; then
# Do not install dummy readline.so module from
# https://llvm.org/bugs/show_bug.cgi?id=18841
sed -e 's/add_subdirectory(readline)/#&/' \
-i tools/lldb/scripts/Python/modules/CMakeLists.txt || die
# Fix Python paths, bugs #562436 and #562438
epatch "${FILESDIR}"/${PN}-3.7-lldb_python.patch
sed -e "s/GENTOO_LIBDIR/$(get_libdir)/" \
-i tools/lldb/scripts/Python/finishSwigPythonLLDB.py || die
# Fix build with ncurses[tinfo], #560474
# http://llvm.org/viewvc/llvm-project?view=revision&revision=247842
epatch "${FILESDIR}"/cmake/${P}-lldb_tinfo.patch
fi
# User patches
epatch_user
python_setup
# Native libdir is used to hold LLVMgold.so
NATIVE_LIBDIR=$(get_libdir)
}
multilib_src_configure() {
local targets
if use multitarget; then
targets=all
else
targets='host;CppBackend'
use video_cards_radeon && targets+=';AMDGPU'
fi
local ffi_cflags ffi_ldflags
if use libffi; then
ffi_cflags=$(pkg-config --cflags-only-I libffi)
ffi_ldflags=$(pkg-config --libs-only-L libffi)
fi
local libdir=$(get_libdir)
local mycmakeargs=(
"${mycmakeargs[@]}"
-DLLVM_LIBDIR_SUFFIX=${libdir#lib}
-DBUILD_SHARED_LIBS=ON
-DLLVM_ENABLE_TIMESTAMPS=OFF
-DLLVM_TARGETS_TO_BUILD="${targets}"
-DLLVM_BUILD_TESTS=$(usex test)
-DLLVM_ENABLE_FFI=$(usex libffi)
-DLLVM_ENABLE_TERMINFO=$(usex ncurses)
-DLLVM_ENABLE_ASSERTIONS=$(usex debug)
-DLLVM_ENABLE_EH=ON
-DLLVM_ENABLE_RTTI=ON
-DWITH_POLLY=OFF # TODO
-DLLVM_HOST_TRIPLE="${CHOST}"
-DFFI_INCLUDE_DIR="${ffi_cflags#-I}"
-DFFI_LIBRARY_DIR="${ffi_ldflags#-L}"
-DHAVE_HISTEDIT_H=$(usex libedit)
)
if use clang; then
mycmakeargs+=(
-DCMAKE_DISABLE_FIND_PACKAGE_LibXml2=$(usex !xml)
)
fi
if use lldb; then
mycmakeargs+=(
-DLLDB_DISABLE_LIBEDIT=$(usex !libedit)
-DLLDB_DISABLE_CURSES=$(usex !ncurses)
-DLLDB_ENABLE_TERMINFO=$(usex ncurses)
)
fi
if ! multilib_is_native_abi || ! use ocaml; then
mycmakeargs+=(
-DOCAMLFIND=NO
)
fi
# Note: go bindings have no CMake rules at the moment
# but let's kill the check in case they are introduced
# if ! multilib_is_native_abi || ! use go; then
mycmakeargs+=(
-DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND
)
# fi
if multilib_is_native_abi; then
mycmakeargs+=(
-DLLVM_BUILD_DOCS=$(usex doc)
-DLLVM_ENABLE_SPHINX=$(usex doc)
-DLLVM_ENABLE_DOXYGEN=OFF
-DLLVM_INSTALL_HTML="${EPREFIX}/usr/share/doc/${PF}/html"
-DSPHINX_WARNINGS_AS_ERRORS=OFF
-DLLVM_INSTALL_UTILS=ON
)
if use clang; then
mycmakeargs+=(
-DCLANG_INSTALL_HTML="${EPREFIX}/usr/share/doc/${PF}/clang"
)
fi
if use gold; then
mycmakeargs+=(
-DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include
)
fi
if use lldb; then
mycmakeargs+=(
-DLLDB_DISABLE_PYTHON=$(usex !python)
)
fi
else
if use clang; then
mycmakeargs+=(
# disable compiler-rt on non-native ABI because:
# 1. it fails to configure because of -m32
# 2. it is shared between ABIs so no point building
# it multiple times
-DLLVM_EXTERNAL_COMPILER_RT_BUILD=OFF
-DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_BUILD=OFF
)
fi
if use lldb; then
mycmakeargs+=(
# only run swig on native abi
-DLLDB_DISABLE_PYTHON=ON
)
fi
fi
if use clang; then
mycmakeargs+=(
-DCLANG_ENABLE_ARCMT=$(usex static-analyzer)
-DCLANG_ENABLE_STATIC_ANALYZER=$(usex static-analyzer)
-DCLANG_LIBDIR_SUFFIX="${NATIVE_LIBDIR#lib}"
)
# -- not needed when compiler-rt is built with host compiler --
# cmake passes host C*FLAGS to compiler-rt build
# which is performed using clang, so we need to filter out
# some flags clang does not support
# (if you know some more flags that don't work, let us know)
#filter-flags -msahf -frecord-gcc-switches
fi
cmake-utils_src_configure
}
multilib_src_compile() {
cmake-utils_src_compile
# TODO: not sure why this target is not correctly called
multilib_is_native_abi && use doc && use ocaml && cmake-utils_src_make docs/ocaml_doc
pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld
pax-mark m "${BUILD_DIR}"/bin/lli
pax-mark m "${BUILD_DIR}"/bin/lli-child-target
if use test; then
pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests
pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests
pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests
fi
}
multilib_src_test() {
# respect TMPDIR!
local -x LIT_PRESERVES_TMP=1
local test_targets=( check )
# clang tests won't work on non-native ABI because we skip compiler-rt
multilib_is_native_abi && use clang && test_targets+=( check-clang )
cmake-utils_src_make "${test_targets[@]}"
}
src_install() {
local MULTILIB_CHOST_TOOLS=(
/usr/bin/llvm-config
)
local MULTILIB_WRAPPED_HEADERS=(
/usr/include/llvm/Config/config.h
/usr/include/llvm/Config/llvm-config.h
)
if use clang; then
# note: magic applied in multilib_src_install()!
CLANG_VERSION=${PV%.*}
MULTILIB_CHOST_TOOLS+=(
/usr/bin/clang
/usr/bin/clang++
/usr/bin/clang-cl
/usr/bin/clang-${CLANG_VERSION}
/usr/bin/clang++-${CLANG_VERSION}
/usr/bin/clang-cl-${CLANG_VERSION}
)
MULTILIB_WRAPPED_HEADERS+=(
/usr/include/clang/Config/config.h
)
fi
multilib-minimal_src_install
}
multilib_src_install() {
cmake-utils_src_install
if multilib_is_native_abi; then
# Install man pages.
use doc || doman "${WORKDIR}"/${P}-manpages/*.1
# Symlink the gold plugin.
if use gold; then
dodir "/usr/${CHOST}/binutils-bin/lib/bfd-plugins"
dosym "../../../../$(get_libdir)/LLVMgold.so" \
"/usr/${CHOST}/binutils-bin/lib/bfd-plugins/LLVMgold.so"
fi
fi
# apply CHOST and CLANG_VERSION to clang executables
# they're statically linked so we don't have to worry about the lib
if use clang; then
local clang_tools=( clang clang++ clang-cl )
local i
# cmake gives us:
# - clang-X.Y
# - clang -> clang-X.Y
# - clang++, clang-cl -> clang
# we want to have:
# - clang-X.Y
# - clang++-X.Y, clang-cl-X.Y -> clang-X.Y
# - clang, clang++, clang-cl -> clang*-X.Y
# so we need to fix the two tools
for i in "${clang_tools[@]:1}"; do
rm "${ED%/}/usr/bin/${i}" || die
dosym "clang-${CLANG_VERSION}" "/usr/bin/${i}-${CLANG_VERSION}"
dosym "${i}-${CLANG_VERSION}" "/usr/bin/${i}"
done
# now prepend ${CHOST} and let the multilib-build.eclass symlink it
if ! multilib_is_native_abi; then
# non-native? let's replace it with a simple wrapper
for i in "${clang_tools[@]}"; do
rm "${ED%/}/usr/bin/${i}-${CLANG_VERSION}" || die
cat > "${T}"/wrapper.tmp <<-_EOF_
#!${EPREFIX}/bin/sh
exec "${i}-${CLANG_VERSION}" $(get_abi_CFLAGS) "\${@}"
_EOF_
newbin "${T}"/wrapper.tmp "${i}-${CLANG_VERSION}"
done
fi
fi
}
multilib_src_install_all() {
insinto /usr/share/vim/vimfiles
doins -r utils/vim/*/
# some users may find it useful
dodoc utils/vim/vimrc
if use clang; then
pushd tools/clang >/dev/null || die
if use static-analyzer ; then
pushd tools/scan-build >/dev/null || die
dobin ccc-analyzer scan-build
dosym ccc-analyzer /usr/bin/c++-analyzer
doman scan-build.1
insinto /usr/share/llvm
doins scanview.css sorttable.js
popd >/dev/null || die
fi
python_inst() {
if use static-analyzer ; then
pushd tools/scan-view >/dev/null || die
python_doscript scan-view
touch __init__.py || die
python_moduleinto clang
python_domodule *.py Resources
popd >/dev/null || die
fi
if use python ; then
pushd bindings/python/clang >/dev/null || die
python_moduleinto clang
python_domodule *.py
popd >/dev/null || die
fi
# AddressSanitizer symbolizer (currently separate)
python_doscript "${S}"/projects/compiler-rt/lib/asan/scripts/asan_symbolize.py
}
python_foreach_impl python_inst
popd >/dev/null || die
fi
}
pkg_postinst() {
if use clang; then
elog "To enable OpenMP support in clang, install sys-libs/libomp"
elog "and use the '-fopenmp=libomp' command line option"
fi
}

View File

@@ -174,6 +174,10 @@ src_prepare() {
# Allow custom cmake build types (like 'Gentoo')
epatch "${FILESDIR}"/cmake/${PN}-3.8-allow_custom_cmake_build_types.patch
# Fix llvm-config for shared linking and sane flags
# https://bugs.gentoo.org/show_bug.cgi?id=565358
epatch "${FILESDIR}"/llvm-3.7-llvm-config.patch
if use clang; then
# Automatically select active system GCC's libraries, bugs #406163 and #417913
epatch "${FILESDIR}"/clang-3.5-gentoo-runtime-gcc-detection-v3.patch