3
0
Fork 0
forked from mirrors/nixpkgs
nixpkgs/pkgs/development/compilers/llvm/3.7/llvm.nix
Jörg Thalheim b6bacc4bb2 llvmPackage_{3.4,3.5,3.7,3.8,3.9}: fix output of llvm-config
llvm-config is a tool to output compile and linker flags, when compiling against llvm.

The tool however outputs static library names despite libllvm is build
as shared library on nixos. This was fixed for llvm 3.4, 3.5 and 3.7.

For llvm 3.8 and 3.9 it printed the library extension twice (.so.so).
This was fixed in 4.0 and the patch is backported to 3.8 and 3.9 in
this pull request.

```
$ for i in 34 35 37 38 39; do echo "\nllvm-$i"; nix-shell -p llvmPackages_$i.llvm --run 'llvm-config --libnames'; done

llvm-34
libLLVMInstrumentation.so libLLVMIRReader.so libLLVMAsmParser.so
...

llvm-35
libLLVMLTO.so libLLVMObjCARCOpts.so libLLVMLinker.so libLLVMipo.so
...

llvm-37
libLLVMLTO.so libLLVMObjCARCOpts.so libLLVMLinker.so libLLVMBitWriter.so
...

llvm-38
libLLVM-3.8.1.so

llvm-39
libLLVM-3.9.so
```

fixes #26713
2017-06-20 10:22:06 +01:00

96 lines
2.7 KiB
Nix

{ stdenv
, fetch
, perl
, groff
, cmake
, python2
, libffi
, binutils
, libxml2
, valgrind
, ncurses
, version
, zlib
, compiler-rt_src
, libcxxabi
, debugVersion ? false
, enableSharedLibraries ? !stdenv.isDarwin
}:
let
src = fetch "llvm" "1masakdp9g2dan1yrazg7md5am2vacbkb3nahb3dchpc1knr8xxy";
in stdenv.mkDerivation rec {
name = "llvm-${version}";
unpackPhase = ''
unpackFile ${src}
mv llvm-${version}.src llvm
sourceRoot=$PWD/llvm
unpackFile ${compiler-rt_src}
mv compiler-rt-* $sourceRoot/projects/compiler-rt
'';
buildInputs = [ perl groff cmake libxml2 python2 libffi ]
++ stdenv.lib.optional stdenv.isDarwin libcxxabi;
propagatedBuildInputs = [ ncurses zlib ];
# The goal here is to disable LLVM bindings (currently go and ocaml) regardless
# of whether the impure CMake search sheananigans find the compilers in global
# paths. This mostly exists because sandbox builds don't work very well on Darwin
# and sometimes you get weird behavior if CMake finds go in your system path.
# This would be far prettier if there were a CMake option to just disable bindings
# but from what I can tell, there isn't such a thing. The file in question only
# contains `if(WIN32)` conditions to check whether to disable bindings, so making
# those always succeed has the net effect of disabling all bindings.
prePatch = ''
substituteInPlace cmake/config-ix.cmake --replace "if(WIN32)" "if(1)"
'';
# hacky fix: created binaries need to be run before installation
preBuild = ''
mkdir -p $out/
ln -sv $PWD/lib $out
'';
patches = stdenv.lib.optionals (!stdenv.isDarwin) [
# llvm-config --libfiles returns (non-existing) static libs
../fix-llvm-config.patch
];
cmakeFlags = with stdenv; [
"-DCMAKE_BUILD_TYPE=${if debugVersion then "Debug" else "Release"}"
"-DLLVM_INSTALL_UTILS=ON" # Needed by rustc
"-DLLVM_BUILD_TESTS=ON"
"-DLLVM_ENABLE_FFI=ON"
"-DLLVM_ENABLE_RTTI=ON"
] ++ stdenv.lib.optional enableSharedLibraries
"-DBUILD_SHARED_LIBS=ON"
++ stdenv.lib.optional (!isDarwin)
"-DLLVM_BINUTILS_INCDIR=${binutils.dev}/include"
++ stdenv.lib.optionals ( isDarwin) [
"-DLLVM_ENABLE_LIBCXX=ON"
"-DCAN_TARGET_i386=false"
];
NIX_LDFLAGS = "-lpthread"; # no idea what's the problem
postBuild = ''
rm -fR $out
paxmark m bin/{lli,llvm-rtdyld}
'';
enableParallelBuilding = true;
passthru.src = src;
meta = {
description = "Collection of modular and reusable compiler and toolchain technologies";
homepage = http://llvm.org/;
license = stdenv.lib.licenses.ncsa;
maintainers = with stdenv.lib.maintainers; [ lovek323 raskin viric ];
platforms = stdenv.lib.platforms.all;
};
}