17
17
18
18
from copy import deepcopy
19
19
import os
20
- from os .path import dirname , abspath , exists , join
20
+ from os .path import dirname , abspath , exists , join , isabs
21
21
import sys
22
22
from collections import namedtuple
23
23
from os .path import splitext , relpath
30
30
from tools .targets import CUMULATIVE_ATTRIBUTES , TARGET_MAP , \
31
31
generate_py_target , get_resolution_order
32
32
33
+ PATH_OVERRIDES = set (["target.bootloader_img" ])
34
+ BOOTLOADER_OVERRIDES = set (["target.bootloader_img" , "target.restrict_size" ,
35
+ "target.mbed_app_start" , "target.mbed_app_size" ])
36
+
33
37
# Base class for all configuration exceptions
34
38
class ConfigException (Exception ):
35
39
"""Config system only exception. Makes it easier to distinguish config
@@ -84,6 +88,8 @@ def get_full_name(name, unit_name, unit_kind, label=None,
84
88
else :
85
89
prefix = unit_name + '.'
86
90
return prefix + name
91
+ if name in BOOTLOADER_OVERRIDES :
92
+ return name
87
93
# The name has a prefix, so check if it is valid
88
94
if not allow_prefix :
89
95
raise ConfigException ("Invalid parameter name '%s' in '%s'" %
@@ -362,8 +368,6 @@ class Config(object):
362
368
"artifact_name" : str }
363
369
}
364
370
365
- __unused_overrides = set (["target.bootloader_img" , "target.restrict_size" ,
366
- "target.mbed_app_start" , "target.mbed_app_size" ])
367
371
368
372
# Allowed features in configurations
369
373
__allowed_features = [
@@ -441,6 +445,9 @@ def __init__(self, tgt, top_level_dirs=None, app_config=None):
441
445
self .target = tgt
442
446
self .target = deepcopy (self .target )
443
447
self .target_labels = self .target .labels
448
+ for override in BOOTLOADER_OVERRIDES :
449
+ _ , attr = override .split ("." )
450
+ setattr (self .target , attr , None )
444
451
445
452
self .cumulative_overrides = {key : ConfigCumulativeOverride (key )
446
453
for key in CUMULATIVE_ATTRIBUTES }
@@ -488,15 +495,11 @@ def add_config_files(self, flist):
488
495
@property
489
496
def has_regions (self ):
490
497
"""Does this config have regions defined?"""
491
- if 'target_overrides' in self .app_config_data :
492
- target_overrides = self .app_config_data ['target_overrides' ].get (
493
- self .target .name , {})
494
- return ('target.bootloader_img' in target_overrides or
495
- 'target.restrict_size' in target_overrides or
496
- 'target.mbed_app_start' in target_overrides or
497
- 'target.mbed_app_size' in target_overrides )
498
- else :
499
- return False
498
+ for override in BOOTLOADER_OVERRIDES :
499
+ _ , attr = override .split ("." )
500
+ if getattr (self .target , attr , None ):
501
+ return True
502
+ return False
500
503
501
504
@property
502
505
def sectors (self ):
@@ -526,12 +529,8 @@ def regions(self):
526
529
"targets.json `device_name` not found in "
527
530
"arm_pack_manager index." )
528
531
cmsis_part = cache .index [self .target .device_name ]
529
- target_overrides = self .app_config_data ['target_overrides' ].get (
530
- self .target .name , {})
531
- if (('target.bootloader_img' in target_overrides or
532
- 'target.restrict_size' in target_overrides ) and
533
- ('target.mbed_app_start' in target_overrides or
534
- 'target.mbed_app_size' in target_overrides )):
532
+ if ((self .target .bootloader_img or self .target .restrict_size ) and
533
+ (self .target .mbed_app_start or self .target .mbed_app_size )):
535
534
raise ConfigException (
536
535
"target.bootloader_img and target.restirct_size are "
537
536
"incompatible with target.mbed_app_start and "
@@ -546,23 +545,22 @@ def regions(self):
546
545
except KeyError :
547
546
raise ConfigException ("Not enough information in CMSIS packs to "
548
547
"build a bootloader project" )
549
- if ('target.bootloader_img' in target_overrides or
550
- 'target.restrict_size' in target_overrides ):
551
- return self ._generate_bootloader_build (target_overrides ,
552
- rom_start , rom_size )
553
- elif ('target.mbed_app_start' in target_overrides or
554
- 'target.mbed_app_size' in target_overrides ):
555
- return self ._generate_linker_overrides (target_overrides ,
556
- rom_start , rom_size )
548
+ if self .target .bootloader_img or self .target .restrict_size :
549
+ return self ._generate_bootloader_build (rom_start , rom_size )
550
+ elif self .target .mbed_app_start or self .target .mbed_app_size :
551
+ return self ._generate_linker_overrides (rom_start , rom_size )
557
552
else :
558
553
raise ConfigException (
559
554
"Bootloader build requested but no bootlader configuration" )
560
555
561
- def _generate_bootloader_build (self , target_overrides , rom_start , rom_size ):
556
+ def _generate_bootloader_build (self , rom_start , rom_size ):
562
557
start = rom_start
563
- if 'target.bootloader_img' in target_overrides :
564
- basedir = abspath (dirname (self .app_config_location ))
565
- filename = join (basedir , target_overrides ['target.bootloader_img' ])
558
+ if self .target .bootloader_img :
559
+ if isabs (self .target .bootloader_img ):
560
+ filename = self .target .bootloader_img
561
+ else :
562
+ basedir = abspath (dirname (self .app_config_location ))
563
+ filename = join (basedir , self .target .bootloader_img )
566
564
if not exists (filename ):
567
565
raise ConfigException ("Bootloader %s not found" % filename )
568
566
part = intelhex_offset (filename , offset = rom_start )
@@ -574,8 +572,8 @@ def _generate_bootloader_build(self, target_overrides, rom_start, rom_size):
574
572
yield Region ("bootloader" , rom_start , part_size , False ,
575
573
filename )
576
574
start = rom_start + part_size
577
- if ' target.restrict_size' in target_overrides :
578
- new_size = int (target_overrides [ ' target.restrict_size' ] , 0 )
575
+ if self . target .restrict_size is not None :
576
+ new_size = int (self . target .restrict_size , 0 )
579
577
new_size = Config ._align_floor (start + new_size , self .sectors ) - start
580
578
yield Region ("application" , start , new_size , True , None )
581
579
start += new_size
@@ -618,14 +616,13 @@ def report(self):
618
616
return {'app_config' : self .app_config_location ,
619
617
'library_configs' : map (relpath , self .processed_configs .keys ())}
620
618
621
- @staticmethod
622
- def _generate_linker_overrides (target_overrides , rom_start , rom_size ):
623
- if 'target.mbed_app_start' in target_overrides :
624
- start = int (target_overrides ['target.mbed_app_start' ], 0 )
619
+ def _generate_linker_overrides (self , rom_start , rom_size ):
620
+ if self .target .mbed_app_start is not None :
621
+ start = int (self .target .mbed_app_start , 0 )
625
622
else :
626
623
start = rom_start
627
- if ' target.mbed_app_size' in target_overrides :
628
- size = int (target_overrides [ ' target.mbed_app_size' ] , 0 )
624
+ if self . target .mbed_app_size is not None :
625
+ size = int (self . target .mbed_app_size , 0 )
629
626
else :
630
627
size = (rom_size + rom_start ) - start
631
628
if start < rom_start :
@@ -695,18 +692,22 @@ def _process_config_and_overrides(self, data, params, unit_name, unit_kind):
695
692
696
693
# Consider the others as overrides
697
694
for name , val in overrides .items ():
695
+ if (name in PATH_OVERRIDES and "__config_path" in data ):
696
+ val = os .path .join (
697
+ os .path .dirname (data ["__config_path" ]), val )
698
+
698
699
# Get the full name of the parameter
699
700
full_name = ConfigParameter .get_full_name (name , unit_name ,
700
701
unit_kind , label )
701
702
if full_name in params :
702
703
params [full_name ].set_value (val , unit_name , unit_kind ,
703
704
label )
704
- elif name in self .__unused_overrides :
705
- pass
706
705
elif (name .startswith ("target." ) and
707
- unit_kind is "application" ):
706
+ (unit_kind is "application" or
707
+ name in BOOTLOADER_OVERRIDES )):
708
708
_ , attribute = name .split ("." )
709
709
setattr (self .target , attribute , val )
710
+ continue
710
711
else :
711
712
self .config_errors .append (
712
713
ConfigException (
@@ -759,7 +760,7 @@ def get_target_config_data(self):
759
760
rel_names = [tgt for tgt , _ in
760
761
get_resolution_order (self .target .json_data , tname ,
761
762
[])]
762
- if full_name in self . __unused_overrides :
763
+ if full_name in BOOTLOADER_OVERRIDES :
763
764
continue
764
765
if (full_name not in params ) or \
765
766
(params [full_name ].defined_by [7 :] not in rel_names ):
0 commit comments