mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-01-23 13:24:29 +00:00
fece3eb2e9
Build the llvm support libraries (libcxx, libcxxabi) from scratch without using the existing llvm libraries. This is the same spirit and similar implementation as the "useLLVM" bootstrap in llvm package sets. Critically it avoids having libcxxabi provided by the cc-wrapper when building libcxx, which otherwise results in two libcxxabi instances. $ otool -L /nix/store/vd4vvgs9xngqbjzpg3qc41wl6jh42s9i-libc++-7.1.0/lib/libc++.dylib /nix/store/vd4vvgs9xngqbjzpg3qc41wl6jh42s9i-libc++-7.1.0/lib/libc++.dylib: /nix/store/vd4vvgs9xngqbjzpg3qc41wl6jh42s9i-libc++-7.1.0/lib/libc++.1.0.dylib (compatibility version 1.0.0, current version 1.0.0) /nix/store/gmpwk5fyp3iasppqrrdpswxvid6kcp8r-libc++abi-7.1.0/lib/libc++abi.dylib (compatibility version 1.0.0, current version 1.0.0) /nix/store/3hn7azynqgp2pm5gpdg45gpq0ia72skg-libc++abi-7.1.0/lib/libc++abi.dylib (compatibility version 1.0.0, current version 1.0.0) /nix/store/1nq94scbxs6bk7pimqhvz76q6cfmbv97-Libsystem-osx-10.12.6/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) Additionally move some utilities (clang, binutils, coreutils, gnugrep) to the stage layers so they can be replaced before the final stdenv. This should cause most of stage4 to be built from the toolchain assembled as of stage3 instead of the bootstrap toolchain.
58 lines
2.2 KiB
Nix
58 lines
2.2 KiB
Nix
{ stdenv, cmake, fetch, libcxx, llvm, version
|
|
, standalone ? false
|
|
# on musl the shared objects don't build
|
|
, enableShared ? ! stdenv.hostPlatform.isMusl }:
|
|
|
|
stdenv.mkDerivation {
|
|
pname = "libc++abi";
|
|
inherit version;
|
|
|
|
src = fetch "libcxxabi" "1zcqxsdjhawgz1cvpk07y3jl6fg9p3ay4nl69zsirqb2ghgyhhb2";
|
|
|
|
nativeBuildInputs = [ cmake ];
|
|
|
|
postUnpack = ''
|
|
unpackFile ${libcxx.src}
|
|
unpackFile ${llvm.src}
|
|
cmakeFlagsArray=($cmakeFlagsArray -DLLVM_PATH=$PWD/$(ls -d llvm-*) -DLIBCXXABI_LIBCXX_PATH=$PWD/$(ls -d libcxx-*) )
|
|
'' + stdenv.lib.optionalString stdenv.isDarwin ''
|
|
export TRIPLE=x86_64-apple-darwin
|
|
'' + stdenv.lib.optionalString stdenv.hostPlatform.isMusl ''
|
|
patch -p1 -d $(ls -d libcxx-*) -i ${../libcxx-0001-musl-hacks.patch}
|
|
'';
|
|
|
|
cmakeFlags =
|
|
stdenv.lib.optional standalone "-DLLVM_ENABLE_LIBCXX=ON" ++
|
|
stdenv.lib.optional (!enableShared) "-DLIBCXXABI_ENABLE_SHARED=OFF";
|
|
|
|
installPhase = if stdenv.isDarwin
|
|
then ''
|
|
for file in lib/*.dylib; do
|
|
# this should be done in CMake, but having trouble figuring out
|
|
# the magic combination of necessary CMake variables
|
|
# if you fancy a try, take a look at
|
|
# https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling
|
|
install_name_tool -id $out/$file $file
|
|
done
|
|
make install
|
|
install -d 755 $out/include
|
|
install -m 644 ../include/*.h $out/include
|
|
''
|
|
else ''
|
|
install -d -m 755 $out/include $out/lib
|
|
install -m 644 lib/libc++abi.a $out/lib
|
|
${stdenv.lib.optionalString enableShared "install -m 644 lib/libc++abi.so.1.0 $out/lib"}
|
|
install -m 644 ../include/cxxabi.h $out/include
|
|
${stdenv.lib.optionalString enableShared "ln -s libc++abi.so.1.0 $out/lib/libc++abi.so"}
|
|
${stdenv.lib.optionalString enableShared "ln -s libc++abi.so.1.0 $out/lib/libc++abi.so.1"}
|
|
'';
|
|
|
|
meta = {
|
|
homepage = "https://libcxxabi.llvm.org/";
|
|
description = "A new implementation of low level support for a standard C++ library";
|
|
license = with stdenv.lib.licenses; [ ncsa mit ];
|
|
maintainers = with stdenv.lib.maintainers; [ vlstill ];
|
|
platforms = stdenv.lib.platforms.unix;
|
|
};
|
|
}
|