@@ -3282,7 +3282,14 @@ def build_and_install_one(ecdict, init_env):
32823282 # create our reproducability files before carrying out the easyblock steps
32833283 reprod_dir_root = os .path .dirname (app .logfile )
32843284 reprod_dir = reproduce_build (app , reprod_dir_root )
3285+
32853286 result = app .run_all_steps (run_test_cases = run_test_cases )
3287+
3288+ if not dry_run :
3289+ # also add any extension easyblocks used during the build for reproducability
3290+ if app .ext_instances :
3291+ copy_easyblocks_for_reprod (app .ext_instances , reprod_dir )
3292+
32863293 except EasyBuildError as err :
32873294 first_n = 300
32883295 errormsg = "build failed (first %d chars): %s" % (first_n , err .msg [:first_n ])
@@ -3416,6 +3423,25 @@ def build_and_install_one(ecdict, init_env):
34163423 return (success , application_log , errormsg )
34173424
34183425
3426+ def copy_easyblocks_for_reprod (easyblock_instances , reprod_dir ):
3427+ reprod_easyblock_dir = os .path .join (reprod_dir , 'easyblocks' )
3428+ easyblock_paths = set ()
3429+ for easyblock_instance in easyblock_instances :
3430+ for easyblock_class in inspect .getmro (type (easyblock_instance )):
3431+ easyblock_path = inspect .getsourcefile (easyblock_class )
3432+ # if we reach EasyBlock or ExtensionEasyBlock class, we are done
3433+ # (ExtensionEasyblock is hardcoded to avoid a cyclical import)
3434+ if easyblock_class .__name__ in [EasyBlock .__name__ , 'ExtensionEasyBlock' ]:
3435+ break
3436+ else :
3437+ easyblock_paths .add (easyblock_path )
3438+
3439+ for easyblock_path in easyblock_paths :
3440+ easyblock_basedir , easyblock_filename = os .path .split (easyblock_path )
3441+ copy_file (easyblock_path , os .path .join (reprod_easyblock_dir , easyblock_filename ))
3442+ _log .info ("Dumped easyblock %s required for reproduction to %s" , easyblock_filename , reprod_easyblock_dir )
3443+
3444+
34193445def reproduce_build (app , reprod_dir_root ):
34203446 """
34213447 Create reproducability files (processed easyconfig and easyblocks used) from class instance
@@ -3438,23 +3464,7 @@ def reproduce_build(app, reprod_dir_root):
34383464 _log .warning ("Unable to dump easyconfig instance to %s: %s" , reprod_spec , err )
34393465
34403466 # also archive all the relevant easyblocks (including any used by extensions)
3441- reprod_easyblock_dir = os .path .join (reprod_dir , 'easyblocks' )
3442- easyblock_instances = [app ] + app .ext_instances
3443- easyblock_paths = set ()
3444- for easyblock_instance in easyblock_instances :
3445- for easyblock_class in inspect .getmro (type (easyblock_instance )):
3446- easyblock_path = inspect .getsourcefile (easyblock_class )
3447- # if we reach EasyBlock or ExtensionEasyBlock class, we are done
3448- # (ExtensionEasyblock is hardcoded to avoid a cyclical import)
3449- if easyblock_class .__name__ in [EasyBlock .__name__ , 'ExtensionEasyBlock' ]:
3450- break
3451- else :
3452- easyblock_paths .add (easyblock_path )
3453-
3454- for easyblock_path in easyblock_paths :
3455- easyblock_basedir , easyblock_filename = os .path .split (easyblock_path )
3456- copy_file (easyblock_path , os .path .join (reprod_easyblock_dir , easyblock_filename ))
3457- _log .info ("Dumped easyblock %s required for reproduction to %s" , easyblock_filename , reprod_easyblock_dir )
3467+ copy_easyblocks_for_reprod ([app ], reprod_dir )
34583468
34593469 # if there is a hook file we should also archive it
34603470 hooks_path = build_option ('hooks' )
0 commit comments