Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at devShellTools-shell 136 lines 4.3 kB view raw
1{ 2 lib, 3 stdenv, 4 lapack-reference, 5 openblas, 6 isILP64 ? false, 7 lapackProvider ? openblas, 8}: 9 10let 11 12 libraryExtension = stdenv.hostPlatform.extensions.sharedLibrary or ".a"; 13 version = "3"; 14 canonicalExtension = 15 if stdenv.hostPlatform.isLinux then 16 if stdenv.hostPlatform.extensions ? sharedLibrary then 17 "${stdenv.hostPlatform.extensions.sharedLibrary}.${version}" 18 else 19 ".a" 20 else 21 libraryExtension; 22 23 lapackImplementation = lib.getName lapackProvider; 24 lapackProvider' = 25 if lapackImplementation == "mkl" then 26 lapackProvider 27 else 28 lapackProvider.override { blas64 = isILP64; }; 29 30in 31 32assert isILP64 -> lapackImplementation == "mkl" || lapackProvider'.blas64; 33 34stdenv.mkDerivation { 35 pname = "lapack"; 36 inherit version; 37 38 outputs = [ 39 "out" 40 "dev" 41 ]; 42 43 meta = (lapackProvider'.meta or { }) // { 44 description = "${lib.getName lapackProvider'} with just the LAPACK C and FORTRAN ABI"; 45 }; 46 47 passthru = { 48 inherit isILP64; 49 provider = lapackProvider'; 50 implementation = lapackImplementation; 51 }; 52 53 # TODO: drop this forced rebuild, as it was needed just once. 54 rebuild_salt = 55 if stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64 then "J4AQ" else null; 56 57 dontBuild = true; 58 dontConfigure = true; 59 unpackPhase = "src=$PWD"; 60 61 dontPatchELF = true; 62 63 installPhase = ( 64 '' 65 mkdir -p $out/lib $dev/include $dev/lib/pkgconfig 66 67 liblapack="${lib.getLib lapackProvider'}/lib/liblapack${canonicalExtension}" 68 69 if ! [ -e "$liblapack" ]; then 70 echo "$liblapack does not exist, ${lapackProvider'.name} does not provide liblapack." 71 exit 1 72 fi 73 74 cp -L "$liblapack" $out/lib/liblapack${canonicalExtension} 75 chmod +w $out/lib/liblapack${canonicalExtension} 76 77 '' 78 + (lib.optionalString (stdenv.hostPlatform.isElf && !stdenv.hostPlatform.isStatic) '' 79 patchelf --set-soname liblapack${canonicalExtension} $out/lib/liblapack${canonicalExtension} 80 patchelf --set-rpath "$(patchelf --print-rpath $out/lib/liblapack${canonicalExtension}):${lapackProvider'}/lib" $out/lib/liblapack${canonicalExtension} 81 '') 82 + '' 83 84 if [ "$out/lib/liblapack${canonicalExtension}" != "$out/lib/liblapack${libraryExtension}" ]; then 85 ln -s $out/lib/liblapack${canonicalExtension} "$out/lib/liblapack${libraryExtension}" 86 fi 87 88 install -D ${lib.getDev lapack-reference}/include/lapack.h $dev/include/lapack.h 89 90 cat <<EOF > $dev/lib/pkgconfig/lapack.pc 91 Name: lapack 92 Version: ${version} 93 Description: LAPACK FORTRAN implementation 94 Cflags: -I$dev/include 95 Libs: -L$out/lib -llapack 96 EOF 97 98 liblapacke="${lib.getLib lapackProvider'}/lib/liblapacke${canonicalExtension}" 99 100 if ! [ -e "$liblapacke" ]; then 101 echo "$liblapacke does not exist, ${lapackProvider'.name} does not provide liblapacke." 102 exit 1 103 fi 104 105 cp -L "$liblapacke" $out/lib/liblapacke${canonicalExtension} 106 chmod +w $out/lib/liblapacke${canonicalExtension} 107 108 '' 109 + (lib.optionalString (stdenv.hostPlatform.isElf && !stdenv.hostPlatform.isStatic) '' 110 patchelf --set-soname liblapacke${canonicalExtension} $out/lib/liblapacke${canonicalExtension} 111 patchelf --set-rpath "$(patchelf --print-rpath $out/lib/liblapacke${canonicalExtension}):${lib.getLib lapackProvider'}/lib" $out/lib/liblapacke${canonicalExtension} 112 '') 113 + '' 114 115 if [ -f "$out/lib/liblapacke.so.3" ]; then 116 ln -s $out/lib/liblapacke.so.3 $out/lib/liblapacke.so 117 fi 118 119 cp ${lib.getDev lapack-reference}/include/lapacke{,_mangling,_config,_utils}.h $dev/include 120 121 cat <<EOF > $dev/lib/pkgconfig/lapacke.pc 122 Name: lapacke 123 Version: ${version} 124 Description: LAPACK C implementation 125 Cflags: -I$dev/include 126 Libs: -L$out/lib -llapacke 127 EOF 128 '' 129 + lib.optionalString (lapackImplementation == "mkl") '' 130 mkdir -p $out/nix-support 131 echo 'export MKL_INTERFACE_LAYER=${lib.optionalString isILP64 "I"}LP64,GNU' > $out/nix-support/setup-hook 132 ln -s $out/lib/liblapack${canonicalExtension} $out/lib/libmkl_rt${libraryExtension} 133 ln -sf ${lapackProvider'}/include/* $dev/include 134 '' 135 ); 136}