diff --git a/pkgs/development/rocm-modules/6/rocm-core/default.nix b/pkgs/development/rocm-modules/6/rocm-core/default.nix index 55316f4c65d5..08bf9e53fe34 100644 --- a/pkgs/development/rocm-modules/6/rocm-core/default.nix +++ b/pkgs/development/rocm-modules/6/rocm-core/default.nix @@ -7,6 +7,14 @@ writeText, }: +# rocm-core is used by most distros for a few purposes: +# - meta package that all rocm packages depend so `apt-get remove rocm-core` removes all rocm packages +# - provide overall ROCM_PATH +# - provide rocm version info and path to rocm version headers +# only the last usage makes sense in nixpkgs +let + padIfSingle = s: if lib.stringLength s == 1 then "0${s}" else s; +in stdenv.mkDerivation (finalAttrs: { pname = "rocm-core"; version = "6.3.3"; @@ -18,23 +26,56 @@ stdenv.mkDerivation (finalAttrs: { hash = "sha256-UDnPGvgwzwv49CzF+Kt0v95CsxS33BZeqNcKw1K6jRI="; }; + patches = [ + ./env-rocm-path.patch + ]; + nativeBuildInputs = [ cmake ]; - # FIXME: What's the correct way to set this? - env.ROCM_LIBPATCH_VERSION = "${lib.versions.major finalAttrs.version}0${lib.versions.minor finalAttrs.version}0${lib.versions.patch finalAttrs.version}"; - env.BUILD_ID = "nixos-${finalAttrs.env.ROCM_LIBPATCH_VERSION}"; - env.ROCM_BUILD_ID = "release-${finalAttrs.env.BUILD_ID}"; + env = { + ROCM_LIBPATCH_VERSION = "${lib.versions.major finalAttrs.version}${padIfSingle (lib.versions.minor finalAttrs.version)}${padIfSingle (lib.versions.patch finalAttrs.version)}"; + BUILD_ID = "nixpkgs-${finalAttrs.env.ROCM_LIBPATCH_VERSION}"; + ROCM_BUILD_ID = "${finalAttrs.env.BUILD_ID}"; + }; cmakeFlags = [ "-DROCM_LIBPATCH_VERSION=${finalAttrs.env.ROCM_LIBPATCH_VERSION}" "-DROCM_VERSION=${finalAttrs.version}" "-DBUILD_ID=${finalAttrs.env.BUILD_ID}" + "-DCMAKE_INSTALL_LIBDIR=lib" + "-DCMAKE_INSTALL_INCLUDEDIR=include" + "-DCMAKE_INSTALL_BINDIR=bin" ]; setupHook = writeText "setupHook.sh" '' + export ROCM_VERSION="${finalAttrs.version}" export ROCM_LIBPATCH_VERSION="${finalAttrs.env.ROCM_LIBPATCH_VERSION}" - export BUILD_ID="${finalAttrs.env.BUILD_ID}" export ROCM_BUILD_ID="${finalAttrs.env.ROCM_BUILD_ID}" ''; + doInstallCheck = true; + preInstallCheck = + # Test that the CMake config file can be included and sets expected vars + '' + mkdir test_project + cd test_project + + echo ' + cmake_minimum_required(VERSION 3.16) + project(test_rocm_core) + find_package(rocm-core REQUIRED) + if(NOT DEFINED ROCM_CORE_INCLUDE_DIR) + message(FATAL_ERROR "ROCM_CORE_INCLUDE_DIR not set") + endif() + message(STATUS "Found ROCM_CORE_INCLUDE_DIR: ''${ROCM_CORE_INCLUDE_DIR}") + message(STATUS "Found ROCM_PATH: ''${ROCM_PATH}") + ' > CMakeLists.txt + + CMAKE_PREFIX_PATH="$out" cmake . + cd .. + + . $out/nix-support/setup-hook + env | grep '^ROCM' + ''; + passthru.ROCM_LIBPATCH_VERSION = finalAttrs.env.ROCM_LIBPATCH_VERSION; passthru.updateScript = rocmUpdateScript { name = finalAttrs.pname; diff --git a/pkgs/development/rocm-modules/6/rocm-core/env-rocm-path.patch b/pkgs/development/rocm-modules/6/rocm-core/env-rocm-path.patch new file mode 100644 index 000000000000..a40fa33b90ce --- /dev/null +++ b/pkgs/development/rocm-modules/6/rocm-core/env-rocm-path.patch @@ -0,0 +1,22 @@ +In FHS distros rocm-core expects to be installed colocated with a full set of ROCM packages. +In nixpkgs contexts, we don't want rocm-core to be a ROCM_PATH root. +diff --git a/cmake_modules/rocm-core-config.cmake.in b/cmake_modules/rocm-core-config.cmake.in +index f5fe07c..9d72c9c 100644 +--- a/cmake_modules/rocm-core-config.cmake.in ++++ b/cmake_modules/rocm-core-config.cmake.in +@@ -11,7 +11,14 @@ set_and_check(rocm_core_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") + set_and_check(ROCM_CORE_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") + set_and_check(rocm_core_LIB_DIR "@PACKAGE_LIB_INSTALL_DIR@") + set_and_check(ROCM_CORE_LIB_DIR "@PACKAGE_LIB_INSTALL_DIR@") +-set_and_check(ROCM_PATH "${PACKAGE_PREFIX_DIR}") ++# Set ROCM_PATH with priority: existing value > environment variable > package prefix ++if(NOT DEFINED ROCM_PATH) ++ if(DEFINED ENV{ROCM_PATH}) ++ set(ROCM_PATH "$ENV{ROCM_PATH}") ++ else() ++ set_and_check(ROCM_PATH "${PACKAGE_PREFIX_DIR}") ++ endif() ++endif() + + get_filename_component(ROCM_CORE_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) + include("${ROCM_CORE_CMAKE_DIR}/rocmCoreTargets.cmake")