diff options
author | Alyssa Ross <hi@alyssa.is> | 2023-12-01 19:00:09 +0100 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2023-12-01 19:00:09 +0100 |
commit | 9e9b07490d5bab5d115c66b80bdb10ff0c11ed8d (patch) | |
tree | 4368f9e4cb2d5b93a956c085337e45cb70f1e331 /nixpkgs/pkgs/development/libraries/arrayfire | |
parent | a9cbfb6941b47d6f50129e6e36927882392daed7 (diff) | |
parent | 2344fe1da14cb08b0c18743b207995f9b8597915 (diff) | |
download | nixlib-9e9b07490d5bab5d115c66b80bdb10ff0c11ed8d.tar nixlib-9e9b07490d5bab5d115c66b80bdb10ff0c11ed8d.tar.gz nixlib-9e9b07490d5bab5d115c66b80bdb10ff0c11ed8d.tar.bz2 nixlib-9e9b07490d5bab5d115c66b80bdb10ff0c11ed8d.tar.lz nixlib-9e9b07490d5bab5d115c66b80bdb10ff0c11ed8d.tar.xz nixlib-9e9b07490d5bab5d115c66b80bdb10ff0c11ed8d.tar.zst nixlib-9e9b07490d5bab5d115c66b80bdb10ff0c11ed8d.zip |
Merge https://github.com/NixOS/nixpkgs
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/arrayfire')
3 files changed, 248 insertions, 86 deletions
diff --git a/nixpkgs/pkgs/development/libraries/arrayfire/default.nix b/nixpkgs/pkgs/development/libraries/arrayfire/default.nix index 2c1caf0bbb2b..5c4336572b8f 100644 --- a/nixpkgs/pkgs/development/libraries/arrayfire/default.nix +++ b/nixpkgs/pkgs/development/libraries/arrayfire/default.nix @@ -1,91 +1,215 @@ -{ lib -, stdenv -, fetchFromGitHub +{ blas +, boost +, clblast , cmake -, pkg-config -, opencl-clhpp -, ocl-icd +, config +, cudaPackages +, fetchFromGitHub , fftw , fftwFloat -, blas +, fmt_9 +, forge +, freeimage +, gtest , lapack -, boost -, mesa -, libGLU +, lib , libGL -, freeimage +, mesa +, ocl-icd +, opencl-clhpp +, pkg-config , python3 -, clfft -, clblas -, doxygen -, buildDocs ? false -, config +, span-lite +, 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 +, cpuSupport ? true , cudaSupport ? config.cudaSupport -, cudatoolkit -, darwin + # 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. If you know the version of the + # NVidia driver that is installed on your system, you can do: + # + # arrayfire.override { + # nvidiaComputeDrivers = + # callPackage + # (prev.linuxPackages.nvidiaPackages.mkDriver { + # version = cudaVersion; # our driver version + # sha256_64bit = cudaHash; # sha256 of the .run binary + # useGLVND = false; + # useProfiles = false; + # useSettings = false; + # usePersistenced = false; + # ... + # }) + # { libsOnly = true; }; + # } +, nvidiaComputeDrivers ? null }: +# ArrayFire compiles with 64-bit BLAS, but some tests segfault or throw +# exceptions, which means that it isn't really supported yet... +assert blas.isILP64 == false; + stdenv.mkDerivation rec { pname = "arrayfire"; - version = "3.7.3"; + version = "3.9.0"; src = fetchFromGitHub { owner = pname; repo = pname; - rev = "v${version}"; - sha256 = "0gcbg6b6gs38xhks5pp0vkcqs89zl7rh9982jqlzsd0h724qddw0"; - fetchSubmodules = true; + rev = "v3.9.0"; + hash = "sha256-80fxdkaeAQ5u0X/UGPaI/900cdkZ/vXNcOn5tkZ+C3Y="; + }; + + # We cannot use the clfft from Nixpkgs because ArrayFire maintain a fork + # of clfft where they've modified the CMake build system, and the + # CMakeLists.txt of ArrayFire assumes that we're using that fork. + # + # This can be removed once ArrayFire upstream their changes. + clfft = fetchFromGitHub { + owner = pname; + repo = "clfft"; + rev = "760096b37dcc4f18ccd1aac53f3501a83b83449c"; + sha256 = "sha256-vJo1YfC2AJIbbRj/zTfcOUmi0Oj9v64NfA9MfK8ecoY="; + }; + glad = fetchFromGitHub { + owner = pname; + repo = "glad"; + rev = "ef8c5508e72456b714820c98e034d9a55b970650"; + sha256 = "sha256-u9Vec7XLhE3xW9vzM7uuf+b18wZsh/VMtGbB6nMVlno="; + }; + threads = fetchFromGitHub { + owner = pname; + repo = "threads"; + rev = "4d4a4f0384d1ac2f25b2c4fc1d57b9e25f4d6818"; + sha256 = "sha256-qqsT9woJDtQvzuV323OYXm68pExygYs/+zZNmg2sN34="; + }; + test-data = fetchFromGitHub { + owner = pname; + repo = "arrayfire-data"; + rev = "a5f533d7b864a4d8f0dd7c9aaad5ff06018c4867"; + 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 { + owner = "gabime"; + repo = "spdlog"; + rev = "v1.9.2"; + hash = "sha256-GSUdHtvV/97RyDKy8i+ticnSlQCubGGWHg4Oo+YAr8Y="; }; cmakeFlags = [ - "-DAF_BUILD_OPENCL=OFF" + "-DBUILD_TESTING=ON" + # We do not build examples, because building tests already takes long enough... "-DAF_BUILD_EXAMPLES=OFF" - "-DBUILD_TESTING=OFF" - ] ++ lib.optional cudaSupport "-DCMAKE_LIBRARY_PATH=${cudatoolkit}/lib/stubs"; + # No need to build forge, because it's a separate package + "-DAF_BUILD_FORGE=OFF" + "-DAF_COMPUTE_LIBRARY='FFTW/LAPACK/BLAS'" + # Prevent ArrayFire from trying to download some matrices from the Internet + "-DAF_TEST_WITH_MTX_FILES=OFF" + # 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" + ]; - patches = [ ./no-download.patch ]; + # 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 ./no-download.patch ]; postPatch = '' - mkdir -p ./build/third_party/clFFT/src - cp -R --no-preserve=mode,ownership ${clfft.src}/ ./build/third_party/clFFT/src/clFFT-ext/ - mkdir -p ./build/third_party/clBLAS/src - cp -R --no-preserve=mode,ownership ${clblas.src}/ ./build/third_party/clBLAS/src/clBLAS-ext/ - mkdir -p ./build/include/CL - cp -R --no-preserve=mode,ownership ${opencl-clhpp}/include/CL/cl2.hpp ./build/include/CL/cl2.hpp - ''; + mkdir -p ./extern/af_glad-src + mkdir -p ./extern/af_threads-src + mkdir -p ./extern/af_test_data-src + mkdir -p ./extern/ocl_clfft-src + mkdir -p ./extern/spdlog-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 ${test-data}/* ./extern/af_test_data-src/ + cp -R --no-preserve=mode,ownership ${clfft}/* ./extern/ocl_clfft-src/ + cp -R --no-preserve=mode,ownership ${spdlog}/* ./extern/spdlog-src/ - preBuild = lib.optionalString cudaSupport '' - export CUDA_PATH="${cudatoolkit}" + # 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 \ + --replace '"/opt/arrayfire-3/lib/",' \ + "\"$out/lib/\", \"/opt/arrayfire-3/lib/\"," ''; - nativeBuildInputs = [ - cmake - pkg-config - python3 - ]; - - strictDeps = true; + inherit doCheck; + checkPhase = + let + LD_LIBRARY_PATH = builtins.concatStringsSep ":" ( + [ "${forge}/lib" "${freeimage}/lib" ] + ++ lib.optional cudaSupport "${cudaPackages.cudatoolkit}/lib64" + # On non-NixOS systems, help the tests find Nvidia drivers + ++ lib.optional (nvidiaComputeDrivers != null) "${nvidiaComputeDrivers}/lib" + ); + ctestFlags = builtins.concatStringsSep " " ( + # We have to run with "-j1" otherwise various segfaults occur on non-NixOS systems. + [ "--output-on-errors" "-j1" ] + # See https://github.com/arrayfire/arrayfire/issues/3484 + ++ lib.optional openclSupport "-E '(inverse_dense|cholesky_dense)'" + ); + in + '' + export LD_LIBRARY_PATH=${LD_LIBRARY_PATH} + '' + + # On non-NixOS systems, help the tests find Nvidia drivers + lib.optionalString (openclSupport && nvidiaComputeDrivers != null) '' + export OCL_ICD_VENDORS=${nvidiaComputeDrivers}/etc/OpenCL/vendors + '' + '' + # Note: for debugging, enable AF_TRACE=all + AF_PRINT_ERRORS=1 ctest ${ctestFlags} + ''; buildInputs = [ - opencl-clhpp + blas + boost.dev + boost.out + clblast fftw fftwFloat - blas + # We need fmt_9 because ArrayFire fails to compile with newer versions. + fmt_9 + forge + freeimage + gtest lapack - libGLU libGL - mesa - freeimage - boost.out - boost.dev - ] ++ lib.optionals stdenv.isLinux [ ocl-icd - ] ++ lib.optionals cudaSupport [ - cudatoolkit - ] ++ lib.optionals buildDocs [ - doxygen - ] ++ lib.optionals stdenv.isDarwin [ - darwin.apple_sdk_11_0.frameworks.Accelerate + opencl-clhpp + span-lite + ] + ++ lib.optionals cudaSupport [ + cudaPackages.cudatoolkit + cudaPackages.cudnn + cudaPackages.cuda_cccl + ] + ++ lib.optionals openclSupport [ + mesa + ]; + + nativeBuildInputs = [ + cmake + pkg-config + python3 ]; meta = with lib; { @@ -95,7 +219,7 @@ stdenv.mkDerivation rec { ''; license = licenses.bsd3; homepage = "https://arrayfire.com/"; - platforms = platforms.linux ++ platforms.darwin; - maintainers = with maintainers; [ chessai ]; + platforms = platforms.linux; + maintainers = with maintainers; [ chessai twesterhout ]; }; } diff --git a/nixpkgs/pkgs/development/libraries/arrayfire/no-assets.patch b/nixpkgs/pkgs/development/libraries/arrayfire/no-assets.patch new file mode 100644 index 000000000000..b8820f8aa55b --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/arrayfire/no-assets.patch @@ -0,0 +1,35 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 12d6e557c..cc004555d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -321,11 +321,6 @@ 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}) + + # when crosscompiling use the bin2cpp file from the native bin directory + if(CMAKE_CROSSCOMPILING) +@@ -473,18 +468,6 @@ install(FILES ${ArrayFire_BINARY_DIR}/include/af/version.h + DESTINATION "${AF_INSTALL_INC_DIR}/af/" + COMPONENT headers) + +-# install the examples irrespective of the AF_BUILD_EXAMPLES value +-# only the examples source files are installed, so the installation of these +-# 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 ${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 diff --git a/nixpkgs/pkgs/development/libraries/arrayfire/no-download.patch b/nixpkgs/pkgs/development/libraries/arrayfire/no-download.patch index 2b3ac492a54d..f7903e74112d 100644 --- a/nixpkgs/pkgs/development/libraries/arrayfire/no-download.patch +++ b/nixpkgs/pkgs/development/libraries/arrayfire/no-download.patch @@ -1,28 +1,31 @@ -diff --git a/CMakeModules/build_clBLAS.cmake b/CMakeModules/build_clBLAS.cmake -index 8de529e8..6361b613 100644 ---- a/CMakeModules/build_clBLAS.cmake -+++ b/CMakeModules/build_clBLAS.cmake -@@ -14,8 +14,7 @@ find_package(OpenCL) - - ExternalProject_Add( - clBLAS-ext -- GIT_REPOSITORY https://github.com/arrayfire/clBLAS.git -- GIT_TAG arrayfire-release -+ DOWNLOAD_COMMAND true - BUILD_BYPRODUCTS ${clBLAS_location} - PREFIX "${prefix}" - INSTALL_DIR "${prefix}" -diff --git a/CMakeModules/build_clFFT.cmake b/CMakeModules/build_clFFT.cmake -index 28be38a3..85e3915e 100644 ---- a/CMakeModules/build_clFFT.cmake -+++ b/CMakeModules/build_clFFT.cmake -@@ -20,8 +20,7 @@ ENDIF() - - ExternalProject_Add( - clFFT-ext -- GIT_REPOSITORY https://github.com/arrayfire/clFFT.git -- GIT_TAG arrayfire-release -+ DOWNLOAD_COMMAND true - PREFIX "${prefix}" - INSTALL_DIR "${prefix}" - UPDATE_COMMAND "" +diff --git a/CMakeModules/AFconfigure_deps_vars.cmake b/CMakeModules/AFconfigure_deps_vars.cmake +index aac332f5a..e9e711159 100644 +--- a/CMakeModules/AFconfigure_deps_vars.cmake ++++ b/CMakeModules/AFconfigure_deps_vars.cmake +@@ -94,7 +94,7 @@ macro(af_dep_check_and_populate dep_prefix) + URL ${adcp_args_URI} + URL_HASH ${adcp_args_REF} + DOWNLOAD_COMMAND \"\" +- UPDATE_DISCONNECTED ON ++ UPDATE_COMMAND \"\" + SOURCE_DIR "${ArrayFire_SOURCE_DIR}/extern/${dep_prefix}-src" + BINARY_DIR "${ArrayFire_BINARY_DIR}/extern/${dep_prefix}-build" + SUBBUILD_DIR "${ArrayFire_BINARY_DIR}/extern/${dep_prefix}-subbuild" +@@ -104,7 +104,7 @@ macro(af_dep_check_and_populate dep_prefix) + QUIET + URL ${adcp_args_URI} + DOWNLOAD_COMMAND \"\" +- UPDATE_DISCONNECTED ON ++ UPDATE_COMMAND \"\" + SOURCE_DIR "${ArrayFire_SOURCE_DIR}/extern/${dep_prefix}-src" + BINARY_DIR "${ArrayFire_BINARY_DIR}/extern/${dep_prefix}-build" + SUBBUILD_DIR "${ArrayFire_BINARY_DIR}/extern/${dep_prefix}-subbuild" +@@ -116,7 +116,7 @@ macro(af_dep_check_and_populate dep_prefix) + GIT_REPOSITORY ${adcp_args_URI} + GIT_TAG ${adcp_args_REF} + DOWNLOAD_COMMAND \"\" +- UPDATE_DISCONNECTED ON ++ UPDATE_COMMAND \"\" + SOURCE_DIR "${ArrayFire_SOURCE_DIR}/extern/${dep_prefix}-src" + BINARY_DIR "${ArrayFire_BINARY_DIR}/extern/${dep_prefix}-build" + SUBBUILD_DIR "${ArrayFire_BINARY_DIR}/extern/${dep_prefix}-subbuild" |