mirror of https://github.com/ARMmbed/mbed-os.git
138 lines
5.3 KiB
Python
138 lines
5.3 KiB
Python
"""
|
|
mbed SDK
|
|
Copyright (c) 2016-2019 ARM Limited
|
|
SPDX-License-Identifier: Apache-2.0
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
"""
|
|
import re
|
|
import os
|
|
import json
|
|
from collections import namedtuple
|
|
from os.path import join, exists
|
|
from os import makedirs, remove
|
|
import shutil
|
|
from copy import deepcopy
|
|
from tools.targets import TARGET_MAP
|
|
|
|
from tools.export.makefile import Makefile, GccArm, Armc5, IAR
|
|
|
|
_eclipse_defs = os.path.join(
|
|
os.path.dirname(os.path.abspath(__file__)), 'cdt_definitions.json')
|
|
|
|
with open(_eclipse_defs, 'r') as f:
|
|
_CONFIGS_OPTIONS = json.load(f)
|
|
|
|
supported_launches = ['debug', 'program', 'erase']
|
|
|
|
class Eclipse(Makefile):
|
|
"""Generic Eclipse project. Intended to be subclassed by classes that
|
|
specify a type of Makefile.
|
|
"""
|
|
def get_target_config(self, configuration):
|
|
"""Retrieve info from cdt_definitions.json"""
|
|
defaults = _CONFIGS_OPTIONS['default']
|
|
eclipse_config = deepcopy(defaults['generic'])
|
|
if configuration in defaults:
|
|
eclipse_config.update(defaults[configuration])
|
|
|
|
# Get target-specific options. Use labels to find alias
|
|
# for target. This allows to define options within inheritance path
|
|
target_specific = _CONFIGS_OPTIONS['targets']
|
|
for target_alias in self.toolchain.target.labels:
|
|
if target_alias in target_specific:
|
|
eclipse_config.update(target_specific[target_alias]['generic'])
|
|
if configuration in target_specific[target_alias]:
|
|
eclipse_config.update(target_specific[target_alias][configuration])
|
|
break
|
|
|
|
return eclipse_config
|
|
|
|
def generate(self):
|
|
"""Generate Makefile, .cproject & .project Eclipse project file,
|
|
pyocd_settings launch files for both GNU ARM Eclipse and
|
|
GNU MCU Eclipse plug-ins, and software link .p2f file
|
|
"""
|
|
super(Eclipse, self).generate()
|
|
starting_dot = re.compile(r'(^[.]/|^[.]$)')
|
|
ctx = {
|
|
'name': self.project_name,
|
|
'elf_location': join('BUILD', self.project_name)+'.elf',
|
|
'c_symbols': self.toolchain.get_symbols(),
|
|
'asm_symbols': self.toolchain.get_symbols(True),
|
|
'target': self.target,
|
|
'include_paths': [starting_dot.sub('%s/' % self.project_name, inc) for inc in self.resources.inc_dirs],
|
|
'load_exe': str(self.LOAD_EXE).lower()
|
|
}
|
|
|
|
launch_cfgs = {}
|
|
for launch_name in supported_launches:
|
|
launch = deepcopy(ctx)
|
|
launch.update({'device': self.get_target_config(launch_name)})
|
|
launch_cfgs[launch_name] = launch
|
|
|
|
if not exists(join(self.export_dir, 'eclipse-extras')):
|
|
makedirs(join(self.export_dir, 'eclipse-extras'))
|
|
|
|
for launch_name, ctx in launch_cfgs.items():
|
|
# Generate launch configurations for former GNU ARM Eclipse plug-in
|
|
self.gen_file('cdt/%s' % 'pyocd_settings_gnu_arm.tmpl', ctx, join('eclipse-extras',
|
|
'{target}_{project}_{conf}_pyocd_settings.launch'.format(
|
|
target=self.target,
|
|
project=self.project_name,
|
|
conf=launch_name)))
|
|
# Generate launch configurations for GNU MCU Eclipse plug-in
|
|
self.gen_file('cdt/%s' % 'pyocd_settings_gnu_mcu.tmpl', ctx, join('eclipse-extras',
|
|
'{target}_{project}_{conf}.launch'.format(
|
|
target=self.target,
|
|
project=self.project_name,
|
|
conf=launch_name)))
|
|
|
|
self.gen_file('cdt/necessary_software.tmpl', ctx,
|
|
join('eclipse-extras', 'necessary_software.p2f'))
|
|
|
|
self.gen_file('cdt/.cproject.tmpl', ctx, '.cproject')
|
|
self.gen_file('cdt/.project.tmpl', ctx, '.project')
|
|
|
|
@staticmethod
|
|
def clean(project_name):
|
|
shutil.rmtree("eclipse-extras")
|
|
remove(".cproject")
|
|
remove(".project")
|
|
|
|
|
|
class EclipseGcc(Eclipse, GccArm):
|
|
LOAD_EXE = True
|
|
NAME = "Eclipse-GCC-ARM"
|
|
|
|
class EclipseArmc5(Eclipse, Armc5):
|
|
LOAD_EXE = False
|
|
NAME = "Eclipse-Armc5"
|
|
|
|
@classmethod
|
|
def is_target_supported(cls, target_name):
|
|
target = TARGET_MAP[target_name]
|
|
if not target.is_TFM_target:
|
|
if int(target.build_tools_metadata["version"]) > 0:
|
|
return "ARMC5" in target.supported_toolchains
|
|
else:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
class EclipseIAR(Eclipse, IAR):
|
|
LOAD_EXE = True
|
|
NAME = "Eclipse-IAR"
|
|
|
|
|