From 47953dff815f6bb6cba5a073db12a9c8e8e0315d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Bon=C3=A9?= Date: Mon, 23 Feb 2026 18:04:21 +0100 Subject: [PATCH] Initial commit --- default.nix | 191 ++++++++++++++++++++++++++++++++++++++++++++++++++++ release.nix | 16 +++++ 2 files changed, 207 insertions(+) create mode 100644 default.nix create mode 100644 release.nix diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..c3c133f --- /dev/null +++ b/default.nix @@ -0,0 +1,191 @@ +{ + lib, + stdenv, + llvmPackages, + ninja, + cmake, + hwloc, + ocl-icd, + opencl-headers, + getconf, + pkg-config, + spirv-llvm-translator, + spirv-tools, + libxml2, # required for statically linked llvm + python3, + writableTmpDirAsHomeHook, + writeText, + runCommand, + opencl-cts, + + staticLLVM ? true, + enableICD ? true, + enableSPIRV ? true, + enableHWLOC ? true, + enableRemoteServer ? false, + enableRemoteClient ? false, + + lttng-ust, + enableLTTNG ? false, + + onetbb, + enableTBB ? false, + + src, + + buildPackages, +}: + +let + buildLlvmPackages = buildPackages.llvmPackages; +in + +llvmPackages.stdenv.mkDerivation (finalAttrs: { + pname = "pocl"; + version = "nightly"; + inherit src; + + cmakeFlags = [ + # TODO: all these are broken when cross compiling. Upstream has refactored + # all the cmake infra for cross compilation, but it's not in a release yet + (lib.cmakeOptionType "filepath" "WITH_LLVM_CONFIG" ( + lib.getExe' buildLlvmPackages.llvm.dev "llvm-config" + )) + (lib.cmakeOptionType "filepath" "CLANG" (lib.getExe' buildLlvmPackages.clangUseLLVM "clang")) + (lib.cmakeOptionType "filepath" "CLANGXX" (lib.getExe' buildLlvmPackages.clangUseLLVM "clang++")) + (lib.cmakeOptionType "path" "CLANG_RESOURCE_DIR" "${llvmPackages.stdenv.cc}/resource-root") + + (lib.cmakeBool "ENABLE_TESTS" finalAttrs.finalPackage.doCheck) + (lib.cmakeBool "ENABLE_EXAMPLES" finalAttrs.finalPackage.doCheck) + + (lib.cmakeBool "ENABLE_RELOCATION" true) + (lib.cmakeBool "ENABLE_POCL_BUILDING" true) + (lib.cmakeBool "POCL_ICD_ABSOLUTE_PATH" true) + + (lib.cmakeBool "ENABLE_TBB_DEVICE" enableTBB) + (lib.cmakeBool "ENABLE_ICD" enableICD) + (lib.cmakeBool "ENABLE_HWLOC" enableHWLOC) + (lib.cmakeBool "ENABLE_LTTNG" enableLTTNG) + + (lib.cmakeBool "ENABLE_REMOTE_CLIENT" enableRemoteClient) + (lib.cmakeBool "ENABLE_REMOTE_SERVER" enableRemoteServer) + + (lib.cmakeBool "ENABLE_LLVM_FILECHECKS" false) # TODO: fix filecheck tests + + # avoid the runtime linker pulling in a different llvm e.g. from graphics drivers + (lib.cmakeBool "STATIC_LLVM" staticLLVM) + ] + ++ lib.optionals stdenv.hostPlatform.isx86_64 [ + (lib.cmakeFeature "KERNELLIB_HOST_CPU_VARIANTS" "distro") + ]; + + # Fixes error: ld: cannot find -lgcc / -lgcc_s when linking from libpocl on + # host + # Should match the flags from : "${targetPackages.stdenv.cc}/nix-support/cc-ldflags + # But, we cannot use the file here without doing import from derivation + preConfigure = let + inherit (stdenv) targetPlatform hostPlatform; + + gccForLibs = stdenv.cc.cc; + gccForLibs_solib = lib.getLib gccForLibs + lib.optionalString (targetPlatform != hostPlatform) "/${targetPlatform.config}"; + in '' + cmakeFlagsArray+=( + -DEXTRA_HOST_LD_FLAGS="-L${gccForLibs}/lib/gcc/${targetPlatform.config}/${gccForLibs.version} -L${gccForLibs_solib}/lib" + ) + ''; + + nativeBuildInputs = [ + cmake + getconf + ninja + pkg-config + python3 + ]; + + buildInputs = [ + opencl-headers + llvmPackages.libclang + llvmPackages.llvm + ] + ++ lib.optionals staticLLVM [ libxml2 ] + ++ lib.optionals enableHWLOC [ hwloc ] + ++ lib.optionals enableTBB [ onetbb ] + ++ lib.optionals enableICD [ ocl-icd ] + ++ lib.optionals enableLTTNG [ lttng-ust ] + ++ lib.optionals enableSPIRV [ + (spirv-llvm-translator.override { inherit (llvmPackages) llvm; }) + spirv-tools + ]; + + nativeCheckInputs = [ + writableTmpDirAsHomeHook # needed for POCL_CACHE_DIR + ]; + + nativeInstallCheckInputs = [ + writableTmpDirAsHomeHook # needed for POCL_CACHE_DIR + ]; + + doInstallCheck = true; + + installCheckPhase = lib.optionalString enableICD '' + runHook preInstallCheck + + export OCL_ICD_VENDORS=$out/etc/OpenCL/vendors + $out/bin/poclcc -o poclcc.cl.pocl $src/examples/poclcc/poclcc.cl + + runHook postInstallCheck + ''; + + setupHook = lib.optionalDrvAttr enableICD ( + writeText "setup-hook" '' + addToSearchPath OCL_ICD_VENDORS @out@/etc/OpenCL/vendors + '' + ); + + passthru = + let + self = finalAttrs.finalPackage; + in + { + withICD = enableICD; + + test = { + # Run builtin tests (causes a rebuild) + self = self.overrideAttrs { doCheck = true; }; + + # Run basic test from Khronos OpenCL Conformance Test Suite + # WARN: despite its name, test_basic is very exhaustive, and can take more + # than 1 hour in a marenostrum5 node. + cts = + assert enableICD; + lib.genAttrs [ "api" "basic" "c11_atomics" "printf" "svm" ] ( + name: + runCommand "pocl-cts-test_${name}" { + nativeBuildInputs = [ self ]; + requiredSystemFeatures = [ "sys-devices" ]; + env = { + POCL_DEBUG = "error,warn"; + POCL_CACHE_DIR = "/build/pocl_cache"; + }; + } "${opencl-cts}/bin/Release/test_${name} | tee $out" + ); + }; + }; + + env.HWLOC_SYNTHETIC = lib.optionalDrvAttr enableHWLOC "node:1 core:1 pu:1"; + + propagatedBuildInputs = [ stdenv.cc.cc ]; + + meta = with lib; { + description = "A portable open source (MIT-licensed) implementation of the OpenCL standard"; + homepage = "http://portablecl.org"; + license = licenses.mit; + maintainers = with maintainers; [ + leixb + jansol + xddxdd + bsc.abonerib + ]; + platforms = platforms.linux ++ platforms.darwin; + }; +}) diff --git a/release.nix b/release.nix new file mode 100644 index 0000000..0c0fd63 --- /dev/null +++ b/release.nix @@ -0,0 +1,16 @@ +{ ... }: +let + pkgs = ( + import { + overlays = [ + (final: prev: { + pocl = final.callPackage ./default.nix { src = ; }; + }) + ]; + } + ); +in +{ + inherit (pkgs) pocl; + test = pkgs.pocl.test.self; +}