@@ -220,7 +220,7 @@ def cache_aware_func(toolchain, incl_capabilities=False):
220
220
return cache_aware_func
221
221
222
222
223
- def det_subtoolchain_version (current_tc , subtoolchain_name , optional_toolchains , cands , incl_capabilities = False ):
223
+ def det_subtoolchain_version (current_tc , subtoolchain_names , optional_toolchains , cands , incl_capabilities = False ):
224
224
"""
225
225
Returns unique version for subtoolchain, in tc dict.
226
226
If there is no unique version:
@@ -229,30 +229,46 @@ def det_subtoolchain_version(current_tc, subtoolchain_name, optional_toolchains,
229
229
optional toolchains or system toolchain without add_system_to_minimal_toolchains.
230
230
* in all other cases, raises an exception.
231
231
"""
232
- uniq_subtc_versions = set ([subtc ['version' ] for subtc in cands if subtc ['name' ] == subtoolchain_name ])
233
232
# init with "skipped"
234
233
subtoolchain_version = None
235
234
236
- # system toolchain: bottom of the hierarchy
237
- if is_system_toolchain (subtoolchain_name ):
238
- add_system_to_minimal_toolchains = build_option ('add_system_to_minimal_toolchains' )
239
- if not add_system_to_minimal_toolchains and build_option ('add_dummy_to_minimal_toolchains' ):
240
- depr_msg = "Use --add-system-to-minimal-toolchains instead of --add-dummy-to-minimal-toolchains"
241
- _log .deprecated (depr_msg , '5.0' )
242
- add_system_to_minimal_toolchains = True
243
-
244
- if add_system_to_minimal_toolchains and not incl_capabilities :
245
- subtoolchain_version = ''
246
- elif len (uniq_subtc_versions ) == 1 :
247
- subtoolchain_version = list (uniq_subtc_versions )[0 ]
248
- elif len (uniq_subtc_versions ) == 0 :
249
- if subtoolchain_name not in optional_toolchains :
235
+ # ensure we always have a tuple of alternative subtoolchain names, which makes things easier below
236
+ if isinstance (subtoolchain_names , string_type ):
237
+ subtoolchain_names = (subtoolchain_names ,)
238
+
239
+ system_subtoolchain = False
240
+
241
+ for subtoolchain_name in subtoolchain_names :
242
+
243
+ uniq_subtc_versions = set ([subtc ['version' ] for subtc in cands if subtc ['name' ] == subtoolchain_name ])
244
+
245
+ # system toolchain: bottom of the hierarchy
246
+ if is_system_toolchain (subtoolchain_name ):
247
+ add_system_to_minimal_toolchains = build_option ('add_system_to_minimal_toolchains' )
248
+ if not add_system_to_minimal_toolchains and build_option ('add_dummy_to_minimal_toolchains' ):
249
+ depr_msg = "Use --add-system-to-minimal-toolchains instead of --add-dummy-to-minimal-toolchains"
250
+ _log .deprecated (depr_msg , '5.0' )
251
+ add_system_to_minimal_toolchains = True
252
+
253
+ system_subtoolchain = True
254
+
255
+ if add_system_to_minimal_toolchains and not incl_capabilities :
256
+ subtoolchain_version = ''
257
+ elif len (uniq_subtc_versions ) == 1 :
258
+ subtoolchain_version = list (uniq_subtc_versions )[0 ]
259
+ elif len (uniq_subtc_versions ) > 1 :
260
+ raise EasyBuildError ("Multiple versions of %s found in dependencies of toolchain %s: %s" ,
261
+ subtoolchain_name , current_tc ['name' ], ', ' .join (sorted (uniq_subtc_versions )))
262
+
263
+ if subtoolchain_version is not None :
264
+ break
265
+
266
+ if not system_subtoolchain and subtoolchain_version is None :
267
+ if not all (n in optional_toolchains for n in subtoolchain_names ):
268
+ subtoolchain_names = ' or ' .join (subtoolchain_names )
250
269
# raise error if the subtoolchain considered now is not optional
251
270
raise EasyBuildError ("No version found for subtoolchain %s in dependencies of %s" ,
252
- subtoolchain_name , current_tc ['name' ])
253
- else :
254
- raise EasyBuildError ("Multiple versions of %s found in dependencies of toolchain %s: %s" ,
255
- subtoolchain_name , current_tc ['name' ], ', ' .join (sorted (uniq_subtc_versions )))
271
+ subtoolchain_names , current_tc ['name' ])
256
272
257
273
return subtoolchain_version
258
274
@@ -356,11 +372,16 @@ def get_toolchain_hierarchy(parent_toolchain, incl_capabilities=False):
356
372
cands .append ({'name' : dep , 'version' : current_tc_version })
357
373
358
374
# only retain candidates that match subtoolchain names
359
- cands = [c for c in cands if c ['name' ] in subtoolchain_names ]
375
+ cands = [c for c in cands if any ( c ['name' ] == x or c [ 'name' ] in x for x in subtoolchain_names ) ]
360
376
361
377
for subtoolchain_name in subtoolchain_names :
362
378
subtoolchain_version = det_subtoolchain_version (current_tc , subtoolchain_name , optional_toolchains , cands ,
363
379
incl_capabilities = incl_capabilities )
380
+
381
+ # narrow down alternative subtoolchain names to a single one, based on the selected version
382
+ if isinstance (subtoolchain_name , tuple ):
383
+ subtoolchain_name = [cand ['name' ] for cand in cands if cand ['version' ] == subtoolchain_version ][0 ]
384
+
364
385
# add to hierarchy and move to next
365
386
if subtoolchain_version is not None and subtoolchain_name not in visited :
366
387
tc = {'name' : subtoolchain_name , 'version' : subtoolchain_version }
0 commit comments