aboutsummaryrefslogtreecommitdiff
path: root/infra/libkookie/nixpkgs/pkgs/build-support/alternatives
diff options
context:
space:
mode:
authorMx Kookie <kookie@spacekookie.de>2020-10-31 19:35:09 +0100
committerMx Kookie <kookie@spacekookie.de>2020-10-31 19:35:09 +0100
commitc4625b175f8200f643fd6e11010932ea44c78433 (patch)
treebce3f89888c8ac3991fa5569a878a9eab6801ccc /infra/libkookie/nixpkgs/pkgs/build-support/alternatives
parent49f735974dd103039ddc4cb576bb76555164a9e7 (diff)
parentd661aa56a8843e991261510c1bb28fdc2f6975ae (diff)
Add 'infra/libkookie/' from commit 'd661aa56a8843e991261510c1bb28fdc2f6975ae'
git-subtree-dir: infra/libkookie git-subtree-mainline: 49f735974dd103039ddc4cb576bb76555164a9e7 git-subtree-split: d661aa56a8843e991261510c1bb28fdc2f6975ae
Diffstat (limited to 'infra/libkookie/nixpkgs/pkgs/build-support/alternatives')
-rw-r--r--infra/libkookie/nixpkgs/pkgs/build-support/alternatives/blas/default.nix141
-rw-r--r--infra/libkookie/nixpkgs/pkgs/build-support/alternatives/lapack/default.nix107
2 files changed, 248 insertions, 0 deletions
diff --git a/infra/libkookie/nixpkgs/pkgs/build-support/alternatives/blas/default.nix b/infra/libkookie/nixpkgs/pkgs/build-support/alternatives/blas/default.nix
new file mode 100644
index 000000000000..5ebbc737e11a
--- /dev/null
+++ b/infra/libkookie/nixpkgs/pkgs/build-support/alternatives/blas/default.nix
@@ -0,0 +1,141 @@
+{ lib, stdenv
+, lapack-reference, openblasCompat, openblas
+, isILP64 ? false
+, blasProvider ? if isILP64 then openblas else openblasCompat }:
+
+let
+ blasFortranSymbols = [
+ "caxpy" "ccopy" "cdotc" "cdotu" "cgbmv" "cgemm" "cgemv" "cgerc" "cgeru"
+ "chbmv" "chemm" "chemv" "cher" "cher2" "cher2k" "cherk" "chpmv" "chpr"
+ "chpr2" "crotg" "cscal" "csrot" "csscal" "cswap" "csymm" "csyr2k" "csyrk"
+ "ctbmv" "ctbsv" "ctpmv" "ctpsv" "ctrmm" "ctrmv" "ctrsm" "ctrsv" "dasum"
+ "daxpy" "dcabs1" "dcopy" "ddot" "dgbmv" "dgemm" "dgemv" "dger" "dnrm2"
+ "drot" "drotg" "drotm" "drotmg" "dsbmv" "dscal" "dsdot" "dspmv" "dspr"
+ "dspr2" "dswap" "dsymm" "dsymv" "dsyr" "dsyr2" "dsyr2k" "dsyrk" "dtbmv"
+ "dtbsv" "dtpmv" "dtpsv" "dtrmm" "dtrmv" "dtrsm" "dtrsv" "dzasum" "dznrm2"
+ "icamax" "idamax" "isamax" "izamax" "lsame" "sasum" "saxpy" "scabs1"
+ "scasum" "scnrm2" "scopy" "sdot" "sdsdot" "sgbmv" "sgemm" "sgemv"
+ "sger" "snrm2" "srot" "srotg" "srotm" "srotmg" "ssbmv" "sscal" "sspmv"
+ "sspr" "sspr2" "sswap" "ssymm" "ssymv" "ssyr" "ssyr2" "ssyr2k" "ssyrk"
+ "stbmv" "stbsv" "stpmv" "stpsv" "strmm" "strmv" "strsm" "strsv" "xerbla"
+ "xerbla_array" "zaxpy" "zcopy" "zdotc" "zdotu" "zdrot" "zdscal" "zgbmv"
+ "zgemm" "zgemv" "zgerc" "zgeru" "zhbmv" "zhemm" "zhemv" "zher" "zher2"
+ "zher2k" "zherk" "zhpmv" "zhpr" "zhpr2" "zrotg" "zscal" "zswap" "zsymm"
+ "zsyr2k" "zsyrk" "ztbmv" "ztbsv" "ztpmv" "ztpsv" "ztrmm" "ztrmv" "ztrsm"
+ "ztrsv"
+ ];
+
+ version = "3";
+ canonicalExtension = if stdenv.hostPlatform.isLinux
+ then "${stdenv.hostPlatform.extensions.sharedLibrary}.${version}"
+ else stdenv.hostPlatform.extensions.sharedLibrary;
+
+
+ isILP64 = blasProvider.blas64 or false;
+ blasImplementation = lib.getName blasProvider;
+
+in
+
+assert isILP64 -> (blasImplementation == "openblas" && blasProvider.blas64) || blasImplementation == "mkl";
+
+stdenv.mkDerivation {
+ pname = "blas";
+ inherit version;
+
+ outputs = [ "out" "dev" ];
+
+ meta = (blasProvider.meta or {}) // {
+ description = "${lib.getName blasProvider} with just the BLAS C and FORTRAN ABI";
+ };
+
+ passthru = {
+ inherit isILP64;
+ provider = blasProvider;
+ implementation = blasImplementation;
+ };
+
+ dontBuild = true;
+ dontConfigure = true;
+ unpackPhase = "src=$PWD";
+
+ dontPatchELF = true;
+
+ installPhase = (''
+ mkdir -p $out/lib $dev/include $dev/lib/pkgconfig
+
+ libblas="${lib.getLib blasProvider}/lib/libblas${canonicalExtension}"
+
+ if ! [ -e "$libblas" ]; then
+ echo "$libblas does not exist, ${blasProvider.name} does not provide libblas."
+ exit 1
+ fi
+
+ $NM -an "$libblas" | cut -f3 -d' ' > symbols
+ for symbol in ${toString blasFortranSymbols}; do
+ grep -q "^$symbol_$" symbols || { echo "$symbol" was not found in "$libblas"; exit 1; }
+ done
+
+ cp -L "$libblas" $out/lib/libblas${canonicalExtension}
+ chmod +w $out/lib/libblas${canonicalExtension}
+
+'' + (if stdenv.hostPlatform.parsed.kernel.execFormat.name == "elf" then ''
+ patchelf --set-soname libblas${canonicalExtension} $out/lib/libblas${canonicalExtension}
+ patchelf --set-rpath "$(patchelf --print-rpath $out/lib/libblas${canonicalExtension}):${lib.getLib blasProvider}/lib" $out/lib/libblas${canonicalExtension}
+'' else if stdenv.hostPlatform.isDarwin then ''
+ install_name_tool \
+ -id libblas${canonicalExtension} \
+ -add_rpath ${lib.getLib blasProvider}/lib \
+ $out/lib/libblas${canonicalExtension}
+'' else "") + ''
+
+ if [ "$out/lib/libblas${canonicalExtension}" != "$out/lib/libblas${stdenv.hostPlatform.extensions.sharedLibrary}" ]; then
+ ln -s $out/lib/libblas${canonicalExtension} "$out/lib/libblas${stdenv.hostPlatform.extensions.sharedLibrary}"
+ fi
+
+ cat <<EOF > $dev/lib/pkgconfig/blas.pc
+Name: blas
+Version: ${version}
+Description: BLAS FORTRAN implementation
+Libs: -L$out/lib -lblas
+Cflags: -I$dev/include
+EOF
+
+ libcblas="${lib.getLib blasProvider}/lib/libcblas${canonicalExtension}"
+
+ if ! [ -e "$libcblas" ]; then
+ echo "$libcblas does not exist, ${blasProvider.name} does not provide libcblas."
+ exit 1
+ fi
+
+ cp -L "$libcblas" $out/lib/libcblas${canonicalExtension}
+ chmod +w $out/lib/libcblas${canonicalExtension}
+
+'' + (if stdenv.hostPlatform.parsed.kernel.execFormat.name == "elf" then ''
+ patchelf --set-soname libcblas${canonicalExtension} $out/lib/libcblas${canonicalExtension}
+ patchelf --set-rpath "$(patchelf --print-rpath $out/lib/libcblas${canonicalExtension}):${lib.getLib blasProvider}/lib" $out/lib/libcblas${canonicalExtension}
+'' else if stdenv.hostPlatform.isDarwin then ''
+ install_name_tool \
+ -id libcblas${canonicalExtension} \
+ -add_rpath ${lib.getLib blasProvider}/lib \
+ $out/lib/libcblas${canonicalExtension}
+'' else "") + ''
+ if [ "$out/lib/libcblas${canonicalExtension}" != "$out/lib/libcblas${stdenv.hostPlatform.extensions.sharedLibrary}" ]; then
+ ln -s $out/lib/libcblas${canonicalExtension} "$out/lib/libcblas${stdenv.hostPlatform.extensions.sharedLibrary}"
+ fi
+
+ cp ${lib.getDev lapack-reference}/include/cblas{,_mangling}.h $dev/include
+
+ cat <<EOF > $dev/lib/pkgconfig/cblas.pc
+Name: cblas
+Version: ${version}
+Description: BLAS C implementation
+Cflags: -I$dev/include
+Libs: -L$out/lib -lcblas
+EOF
+'' + stdenv.lib.optionalString (blasImplementation == "mkl") ''
+ mkdir -p $out/nix-support
+ echo 'export MKL_INTERFACE_LAYER=${lib.optionalString isILP64 "I"}LP64,GNU' > $out/nix-support/setup-hook
+ ln -s $out/lib/libblas${canonicalExtension} $out/lib/libmkl_rt${stdenv.hostPlatform.extensions.sharedLibrary}
+ ln -sf ${blasProvider}/include/* $dev/include
+'');
+}
diff --git a/infra/libkookie/nixpkgs/pkgs/build-support/alternatives/lapack/default.nix b/infra/libkookie/nixpkgs/pkgs/build-support/alternatives/lapack/default.nix
new file mode 100644
index 000000000000..98b458b778a7
--- /dev/null
+++ b/infra/libkookie/nixpkgs/pkgs/build-support/alternatives/lapack/default.nix
@@ -0,0 +1,107 @@
+{ lib, stdenv
+, lapack-reference, openblasCompat, openblas
+, isILP64 ? false
+, lapackProvider ? if isILP64 then openblas else openblasCompat }:
+
+let
+
+ version = "3";
+ canonicalExtension = if stdenv.hostPlatform.isLinux
+ then "${stdenv.hostPlatform.extensions.sharedLibrary}.${version}"
+ else stdenv.hostPlatform.extensions.sharedLibrary;
+
+ lapackImplementation = lib.getName lapackProvider;
+
+in
+
+assert isILP64 -> (lapackImplementation == "openblas" && lapackProvider.blas64) || lapackImplementation == "mkl";
+
+stdenv.mkDerivation {
+ pname = "lapack";
+ inherit version;
+
+ outputs = [ "out" "dev" ];
+
+ meta = (lapackProvider.meta or {}) // {
+ description = "${lib.getName lapackProvider} with just the LAPACK C and FORTRAN ABI";
+ };
+
+ passthru = {
+ inherit isILP64;
+ provider = lapackProvider;
+ implementation = lapackImplementation;
+ };
+
+ dontBuild = true;
+ dontConfigure = true;
+ unpackPhase = "src=$PWD";
+
+ dontPatchELF = true;
+
+ installPhase = (''
+ mkdir -p $out/lib $dev/include $dev/lib/pkgconfig
+
+ liblapack="${lib.getLib lapackProvider}/lib/liblapack${canonicalExtension}"
+
+ if ! [ -e "$liblapack" ]; then
+ echo "$liblapack does not exist, ${lapackProvider.name} does not provide liblapack."
+ exit 1
+ fi
+
+ cp -L "$liblapack" $out/lib/liblapack${canonicalExtension}
+ chmod +w $out/lib/liblapack${canonicalExtension}
+
+'' + (if stdenv.hostPlatform.parsed.kernel.execFormat.name == "elf" then ''
+ patchelf --set-soname liblapack${canonicalExtension} $out/lib/liblapack${canonicalExtension}
+ patchelf --set-rpath "$(patchelf --print-rpath $out/lib/liblapack${canonicalExtension}):${lapackProvider}/lib" $out/lib/liblapack${canonicalExtension}
+'' else "") + ''
+
+ if [ "$out/lib/liblapack${canonicalExtension}" != "$out/lib/liblapack${stdenv.hostPlatform.extensions.sharedLibrary}" ]; then
+ ln -s $out/lib/liblapack${canonicalExtension} "$out/lib/liblapack${stdenv.hostPlatform.extensions.sharedLibrary}"
+ fi
+
+ install -D ${lib.getDev lapack-reference}/include/lapack.h $dev/include/lapack.h
+
+ cat <<EOF > $dev/lib/pkgconfig/lapack.pc
+Name: lapack
+Version: ${version}
+Description: LAPACK FORTRAN implementation
+Cflags: -I$dev/include
+Libs: -L$out/lib -llapack
+EOF
+
+ liblapacke="${lib.getLib lapackProvider}/lib/liblapacke${canonicalExtension}"
+
+ if ! [ -e "$liblapacke" ]; then
+ echo "$liblapacke does not exist, ${lapackProvider.name} does not provide liblapacke."
+ exit 1
+ fi
+
+ cp -L "$liblapacke" $out/lib/liblapacke${canonicalExtension}
+ chmod +w $out/lib/liblapacke${canonicalExtension}
+
+'' + (if stdenv.hostPlatform.parsed.kernel.execFormat.name == "elf" then ''
+ patchelf --set-soname liblapacke${canonicalExtension} $out/lib/liblapacke${canonicalExtension}
+ patchelf --set-rpath "$(patchelf --print-rpath $out/lib/liblapacke${canonicalExtension}):${lib.getLib lapackProvider}/lib" $out/lib/liblapacke${canonicalExtension}
+'' else "") + ''
+
+ if [ -f "$out/lib/liblapacke.so.3" ]; then
+ ln -s $out/lib/liblapacke.so.3 $out/lib/liblapacke.so
+ fi
+
+ cp ${lib.getDev lapack-reference}/include/lapacke{,_mangling,_config}.h $dev/include
+
+ cat <<EOF > $dev/lib/pkgconfig/lapacke.pc
+Name: lapacke
+Version: ${version}
+Description: LAPACK C implementation
+Cflags: -I$dev/include
+Libs: -L$out/lib -llapacke
+EOF
+'' + stdenv.lib.optionalString (lapackImplementation == "mkl") ''
+ mkdir -p $out/nix-support
+ echo 'export MKL_INTERFACE_LAYER=${lib.optionalString isILP64 "I"}LP64,GNU' > $out/nix-support/setup-hook
+ ln -s $out/lib/liblapack${canonicalExtension} $out/lib/libmkl_rt${stdenv.hostPlatform.extensions.sharedLibrary}
+ ln -sf ${lapackProvider}/include/* $dev/include
+'');
+}