@@ -379,24 +379,90 @@ def _whl_repo(*, src, whl_library_args, is_multiple_versions, download_only, net
379
379
def _configure (config , * , platform , os_name , arch_name , config_settings , env = {}, override = False ):
380
380
"""Set the value in the config if the value is provided"""
381
381
config .setdefault ("platforms" , {})
382
- if platform :
382
+ if platform and ( os_name or arch_name or config_settings or env ) :
383
383
if not override and config .get ("platforms" , {}).get (platform ):
384
384
return
385
385
386
386
for key in env :
387
387
if key not in _SUPPORTED_PEP508_KEYS :
388
388
fail ("Unsupported key in the PEP508 environment: {}" .format (key ))
389
389
390
- config ["platforms" ][platform ] = struct (
391
- name = platform .replace ("-" , "_" ).lower (),
392
- os_name = os_name ,
393
- arch_name = arch_name ,
394
- config_settings = config_settings ,
395
- env = env ,
396
- )
390
+ config ["platforms" ].setdefault (platform , {})
391
+ for key , value in {
392
+ "arch_name" : arch_name ,
393
+ "config_settings" : config_settings ,
394
+ "env" : env ,
395
+ "name" : platform .replace ("-" , "_" ).lower (),
396
+ "os_name" : os_name ,
397
+ }.items ():
398
+ if not value :
399
+ continue
400
+
401
+ if not override and config .get (key ):
402
+ continue
403
+
404
+ config ["platforms" ][platform ][key ] = value
397
405
else :
398
406
config ["platforms" ].pop (platform )
399
407
408
+ def _plat (* , name , arch_name , os_name , config_settings = [], env = {}):
409
+ return struct (
410
+ name = name ,
411
+ arch_name = arch_name ,
412
+ os_name = os_name ,
413
+ config_settings = config_settings ,
414
+ env = env ,
415
+ )
416
+
417
+ def build_config (
418
+ * ,
419
+ module_ctx ,
420
+ enable_pipstar ):
421
+ """Parse 'configure' and 'default' extension tags
422
+
423
+ Args:
424
+ module_ctx: {type}`module_ctx` module context.
425
+ enable_pipstar: {type}`bool` a flag to enable dropping Python dependency for
426
+ evaluation of the extension.
427
+
428
+ Returns:
429
+ A struct with the configuration.
430
+ """
431
+ defaults = {
432
+ "platforms" : {},
433
+ }
434
+ for mod in module_ctx .modules :
435
+ if not (mod .is_root or mod .name == "rules_python" ):
436
+ continue
437
+
438
+ platform = None
439
+ for tag in mod .tags .default :
440
+ platform = tag .platform or platform
441
+ _configure (
442
+ defaults ,
443
+ arch_name = tag .arch_name ,
444
+ config_settings = tag .config_settings ,
445
+ env = tag .env ,
446
+ os_name = tag .os_name ,
447
+ platform = platform ,
448
+ override = mod .is_root ,
449
+ # TODO @aignas 2025-05-19: add more attr groups:
450
+ # * for AUTH - the default `netrc` usage could be configured through a common
451
+ # attribute.
452
+ # * for index/downloader config. This includes all of those attributes for
453
+ # overrides, etc. Index overrides per platform could be also used here.
454
+ # * for whl selection - selecting preferences of which `platform_tag`s we should use
455
+ # for what. We could also model the `cp313t` freethreaded as separate platforms.
456
+ )
457
+
458
+ return struct (
459
+ platforms = {
460
+ name : _plat (** values )
461
+ for name , values in defaults ["platforms" ].items ()
462
+ },
463
+ enable_pipstar = enable_pipstar ,
464
+ )
465
+
400
466
def parse_modules (
401
467
module_ctx ,
402
468
_fail = fail ,
@@ -447,33 +513,7 @@ You cannot use both the additive_build_content and additive_build_content_file a
447
513
srcs_exclude_glob = whl_mod .srcs_exclude_glob ,
448
514
)
449
515
450
- defaults = {
451
- "enable_pipstar" : enable_pipstar ,
452
- "platforms" : {},
453
- }
454
- for mod in module_ctx .modules :
455
- if not (mod .is_root or mod .name == "rules_python" ):
456
- continue
457
-
458
- for tag in mod .tags .default :
459
- _configure (
460
- defaults ,
461
- arch_name = tag .arch_name ,
462
- config_settings = tag .config_settings ,
463
- env = tag .env ,
464
- os_name = tag .os_name ,
465
- platform = tag .platform ,
466
- override = mod .is_root ,
467
- # TODO @aignas 2025-05-19: add more attr groups:
468
- # * for AUTH - the default `netrc` usage could be configured through a common
469
- # attribute.
470
- # * for index/downloader config. This includes all of those attributes for
471
- # overrides, etc. Index overrides per platform could be also used here.
472
- # * for whl selection - selecting preferences of which `platform_tag`s we should use
473
- # for what. We could also model the `cp313t` freethreaded as separate platforms.
474
- )
475
-
476
- config = struct (** defaults )
516
+ config = build_config (module_ctx = module_ctx , enable_pipstar = enable_pipstar )
477
517
478
518
# TODO @aignas 2025-06-03: Merge override API with the builder?
479
519
_overriden_whl_set = {}
@@ -650,6 +690,7 @@ You cannot use both the additive_build_content and additive_build_content_file a
650
690
k : dict (sorted (args .items ()))
651
691
for k , args in sorted (whl_libraries .items ())
652
692
},
693
+ config = config ,
653
694
)
654
695
655
696
def _pip_impl (module_ctx ):
0 commit comments