From 03a03f7f46cbd1b46aa412c81429a825b6858aa0 Mon Sep 17 00:00:00 2001 From: Pedro Santos Neves <10762799+Neves-P@users.noreply.github.com> Date: Wed, 23 Sep 2026 15:30:13 +0200 Subject: [PATCH 1/3] Implement pre-prepare hook for uv builds Add a pre-prepare hook to set SOURCE_DATE_EPOCH for uv builds to ensure a timestamp is available in A64FX builds --- eb_hooks.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/eb_hooks.py b/eb_hooks.py index 2e7597d9..c4d9b897 100644 --- a/eb_hooks.py +++ b/eb_hooks.py @@ -1203,6 +1203,29 @@ def pre_configure_hook(self, *args, **kwargs): if self.name in ['FreeXL', 'libspatialite', 'VSEARCH']: self.cfg.update('configopts', 'CPPFLAGS="-DOF=_Z_OF ${CPPFLAGS}"') + def pre_prepare_hook_uv_source_date_epoch(self, *args, **kwargs): + """ + Set SOURCE_DATE_EPOCH for uv builds. + + This ensures that maturin uses an explicit timestamp while creating the + wheel rather than relying on the ZIP writer's default timestamp handling. + Otherwise the builds fail on A64FX. + """ + if self.name != 'uv': + raise EasyBuildError( + "uv-specific hook triggered for non-uv easyconfig?!" + ) + + source_date_epoch = str(int(datetime.datetime.now().timestamp())) + + env.setvar('SOURCE_DATE_EPOCH', source_date_epoch) + + print_msg( + "Set SOURCE_DATE_EPOCH=%s for %s %s", + source_date_epoch, + self.name, + self.version, + ) def pre_configure_hook_BLIS(self, *args, **kwargs): """ @@ -2455,6 +2478,7 @@ def post_easyblock_hook(self, *args, **kwargs): 'LLVM': pre_prepare_hook_llvm_a64fx, 'PyTorch': pre_prepare_hook_pytorch, 'Rust': pre_prepare_hook_llvm_a64fx, + 'uv': pre_prepare_hook_uv_source_date_epoch, } POST_PREPARE_HOOKS = { From 7f4b90ca258c34692bcbb0e03b644d0fb594a43c Mon Sep 17 00:00:00 2001 From: Pedro Santos Neves <10762799+Neves-P@users.noreply.github.com> Date: Fri, 25 Sep 2026 10:52:24 +0200 Subject: [PATCH 2/3] Update eb_hooks.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bob Dröge --- eb_hooks.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/eb_hooks.py b/eb_hooks.py index c4d9b897..4a8a6a0b 100644 --- a/eb_hooks.py +++ b/eb_hooks.py @@ -1204,28 +1204,28 @@ def pre_configure_hook(self, *args, **kwargs): self.cfg.update('configopts', 'CPPFLAGS="-DOF=_Z_OF ${CPPFLAGS}"') def pre_prepare_hook_uv_source_date_epoch(self, *args, **kwargs): - """ - Set SOURCE_DATE_EPOCH for uv builds. - - This ensures that maturin uses an explicit timestamp while creating the - wheel rather than relying on the ZIP writer's default timestamp handling. - Otherwise the builds fail on A64FX. - """ - if self.name != 'uv': - raise EasyBuildError( - "uv-specific hook triggered for non-uv easyconfig?!" - ) + """ + Set SOURCE_DATE_EPOCH for uv builds. + + This ensures that maturin uses an explicit timestamp while creating the + wheel rather than relying on the ZIP writer's default timestamp handling. + Otherwise the builds fail on A64FX. + """ + if self.name != 'uv': + raise EasyBuildError( + "uv-specific hook triggered for non-uv easyconfig?!" + ) - source_date_epoch = str(int(datetime.datetime.now().timestamp())) + source_date_epoch = str(int(datetime.datetime.now().timestamp())) - env.setvar('SOURCE_DATE_EPOCH', source_date_epoch) + env.setvar('SOURCE_DATE_EPOCH', source_date_epoch) - print_msg( - "Set SOURCE_DATE_EPOCH=%s for %s %s", - source_date_epoch, - self.name, - self.version, - ) + print_msg( + "Set SOURCE_DATE_EPOCH=%s for %s %s", + source_date_epoch, + self.name, + self.version, + ) def pre_configure_hook_BLIS(self, *args, **kwargs): """ From addbb8ff0dd6266b18a0961af2186d316503b8ec Mon Sep 17 00:00:00 2001 From: Pedro Santos Neves <10762799+Neves-P@users.noreply.github.com> Date: Fri, 25 Sep 2026 11:10:51 +0200 Subject: [PATCH 3/3] Move the pre prepare hook to the right location Add pre-prepare hook to set SOURCE_DATE_EPOCH for uv builds. --- eb_hooks.py | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/eb_hooks.py b/eb_hooks.py index 4a8a6a0b..0fdfbfc4 100644 --- a/eb_hooks.py +++ b/eb_hooks.py @@ -1182,6 +1182,30 @@ def pre_prepare_hook_LAMMPS_kokkos_CUDA_families(self, *args, **kwargs): updated_cuda_cc = [v.replace('12.0f', '12.0') for v in cuda_cc] update_build_option('cuda_compute_capabilities', updated_cuda_cc) + +def pre_prepare_hook_uv_source_date_epoch(self, *args, **kwargs): + """ + Set SOURCE_DATE_EPOCH for uv builds. + + This ensures that maturin uses an explicit timestamp while creating the + wheel rather than relying on the ZIP writer's default timestamp handling. + Otherwise the builds fail on A64FX. + """ + if self.name != 'uv': + raise EasyBuildError( + "uv-specific hook triggered for non-uv easyconfig?!" + ) + + source_date_epoch = str(int(datetime.datetime.now().timestamp())) + + env.setvar('SOURCE_DATE_EPOCH', source_date_epoch) + + print_msg( + "Set SOURCE_DATE_EPOCH=%s for %s %s", + source_date_epoch, + self.name, + self.version, + ) def post_prepare_hook_llvm_a64fx(self, *args, **kwargs): """ @@ -1203,30 +1227,6 @@ def pre_configure_hook(self, *args, **kwargs): if self.name in ['FreeXL', 'libspatialite', 'VSEARCH']: self.cfg.update('configopts', 'CPPFLAGS="-DOF=_Z_OF ${CPPFLAGS}"') - def pre_prepare_hook_uv_source_date_epoch(self, *args, **kwargs): - """ - Set SOURCE_DATE_EPOCH for uv builds. - - This ensures that maturin uses an explicit timestamp while creating the - wheel rather than relying on the ZIP writer's default timestamp handling. - Otherwise the builds fail on A64FX. - """ - if self.name != 'uv': - raise EasyBuildError( - "uv-specific hook triggered for non-uv easyconfig?!" - ) - - source_date_epoch = str(int(datetime.datetime.now().timestamp())) - - env.setvar('SOURCE_DATE_EPOCH', source_date_epoch) - - print_msg( - "Set SOURCE_DATE_EPOCH=%s for %s %s", - source_date_epoch, - self.name, - self.version, - ) - def pre_configure_hook_BLIS(self, *args, **kwargs): """ Pre-configure hook for BLIS