arrayfire: rename input some inputs; add comments
- Rename withCPU, withOpenCL, withCUDA to cpuSupport, openclSupport, cudaSupport, since cudaSupport is already used in Nixpkgs. - Replace clblast with one from Nixpkgs. - Get rid of the assets attribute. - Add some explanatory note.
This commit is contained in:
parent
1519be1234
commit
fab8a8fe38
2 changed files with 100 additions and 33 deletions
|
@ -1,5 +1,6 @@
|
||||||
{ blas
|
{ blas
|
||||||
, boost
|
, boost
|
||||||
|
, clblast
|
||||||
, cmake
|
, cmake
|
||||||
, config
|
, config
|
||||||
, cudaPackages
|
, cudaPackages
|
||||||
|
@ -21,10 +22,17 @@
|
||||||
, python3
|
, python3
|
||||||
, span-lite
|
, span-lite
|
||||||
, stdenv
|
, stdenv
|
||||||
|
# NOTE: We disable tests by default, because they cannot be run easily on
|
||||||
|
# non-NixOS systems when either CUDA or OpenCL support is enabled (CUDA and
|
||||||
|
# OpenCL need access to drivers that are installed outside of Nix on
|
||||||
|
# non-NixOS systems).
|
||||||
, doCheck ? false
|
, doCheck ? false
|
||||||
, withCPU ? true
|
, cpuSupport ? true
|
||||||
, withCuda ? config.cudaSupport
|
, cudaSupport ? config.cudaSupport
|
||||||
, withOpenCL ? stdenv.isLinux
|
# OpenCL needs mesa which is broken on Darwin
|
||||||
|
, openclSupport ? !stdenv.isDarwin
|
||||||
|
# This argument lets one run CUDA & OpenCL tests on non-NixOS systems by
|
||||||
|
# telling Nix where to find the drivers.
|
||||||
, nvidiaComputeDrivers ? null
|
, nvidiaComputeDrivers ? null
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
@ -41,18 +49,11 @@ stdenv.mkDerivation rec {
|
||||||
hash = "sha256-9r1w0U9MvhduHwBpEWpqkrQPawd94EY3FAqSJghi09I=";
|
hash = "sha256-9r1w0U9MvhduHwBpEWpqkrQPawd94EY3FAqSJghi09I=";
|
||||||
};
|
};
|
||||||
|
|
||||||
assets = fetchFromGitHub {
|
# We cannot use the clfft from Nixpkgs because ArrayFire maintain a fork
|
||||||
owner = pname;
|
# of clfft where they've modified the CMake build system, and the
|
||||||
repo = "assets";
|
# CMakeLists.txt of ArrayFire assumes that we're using that fork.
|
||||||
rev = "cd08d749611b324012555ad6f23fd76c5465bd6c";
|
#
|
||||||
sha256 = "sha256-v4uhqPz1P1g1430FTmMp22xJS50bb5hZTeEX49GgMWg=";
|
# This can be removed once ArrayFire upstream their changes.
|
||||||
};
|
|
||||||
clblast = fetchFromGitHub {
|
|
||||||
owner = "cnugteren";
|
|
||||||
repo = "CLBlast";
|
|
||||||
rev = "4500a03440e2cc54998c0edab366babf5e504d67";
|
|
||||||
sha256 = "sha256-I25ylQp6kHZx6Q7Ph5r3abWlQ6yeIHIDdS1eGCyArZ0=";
|
|
||||||
};
|
|
||||||
clfft = fetchFromGitHub {
|
clfft = fetchFromGitHub {
|
||||||
owner = pname;
|
owner = pname;
|
||||||
repo = "clfft";
|
repo = "clfft";
|
||||||
|
@ -77,6 +78,9 @@ stdenv.mkDerivation rec {
|
||||||
rev = "a5f533d7b864a4d8f0dd7c9aaad5ff06018c4867";
|
rev = "a5f533d7b864a4d8f0dd7c9aaad5ff06018c4867";
|
||||||
sha256 = "sha256-AWzhsrDXyZrQN2bd0Ng/XlE8v02x7QWTiFTyaAuRXSw=";
|
sha256 = "sha256-AWzhsrDXyZrQN2bd0Ng/XlE8v02x7QWTiFTyaAuRXSw=";
|
||||||
};
|
};
|
||||||
|
# ArrayFire fails to compile with newer versions of spdlog, so we can't use
|
||||||
|
# the one in Nixpkgs. Once they upgrade, we can switch to using spdlog from
|
||||||
|
# Nixpkgs.
|
||||||
spdlog = fetchFromGitHub {
|
spdlog = fetchFromGitHub {
|
||||||
owner = "gabime";
|
owner = "gabime";
|
||||||
repo = "spdlog";
|
repo = "spdlog";
|
||||||
|
@ -86,35 +90,46 @@ stdenv.mkDerivation rec {
|
||||||
|
|
||||||
cmakeFlags = [
|
cmakeFlags = [
|
||||||
"-DBUILD_TESTING=ON"
|
"-DBUILD_TESTING=ON"
|
||||||
|
# We do not build examples, because building tests already takes long enough...
|
||||||
"-DAF_BUILD_EXAMPLES=OFF"
|
"-DAF_BUILD_EXAMPLES=OFF"
|
||||||
"-DAF_COMPUTE_LIBRARY='FFTW/LAPACK/BLAS'"
|
# No need to build forge, because it's a separate package
|
||||||
"-DAF_TEST_WITH_MTX_FILES=OFF"
|
|
||||||
"-DAF_WITH_SPDLOG_HEADER_ONLY=ON"
|
|
||||||
"-DAF_BUILD_FORGE=OFF"
|
"-DAF_BUILD_FORGE=OFF"
|
||||||
(if withCPU then "-DAF_BUILD_CPU=ON" else "-DAF_BUILD_CPU=OFF")
|
"-DAF_COMPUTE_LIBRARY='FFTW/LAPACK/BLAS'"
|
||||||
(if withOpenCL then "-DAF_BUILD_OPENCL=ON" else "-DAF_BUILD_OPENCL=OFF")
|
# Prevent ArrayFire from trying to download some matrices from the Internet
|
||||||
(if withCuda then "-DAF_BUILD_CUDA=ON" else "-DAF_BUILD_CUDA=OFF")
|
"-DAF_TEST_WITH_MTX_FILES=OFF"
|
||||||
] ++ lib.optionals withCuda [
|
# Have to use the header-only version, because we're not using the version
|
||||||
|
# from Nixpkgs. Otherwise, libaf.so won't be able to find the shared
|
||||||
|
# library, because ArrayFire's CMake files do not run the install step of
|
||||||
|
# spdlog.
|
||||||
|
"-DAF_WITH_SPDLOG_HEADER_ONLY=ON"
|
||||||
|
(if cpuSupport then "-DAF_BUILD_CPU=ON" else "-DAF_BUILD_CPU=OFF")
|
||||||
|
(if openclSupport then "-DAF_BUILD_OPENCL=ON" else "-DAF_BUILD_OPENCL=OFF")
|
||||||
|
(if cudaSupport then "-DAF_BUILD_CUDA=ON" else "-DAF_BUILD_CUDA=OFF")
|
||||||
|
] ++ lib.optionals cudaSupport [
|
||||||
|
# ArrayFire use deprecated FindCUDA in their CMake files, so we help CMake
|
||||||
|
# locate cudatoolkit.
|
||||||
"-DCUDA_LIBRARIES_PATH=${cudaPackages.cudatoolkit}/lib"
|
"-DCUDA_LIBRARIES_PATH=${cudaPackages.cudatoolkit}/lib"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
# ArrayFire have a repo with assets for the examples. Since we don't build
|
||||||
|
# the examples anyway, remove the dependency on assets.
|
||||||
|
patches = [ ./no-assets.patch ];
|
||||||
|
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
mkdir -p ./extern/af_glad-src
|
mkdir -p ./extern/af_glad-src
|
||||||
mkdir -p ./extern/af_threads-src
|
mkdir -p ./extern/af_threads-src
|
||||||
mkdir -p ./extern/af_assets-src
|
|
||||||
mkdir -p ./extern/af_test_data-src
|
mkdir -p ./extern/af_test_data-src
|
||||||
mkdir -p ./extern/ocl_clfft-src
|
mkdir -p ./extern/ocl_clfft-src
|
||||||
mkdir -p ./extern/ocl_clblast-src
|
|
||||||
mkdir -p ./extern/nv_cub-src
|
|
||||||
mkdir -p ./extern/spdlog-src
|
mkdir -p ./extern/spdlog-src
|
||||||
cp -R --no-preserve=mode,ownership ${glad}/* ./extern/af_glad-src/
|
cp -R --no-preserve=mode,ownership ${glad}/* ./extern/af_glad-src/
|
||||||
cp -R --no-preserve=mode,ownership ${threads}/* ./extern/af_threads-src/
|
cp -R --no-preserve=mode,ownership ${threads}/* ./extern/af_threads-src/
|
||||||
cp -R --no-preserve=mode,ownership ${assets}/* ./extern/af_assets-src/
|
|
||||||
cp -R --no-preserve=mode,ownership ${test-data}/* ./extern/af_test_data-src/
|
cp -R --no-preserve=mode,ownership ${test-data}/* ./extern/af_test_data-src/
|
||||||
cp -R --no-preserve=mode,ownership ${clfft}/* ./extern/ocl_clfft-src/
|
cp -R --no-preserve=mode,ownership ${clfft}/* ./extern/ocl_clfft-src/
|
||||||
cp -R --no-preserve=mode,ownership ${clblast}/* ./extern/ocl_clblast-src/
|
|
||||||
cp -R --no-preserve=mode,ownership ${spdlog}/* ./extern/spdlog-src/
|
cp -R --no-preserve=mode,ownership ${spdlog}/* ./extern/spdlog-src/
|
||||||
|
|
||||||
|
# libaf.so (the unified backend) tries to load the right shared library at
|
||||||
|
# runtime, and the search paths are hard-coded... We tweak them to point to
|
||||||
|
# the installation directory in the Nix store.
|
||||||
substituteInPlace src/api/unified/symbol_manager.cpp \
|
substituteInPlace src/api/unified/symbol_manager.cpp \
|
||||||
--replace '"/opt/arrayfire-3/lib/",' \
|
--replace '"/opt/arrayfire-3/lib/",' \
|
||||||
"\"$out/lib/\", \"/opt/arrayfire-3/lib/\","
|
"\"$out/lib/\", \"/opt/arrayfire-3/lib/\","
|
||||||
|
@ -125,29 +140,36 @@ stdenv.mkDerivation rec {
|
||||||
let
|
let
|
||||||
LD_LIBRARY_PATH = builtins.concatStringsSep ":" (
|
LD_LIBRARY_PATH = builtins.concatStringsSep ":" (
|
||||||
[ "${forge}/lib" "${freeimage}/lib" ]
|
[ "${forge}/lib" "${freeimage}/lib" ]
|
||||||
++ lib.optional withCuda "${cudaPackages.cudatoolkit}/lib64"
|
++ lib.optional cudaSupport "${cudaPackages.cudatoolkit}/lib64"
|
||||||
|
# On non-NixOS systems, help the tests find Nvidia drivers
|
||||||
++ lib.optional (nvidiaComputeDrivers != null) "${nvidiaComputeDrivers}/lib"
|
++ lib.optional (nvidiaComputeDrivers != null) "${nvidiaComputeDrivers}/lib"
|
||||||
);
|
);
|
||||||
ctestFlags = builtins.concatStringsSep " " (
|
ctestFlags = builtins.concatStringsSep " " (
|
||||||
|
# We have to run with "-j1" otherwise various segfaults occur on non-NixOS systems.
|
||||||
[ "--output-on-errors" "-j1" ]
|
[ "--output-on-errors" "-j1" ]
|
||||||
# See https://github.com/arrayfire/arrayfire/issues/3484
|
# See https://github.com/arrayfire/arrayfire/issues/3484
|
||||||
++ lib.optional withOpenCL "-E '(inverse_dense|cholesky_dense)'"
|
++ lib.optional openclSupport "-E '(inverse_dense|cholesky_dense)'"
|
||||||
);
|
);
|
||||||
in
|
in
|
||||||
''
|
''
|
||||||
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
|
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
|
||||||
'' + lib.optionalString (withOpenCL && nvidiaComputeDrivers != null) ''
|
'' +
|
||||||
|
# On non-NixOS systems, help the tests find Nvidia drivers
|
||||||
|
lib.optionalString (openclSupport && nvidiaComputeDrivers != null) ''
|
||||||
export OCL_ICD_VENDORS=${nvidiaComputeDrivers}/etc/OpenCL/vendors
|
export OCL_ICD_VENDORS=${nvidiaComputeDrivers}/etc/OpenCL/vendors
|
||||||
'' + ''
|
'' + ''
|
||||||
AF_TRACE=all AF_PRINT_ERRORS=1 ctest ${ctestFlags}
|
# Note: for debugging, enable AF_TRACE=all
|
||||||
|
AF_PRINT_ERRORS=1 ctest ${ctestFlags}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
blas
|
blas
|
||||||
boost.dev
|
boost.dev
|
||||||
boost.out
|
boost.out
|
||||||
|
clblast
|
||||||
fftw
|
fftw
|
||||||
fftwFloat
|
fftwFloat
|
||||||
|
# We need fmt_9 because ArrayFire fails to compile with newer versions.
|
||||||
fmt_9
|
fmt_9
|
||||||
forge
|
forge
|
||||||
freeimage
|
freeimage
|
||||||
|
@ -158,17 +180,21 @@ stdenv.mkDerivation rec {
|
||||||
opencl-clhpp
|
opencl-clhpp
|
||||||
span-lite
|
span-lite
|
||||||
]
|
]
|
||||||
++ lib.optionals withCuda [
|
++ lib.optionals cudaSupport [
|
||||||
cudaPackages.cudatoolkit
|
cudaPackages.cudatoolkit
|
||||||
cudaPackages.cudnn
|
cudaPackages.cudnn
|
||||||
cudaPackages.cuda_cccl
|
cudaPackages.cuda_cccl
|
||||||
]
|
]
|
||||||
++ lib.optionals withOpenCL [
|
++ lib.optionals openclSupport [
|
||||||
mesa
|
mesa
|
||||||
];
|
];
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
cmake
|
cmake
|
||||||
|
# ArrayFire have their own CMake functions for downloading the
|
||||||
|
# dependencies, and it uses git. Even though we bypass that system by
|
||||||
|
# downloading the dependencies beforehand, CMake files still invoke git for
|
||||||
|
# checking...
|
||||||
git
|
git
|
||||||
pkg-config
|
pkg-config
|
||||||
python3
|
python3
|
||||||
|
|
41
pkgs/development/libraries/arrayfire/no-assets.patch
Normal file
41
pkgs/development/libraries/arrayfire/no-assets.patch
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index deafa7a75..b9ca54621 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -320,11 +320,11 @@ if(NOT TARGET nonstd::span-lite)
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
-af_dep_check_and_populate(${assets_prefix}
|
||||||
|
- URI https://github.com/arrayfire/assets.git
|
||||||
|
- REF master
|
||||||
|
-)
|
||||||
|
-set(ASSETS_DIR ${${assets_prefix}_SOURCE_DIR})
|
||||||
|
+# af_dep_check_and_populate(${assets_prefix}
|
||||||
|
+# URI https://github.com/arrayfire/assets.git
|
||||||
|
+# REF master
|
||||||
|
+# )
|
||||||
|
+# set(ASSETS_DIR ${${assets_prefix}_SOURCE_DIR})
|
||||||
|
|
||||||
|
# when crosscompiling use the bin2cpp file from the native bin directory
|
||||||
|
if(CMAKE_CROSSCOMPILING)
|
||||||
|
@@ -477,13 +477,13 @@ install(FILES ${ArrayFire_BINARY_DIR}/include/af/version.h
|
||||||
|
# source files does not depend on AF_BUILD_EXAMPLES
|
||||||
|
# when AF_BUILD_EXAMPLES is OFF, the examples source is installed without
|
||||||
|
# building the example executables
|
||||||
|
-install(DIRECTORY examples/ #NOTE The slash at the end is important
|
||||||
|
- DESTINATION ${AF_INSTALL_EXAMPLE_DIR}
|
||||||
|
- COMPONENT examples)
|
||||||
|
+# install(DIRECTORY examples/ #NOTE The slash at the end is important
|
||||||
|
+# DESTINATION ${AF_INSTALL_EXAMPLE_DIR}
|
||||||
|
+# COMPONENT examples)
|
||||||
|
|
||||||
|
-install(DIRECTORY ${ASSETS_DIR}/examples/ #NOTE The slash at the end is important
|
||||||
|
- DESTINATION ${AF_INSTALL_EXAMPLE_DIR}
|
||||||
|
- COMPONENT examples)
|
||||||
|
+#install(DIRECTORY ${ASSETS_DIR}/examples/ #NOTE The slash at the end is important
|
||||||
|
+# DESTINATION ${AF_INSTALL_EXAMPLE_DIR}
|
||||||
|
+# COMPONENT examples)
|
||||||
|
|
||||||
|
install(DIRECTORY "${ArrayFire_SOURCE_DIR}/LICENSES/"
|
||||||
|
DESTINATION LICENSES
|
Loading…
Reference in a new issue