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}