Loading pkgs/development/python-modules/devito/default.nix +16 −6 Original line number Diff line number Diff line Loading @@ -30,18 +30,25 @@ scipy, }: buildPythonPackage rec { buildPythonPackage (finalAttrs: { pname = "devito"; version = "4.8.20"; version = "4.8.21"; pyproject = true; src = fetchFromGitHub { owner = "devitocodes"; repo = "devito"; tag = "v${version}"; hash = "sha256-7GlpvPjiUckzh1s2Pwfaoy/bMsAW1FscnyxGaADyie8="; tag = "v${finalAttrs.version}"; hash = "sha256-nD1bUFv24lnonajUG6m5yhGUAC0pVtSKTX69JwSt69E="; }; patches = [ # codepy >=2025.1 turned GCCToolchain into a frozen dataclass, # breaking devito's imperative attribute assignments and renaming # several API parameters. Upstream pins codepy<2025; patch instead. ./fix-codepy-compat.patch ]; pythonRemoveDeps = [ "pip" ]; pythonRelaxDeps = true; Loading Loading @@ -88,6 +95,9 @@ buildPythonPackage rec { # Download dataset from the internet "test_gs_2d_float" "test_gs_2d_int" # Numerical precision issue: assert Data(False) "test_cire_n_strides" ] ++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64) [ # FAILED tests/test_unexpansion.py::Test2Pass::test_v0 - assert False Loading Loading @@ -152,8 +162,8 @@ buildPythonPackage rec { meta = { description = "Code generation framework for automated finite difference computation"; homepage = "https://www.devitoproject.org/"; changelog = "https://github.com/devitocodes/devito/releases/tag/${src.tag}"; changelog = "https://github.com/devitocodes/devito/releases/tag/${finalAttrs.src.tag}"; license = lib.licenses.mit; maintainers = [ ]; }; } }) pkgs/development/python-modules/devito/fix-codepy-compat.patch 0 → 100644 +60 −0 Original line number Diff line number Diff line --- a/devito/arch/compiler.py +++ b/devito/arch/compiler.py @@ -145,6 +145,14 @@ class Compiler(GCCToolchain): + # codepy >=2025.1 turned GCCToolchain into a frozen dataclass, which + # forbids attribute assignment. Override the frozen __setattr__ / + # __delattr__ so that Compiler (and its subclasses) can keep setting + # attributes imperatively. + def __setattr__(self, name, value): + object.__setattr__(self, name, value) + def __delattr__(self, name): + object.__delattr__(self, name) """ Base class for all compiler classes. @@ -196,7 +204,11 @@ else: self._name = maybe_name - super().__init__(**kwargs) + # codepy >=2025.1: GCCToolchain is a frozen dataclass whose __init__ + # requires all fields as positional args. Skip it entirely and + # initialise the fields that Compiler never sets itself. + self.o_ext = '.o' + self.features = set() self.__lookup_cmds__() self._cpp = kwargs.get('cpp', self._default_cpp) @@ -355,12 +367,12 @@ ) from e debug(f"Make <{' '.join(args)}>") - def _cmdline(self, files, object=False): + def _cmdline(self, files, *, is_object=False): """ Sanitize command line to remove all shell string escape such as mpicc/mpicxx would add, e.g., `-Wl\\,-rpath,/path/to/lib`. """ - cc_line = super()._cmdline(files, object=object) + cc_line = super()._cmdline(files, is_object=is_object) return [s.replace('\\', '') for s in cc_line] def jit_compile(self, soname, code): @@ -417,9 +429,11 @@ # when running the test suite in parallel) with warnings.catch_warnings(): warnings.simplefilter('ignore') - _, _, _, recompiled = compile_from_string(self, target, code, src_file, - cache_dir=cache_dir, debug=debug, - sleep_delay=sleep_delay) + # codepy >=2025.1: source_name is now keyword-only. + _, _, _, recompiled = compile_from_string( + self, target, code, source_name=src_file, + cache_dir=cache_dir, debug=debug, + sleep_delay=sleep_delay) return recompiled, src_file Loading
pkgs/development/python-modules/devito/default.nix +16 −6 Original line number Diff line number Diff line Loading @@ -30,18 +30,25 @@ scipy, }: buildPythonPackage rec { buildPythonPackage (finalAttrs: { pname = "devito"; version = "4.8.20"; version = "4.8.21"; pyproject = true; src = fetchFromGitHub { owner = "devitocodes"; repo = "devito"; tag = "v${version}"; hash = "sha256-7GlpvPjiUckzh1s2Pwfaoy/bMsAW1FscnyxGaADyie8="; tag = "v${finalAttrs.version}"; hash = "sha256-nD1bUFv24lnonajUG6m5yhGUAC0pVtSKTX69JwSt69E="; }; patches = [ # codepy >=2025.1 turned GCCToolchain into a frozen dataclass, # breaking devito's imperative attribute assignments and renaming # several API parameters. Upstream pins codepy<2025; patch instead. ./fix-codepy-compat.patch ]; pythonRemoveDeps = [ "pip" ]; pythonRelaxDeps = true; Loading Loading @@ -88,6 +95,9 @@ buildPythonPackage rec { # Download dataset from the internet "test_gs_2d_float" "test_gs_2d_int" # Numerical precision issue: assert Data(False) "test_cire_n_strides" ] ++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64) [ # FAILED tests/test_unexpansion.py::Test2Pass::test_v0 - assert False Loading Loading @@ -152,8 +162,8 @@ buildPythonPackage rec { meta = { description = "Code generation framework for automated finite difference computation"; homepage = "https://www.devitoproject.org/"; changelog = "https://github.com/devitocodes/devito/releases/tag/${src.tag}"; changelog = "https://github.com/devitocodes/devito/releases/tag/${finalAttrs.src.tag}"; license = lib.licenses.mit; maintainers = [ ]; }; } })
pkgs/development/python-modules/devito/fix-codepy-compat.patch 0 → 100644 +60 −0 Original line number Diff line number Diff line --- a/devito/arch/compiler.py +++ b/devito/arch/compiler.py @@ -145,6 +145,14 @@ class Compiler(GCCToolchain): + # codepy >=2025.1 turned GCCToolchain into a frozen dataclass, which + # forbids attribute assignment. Override the frozen __setattr__ / + # __delattr__ so that Compiler (and its subclasses) can keep setting + # attributes imperatively. + def __setattr__(self, name, value): + object.__setattr__(self, name, value) + def __delattr__(self, name): + object.__delattr__(self, name) """ Base class for all compiler classes. @@ -196,7 +204,11 @@ else: self._name = maybe_name - super().__init__(**kwargs) + # codepy >=2025.1: GCCToolchain is a frozen dataclass whose __init__ + # requires all fields as positional args. Skip it entirely and + # initialise the fields that Compiler never sets itself. + self.o_ext = '.o' + self.features = set() self.__lookup_cmds__() self._cpp = kwargs.get('cpp', self._default_cpp) @@ -355,12 +367,12 @@ ) from e debug(f"Make <{' '.join(args)}>") - def _cmdline(self, files, object=False): + def _cmdline(self, files, *, is_object=False): """ Sanitize command line to remove all shell string escape such as mpicc/mpicxx would add, e.g., `-Wl\\,-rpath,/path/to/lib`. """ - cc_line = super()._cmdline(files, object=object) + cc_line = super()._cmdline(files, is_object=is_object) return [s.replace('\\', '') for s in cc_line] def jit_compile(self, soname, code): @@ -417,9 +429,11 @@ # when running the test suite in parallel) with warnings.catch_warnings(): warnings.simplefilter('ignore') - _, _, _, recompiled = compile_from_string(self, target, code, src_file, - cache_dir=cache_dir, debug=debug, - sleep_delay=sleep_delay) + # codepy >=2025.1: source_name is now keyword-only. + _, _, _, recompiled = compile_from_string( + self, target, code, source_name=src_file, + cache_dir=cache_dir, debug=debug, + sleep_delay=sleep_delay) return recompiled, src_file