Clone of official tools

Revision:
40:7d3fa6b99b2b
Parent:
38:399953da035d
Child:
41:2a77626a4c21
--- a/export/sw4stm32/__init__.py	Wed Jul 19 16:44:30 2017 -0500
+++ b/export/sw4stm32/__init__.py	Tue Oct 10 16:56:30 2017 -0500
@@ -1,6 +1,6 @@
 """
 mbed SDK
-Copyright (c) 2011-2016 ARM Limited
+Copyright (c) 2011-2017 ARM Limited
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -14,109 +14,508 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 """
+
 from os.path import splitext, basename, join
-from random import randint
 from tools.utils import mkdir
-from tools.export.exporters import Exporter
+from tools.export.gnuarmeclipse import GNUARMEclipse
+from tools.export.gnuarmeclipse import UID
+from tools.build_api import prepare_toolchain
+from sys import flags, platform
+
+# Global random number generator instance.
+u = UID()
 
 
-class Sw4STM32(Exporter):
+class Sw4STM32(GNUARMEclipse):
+    """
+    Sw4STM32 class
+    """
     NAME = 'Sw4STM32'
     TOOLCHAIN = 'GCC_ARM'
 
     BOARDS = {
-        'B96B_F446VE':             {'name': 'B96B-F446VE',           'mcuId': 'STM32F446VETx'},
-        'DISCO_F051R8':            {'name': 'STM32F0DISCOVERY',      'mcuId': 'STM32F051R8Tx'},
-        'DISCO_F303VC':            {'name': 'STM32F3DISCOVERY',      'mcuId': 'STM32F303VCTx'},
-        'DISCO_F334C8':            {'name': 'STM32F3348DISCOVERY',   'mcuId': 'STM32F334C8Tx'},
-        'DISCO_F401VC':            {'name': 'STM32F401C-DISCO',      'mcuId': 'STM32F401VCTx'},
-        'DISCO_F407VG':            {'name': 'STM32F4DISCOVERY',      'mcuId': 'STM32F407VGTx'},
-        'DISCO_F413ZH':            {'name': 'DISCO_F413',            'mcuId': 'STM32F413ZHTx'},
-        'DISCO_F429ZI':            {'name': 'STM32F429I-DISCO',      'mcuId': 'STM32F429ZITx'},
-        'DISCO_F469NI':            {'name': 'DISCO-F469NI',          'mcuId': 'STM32F469NIHx'},
-        'DISCO_F746NG':            {'name': 'STM32F746G-DISCO',      'mcuId': 'STM32F746NGHx'},
-        'DISCO_F769NI':            {'name': 'DISCO-F769NI',          'mcuId': 'STM32F769NIHx'},
-        'DISCO_L053C8':            {'name': 'STM32L0538DISCOVERY',   'mcuId': 'STM32L053C8Tx'},
-        'DISCO_L072CZ_LRWAN1':     {'name': 'DISCO-L072CZ-LRWAN1',   'mcuId': 'STM32L072CZTx'},
-        'DISCO_L475VG_IOT01A':     {'name': 'STM32L475G-DISCO',      'mcuId': 'STM32L475VGTx'},
-        'DISCO_L476VG':            {'name': 'STM32L476G-DISCO',      'mcuId': 'STM32L476VGTx'},
-        'NUCLEO_F030R8':           {'name': 'NUCLEO-F030R8',         'mcuId': 'STM32F030R8Tx'},
-        'NUCLEO_F031K6':           {'name': 'NUCLEO-F031K6',         'mcuId': 'STM32F031K6Tx'},
-        'NUCLEO_F042K6':           {'name': 'NUCLEO-F042K6',         'mcuId': 'STM32F042K6Tx'},
-        'NUCLEO_F070RB':           {'name': 'NUCLEO-F070RB',         'mcuId': 'STM32F070RBTx'},
-        'NUCLEO_F072RB':           {'name': 'NUCLEO-F072RB',         'mcuId': 'STM32F072RBTx'},
-        'NUCLEO_F091RC':           {'name': 'NUCLEO-F091RC',         'mcuId': 'STM32F091RCTx'},
-        'NUCLEO_F103RB':           {'name': 'NUCLEO-F103RB',         'mcuId': 'STM32F103RBTx'},
-        'NUCLEO_F207ZG':           {'name': 'NUCLEO-F207ZG',         'mcuId': 'STM32F207ZGTx'},
-        'NUCLEO_F302R8':           {'name': 'NUCLEO-F302R8',         'mcuId': 'STM32F302R8Tx'},
-        'NUCLEO_F303K8':           {'name': 'NUCLEO-F303K8',         'mcuId': 'STM32F303K8Tx'},
-        'NUCLEO_F303RE':           {'name': 'NUCLEO-F303RE',         'mcuId': 'STM32F303RETx'},
-        'NUCLEO_F303ZE':           {'name': 'NUCLEO-F303ZE',         'mcuId': 'STM32F303ZETx'},
-        'NUCLEO_F334R8':           {'name': 'NUCLEO-F334R8',         'mcuId': 'STM32F334R8Tx'},
-        'NUCLEO_F401RE':           {'name': 'NUCLEO-F401RE',         'mcuId': 'STM32F401RETx'},
-        'NUCLEO_F410RB':           {'name': 'NUCLEO-F410RB',         'mcuId': 'STM32F410RBTx'},
-        'NUCLEO_F411RE':           {'name': 'NUCLEO-F411RE',         'mcuId': 'STM32F411RETx'},
-        'NUCLEO_F429ZI':           {'name': 'NUCLEO-F429ZI',         'mcuId': 'STM32F429ZITx'},
-        'NUCLEO_F446RE':           {'name': 'NUCLEO-F446RE',         'mcuId': 'STM32F446RETx'},
-        'NUCLEO_F446ZE':           {'name': 'NUCLEO-F446ZE',         'mcuId': 'STM32F446ZETx'},
-        'NUCLEO_F746ZG':           {'name': 'NUCLEO-F746ZG',         'mcuId': 'STM32F746ZGTx'},
-        'NUCLEO_F767ZI':           {'name': 'NUCLEO-F767ZI',         'mcuId': 'STM32F767ZITx'},
-        'NUCLEO_L011K4':           {'name': 'NUCLEO-L011K4',         'mcuId': 'STM32L011K4Tx'},
-        'NUCLEO_L031K6':           {'name': 'NUCLEO-L031K6',         'mcuId': 'STM32L031K6Tx'},
-        'NUCLEO_L053R8':           {'name': 'NUCLEO-L053R8',         'mcuId': 'STM32L053R8Tx'},
-        'NUCLEO_L073RZ':           {'name': 'NUCLEO-L073RZ',         'mcuId': 'STM32L073RZTx'},
-        'NUCLEO_L152RE':           {'name': 'NUCLEO-L152RE',         'mcuId': 'STM32L152RETx'},
-        'NUCLEO_L432KC':           {'name': 'NUCLEO-L432KC',         'mcuId': 'STM32L432KCUx'},
-        'NUCLEO_L476RG':           {'name': 'NUCLEO-L476RG',         'mcuId': 'STM32L476RGTx'},
+        'B96B_F446VE':
+        {
+            'name': 'B96B-F446VE',
+            'mcuId': 'STM32F446VETx'
+        },
+        'DISCO_F051R8':
+        {
+            'name': 'STM32F0DISCOVERY',
+            'mcuId': 'STM32F051R8Tx'
+        },
+        'DISCO_F303VC':
+        {
+            'name': 'STM32F3DISCOVERY',
+            'mcuId': 'STM32F303VCTx'
+        },
+        'DISCO_F334C8':
+        {
+            'name': 'STM32F3348DISCOVERY',
+            'mcuId': 'STM32F334C8Tx'
+        },
+        'DISCO_F401VC':
+        {
+            'name': 'STM32F401C-DISCO',
+            'mcuId': 'STM32F401VCTx'
+        },
+        'DISCO_F407VG':
+        {
+            'name': 'STM32F4DISCOVERY',
+            'mcuId': 'STM32F407VGTx'
+        },
+        'DISCO_F413ZH':
+        {
+            'name': 'DISCO_F413',
+            'mcuId': 'STM32F413ZHTx'
+        },
+        'DISCO_F429ZI':
+        {
+            'name': 'STM32F429I-DISCO',
+            'mcuId': 'STM32F429ZITx'
+        },
+        'DISCO_F469NI':
+        {
+            'name': 'DISCO-F469NI',
+            'mcuId': 'STM32F469NIHx'
+        },
+        'DISCO_F746NG':
+        {
+            'name': 'STM32F746G-DISCO',
+            'mcuId': 'STM32F746NGHx'
+        },
+        'DISCO_F769NI':
+        {
+            'name': 'DISCO-F769NI',
+            'mcuId': 'STM32F769NIHx'
+        },
+        'DISCO_L053C8':
+        {
+            'name': 'STM32L0538DISCOVERY',
+            'mcuId': 'STM32L053C8Tx'
+        },
+        'DISCO_L072CZ_LRWAN1':
+        {
+            'name': 'DISCO-L072CZ-LRWAN1',
+            'mcuId': 'STM32L072CZTx'
+        },
+        'DISCO_L475VG_IOT01A':
+        {
+            'name': 'STM32L475G-DISCO',
+            'mcuId': 'STM32L475VGTx'
+        },
+        'DISCO_L476VG':
+        {
+            'name': 'STM32L476G-DISCO',
+            'mcuId': 'STM32L476VGTx'
+        },
+        'NUCLEO_F030R8':
+        {
+            'name': 'NUCLEO-F030R8',
+            'mcuId': 'STM32F030R8Tx'
+        },
+        'NUCLEO_F031K6':
+        {
+            'name': 'NUCLEO-F031K6',
+            'mcuId': 'STM32F031K6Tx'
+        },
+        'NUCLEO_F042K6':
+        {
+            'name': 'NUCLEO-F042K6',
+            'mcuId': 'STM32F042K6Tx'
+        },
+        'NUCLEO_F070RB':
+        {
+            'name': 'NUCLEO-F070RB',
+            'mcuId': 'STM32F070RBTx'
+        },
+        'NUCLEO_F072RB':
+        {
+            'name': 'NUCLEO-F072RB',
+            'mcuId': 'STM32F072RBTx'
+        },
+        'NUCLEO_F091RC':
+        {
+            'name': 'NUCLEO-F091RC',
+            'mcuId': 'STM32F091RCTx'
+        },
+        'NUCLEO_F103RB':
+        {
+            'name': 'NUCLEO-F103RB',
+            'mcuId': 'STM32F103RBTx'
+        },
+        'NUCLEO_F207ZG':
+        {
+            'name': 'NUCLEO-F207ZG',
+            'mcuId': 'STM32F207ZGTx'
+        },
+        'NUCLEO_F302R8':
+        {
+            'name': 'NUCLEO-F302R8',
+            'mcuId': 'STM32F302R8Tx'
+        },
+        'NUCLEO_F303K8':
+        {
+            'name': 'NUCLEO-F303K8',
+            'mcuId': 'STM32F303K8Tx'
+        },
+        'NUCLEO_F303RE':
+        {
+            'name': 'NUCLEO-F303RE',
+            'mcuId': 'STM32F303RETx'
+        },
+        'NUCLEO_F303ZE':
+        {
+            'name': 'NUCLEO-F303ZE',
+            'mcuId': 'STM32F303ZETx'
+        },
+        'NUCLEO_F334R8':
+        {
+            'name': 'NUCLEO-F334R8',
+            'mcuId': 'STM32F334R8Tx'
+        },
+        'NUCLEO_F401RE':
+        {
+            'name': 'NUCLEO-F401RE',
+            'mcuId': 'STM32F401RETx'
+        },
+        'NUCLEO_F410RB':
+        {
+            'name': 'NUCLEO-F410RB',
+            'mcuId': 'STM32F410RBTx'
+        },
+        'NUCLEO_F411RE':
+        {
+            'name': 'NUCLEO-F411RE',
+            'mcuId': 'STM32F411RETx'
+        },
+        'NUCLEO_F429ZI':
+        {
+            'name': 'NUCLEO-F429ZI',
+            'mcuId': 'STM32F429ZITx'
+        },
+        'NUCLEO_F446RE':
+        {
+            'name': 'NUCLEO-F446RE',
+            'mcuId': 'STM32F446RETx'
+        },
+        'NUCLEO_F446ZE':
+        {
+            'name': 'NUCLEO-F446ZE',
+            'mcuId': 'STM32F446ZETx'
+        },
+        'NUCLEO_F746ZG':
+        {
+            'name': 'NUCLEO-F746ZG',
+            'mcuId': 'STM32F746ZGTx'
+        },
+        'NUCLEO_F767ZI':
+        {
+            'name': 'NUCLEO-F767ZI',
+            'mcuId': 'STM32F767ZITx'
+        },
+        'NUCLEO_L011K4':
+        {
+            'name': 'NUCLEO-L011K4',
+            'mcuId': 'STM32L011K4Tx'
+        },
+        'NUCLEO_L031K6':
+        {
+            'name': 'NUCLEO-L031K6',
+            'mcuId': 'STM32L031K6Tx'
+        },
+        'NUCLEO_L053R8':
+        {
+            'name': 'NUCLEO-L053R8',
+            'mcuId': 'STM32L053R8Tx'
+        },
+        'NUCLEO_L073RZ':
+        {
+            'name': 'NUCLEO-L073RZ',
+            'mcuId': 'STM32L073RZTx'
+        },
+        'NUCLEO_L152RE':
+        {
+            'name': 'NUCLEO-L152RE',
+            'mcuId': 'STM32L152RETx'
+        },
+        'NUCLEO_L432KC':
+        {
+            'name': 'NUCLEO-L432KC',
+            'mcuId': 'STM32L432KCUx'
+        },
+        'NUCLEO_L476RG':
+        {
+            'name': 'NUCLEO-L476RG',
+            'mcuId': 'STM32L476RGTx'
+        },
     }
 
     TARGETS = BOARDS.keys()
 
-    def __gen_dir(self, dirname):
-        settings = join(self.export_dir, dirname)
+    def __gen_dir(self, dir_name):
+        """
+        Method that creates directory
+        """
+        settings = join(self.export_dir, dir_name)
         mkdir(settings)
 
-    def __generate_uid(self):
-        return "%0.9u" % randint(0, 999999999)
+    def get_fpu_hardware(self, fpu_unit):
+        """
+        Convert fpu unit name into hardware name.
+        """
+        hw = ''
+        fpus = {
+            'fpv4spd16': 'fpv4-sp-d16',
+            'fpv5d16': 'fpv5-d16',
+            'fpv5spd16': 'fpv5-sp-d16'
+        }
+        if fpu_unit in fpus:
+            hw = fpus[fpu_unit]
+        return hw
+
+    def process_sw_options(self, opts, flags_in):
+        """
+        Process System Workbench specific options.
+
+        System Workbench for STM32 has some compile options, which are not recognized by the GNUARMEclipse exporter.
+        Those are handled in this method.
+        """
+        opts['c']['preprocess'] = False
+        if '-E' in flags_in['c_flags']:
+            opts['c']['preprocess'] = True
+        opts['cpp']['preprocess'] = False
+        if '-E' in flags_in['cxx_flags']:
+            opts['cpp']['preprocess'] = True
+        opts['c']['slowflashdata'] = False
+        if '-mslow-flash-data' in flags_in['c_flags']:
+            opts['c']['slowflashdata'] = True
+        opts['cpp']['slowflashdata'] = False
+        if '-mslow-flash-data' in flags_in['cxx_flags']:
+            opts['cpp']['slowflashdata'] = True
+        if opts['common']['optimization.messagelength']:
+            opts['common']['optimization.other'] += ' -fmessage-length=0'
+        if opts['common']['optimization.signedchar']:
+            opts['common']['optimization.other'] += ' -fsigned-char'
+        if opts['common']['optimization.nocommon']:
+            opts['common']['optimization.other'] += ' -fno-common'
+        if opts['common']['optimization.noinlinefunctions']:
+            opts['common']['optimization.other'] += ' -fno-inline-functions'
+        if opts['common']['optimization.freestanding']:
+            opts['common']['optimization.other'] += ' -ffreestanding'
+        if opts['common']['optimization.nobuiltin']:
+            opts['common']['optimization.other'] += ' -fno-builtin'
+        if opts['common']['optimization.spconstant']:
+            opts['common']['optimization.other'] += ' -fsingle-precision-constant'
+        if opts['common']['optimization.nomoveloopinvariants']:
+            opts['common']['optimization.other'] += ' -fno-move-loop-invariants'
+        if opts['common']['warnings.unused']:
+            opts['common']['warnings.other'] += ' -Wunused'
+        if opts['common']['warnings.uninitialized']:
+            opts['common']['warnings.other'] += ' -Wuninitialized'
+        if opts['common']['warnings.missingdeclaration']:
+            opts['common']['warnings.other'] += ' -Wmissing-declarations'
+        if opts['common']['warnings.pointerarith']:
+            opts['common']['warnings.other'] += ' -Wpointer-arith'
+        if opts['common']['warnings.padded']:
+            opts['common']['warnings.other'] += ' -Wpadded'
+        if opts['common']['warnings.shadow']:
+            opts['common']['warnings.other'] += ' -Wshadow'
+        if opts['common']['warnings.logicalop']:
+            opts['common']['warnings.other'] += ' -Wlogical-op'
+        if opts['common']['warnings.agreggatereturn']:
+            opts['common']['warnings.other'] += ' -Waggregate-return'
+        if opts['common']['warnings.floatequal']:
+            opts['common']['warnings.other'] += ' -Wfloat-equal'
+        opts['ld']['strip'] = False
+        if '-s' in flags_in['ld_flags']:
+            opts['ld']['strip'] = True
+        opts['ld']['shared'] = False
+        if '-shared' in flags_in['ld_flags']:
+            opts['ld']['shared'] = True
+        opts['ld']['soname'] = ''
+        opts['ld']['implname'] = ''
+        opts['ld']['defname'] = ''
+        for item in flags_in['ld_flags']:
+            if item.startswith('-Wl,-soname='):
+                opts['ld']['soname'] = item[len('-Wl,-soname='):]
+            if item.startswith('-Wl,--out-implib='):
+                opts['ld']['implname'] = item[len('-Wl,--out-implib='):]
+            if item.startswith('-Wl,--output-def='):
+                opts['ld']['defname'] = item[len('-Wl,--output-def='):]
+        opts['common']['arm.target.fpu.hardware'] = self.get_fpu_hardware(
+            opts['common']['arm.target.fpu.unit'])
+        opts['common']['debugging.codecov'] = False
+        if '-fprofile-arcs' in flags_in['common_flags'] and '-ftest-coverage' in flags_in['common_flags']:
+            opts['common']['debugging.codecov'] = True
+        # Passing linker options to linker with '-Wl,'-prefix.
+        for index in range(len(opts['ld']['flags'])):
+            item = opts['ld']['flags'][index]
+            if not item.startswith('-Wl,'):
+                opts['ld']['flags'][index] = '-Wl,' + item
+        # Strange System Workbench feature: If first parameter in Other flags is a
+        # define (-D...), Other flags will be replaced by defines and other flags
+        # are completely ignored. Moving -D parameters to defines.
+        for compiler in ['c', 'cpp', 'as']:
+            tmpList = opts[compiler]['other'].split(' ')
+            otherList = []
+            for item in tmpList:
+                if item.startswith('-D'):
+                    opts[compiler]['defines'].append(str(item[2:]))
+                else:
+                    otherList.append(item)
+            opts[compiler]['other'] = ' '.join(otherList)
+        # Assembler options
+        for as_def in opts['as']['defines']:
+            if '=' in as_def:
+                opts['as']['other'] += ' --defsym ' + as_def
+            else:
+                opts['as']['other'] += ' --defsym ' + as_def + '=1'
 
     def generate(self):
-        fp_hardware = "no"
-        fp_abi = "soft"
-        core = self.toolchain.target.core
-        if core == "Cortex-M4F" or core == "Cortex-M7F":
-            fp_hardware = "fpv4-sp-d16"
-            fp_abi = "soft-fp"
-        elif core == "Cortex-M7FD":
-            fp_hardware = "fpv5-d16"
-            fp_abi = "soft-fp"
-            
+        """
+        Generate the .project and .cproject files.
+        """
+        options = {}
+
+        if not self.resources.linker_script:
+            raise NotSupportedException("No linker script found.")
+
+        print ('\nCreate a System Workbench for STM32 managed project')
+        print ('Project name: {0}'.format(self.project_name))
+        print ('Target:       {0}'.format(self.toolchain.target.name))
+        print ('Toolchain:    {0}'.format(self.TOOLCHAIN) + '\n')
+
+        self.resources.win_to_unix()
+
+        config_header = self.filter_dot(self.toolchain.get_config_header())
+
         libraries = []
         for lib in self.resources.libraries:
-            l, _ = splitext(basename(lib))
-            libraries.append(l[3:])
+            library, _ = splitext(basename(lib))
+            libraries.append(library[3:])
+
+        self.system_libraries = [
+            'stdc++', 'supc++', 'm', 'c', 'gcc', 'nosys'
+        ]
+
+        profiles = self.get_all_profiles()
+        self.as_defines = [s.replace('"', '"')
+                           for s in self.toolchain.get_symbols(True)]
+        self.c_defines = [s.replace('"', '"')
+                          for s in self.toolchain.get_symbols()]
+        self.cpp_defines = self.c_defines
+        print 'Symbols: {0}'.format(len(self.c_defines))
+
+        self.include_path = []
+        for s in self.resources.inc_dirs:
+            self.include_path.append("../" + self.filter_dot(s))
+        print ('Include folders: {0}'.format(len(self.include_path)))
+
+        self.compute_exclusions()
+
+        print ('Exclude folders: {0}'.format(len(self.excluded_folders)))
+
+        ld_script = self.filter_dot(self.resources.linker_script)
+        print ('Linker script:   {0}'.format(ld_script))
+
+        lib_dirs = [self.filter_dot(s) for s in self.resources.lib_dirs]
+
+        preproc_cmd = basename(self.toolchain.preproc[0]) + " " + " ".join(self.toolchain.preproc[1:])
+
+        for id in ['debug', 'release']:
+            opts = {}
+            opts['common'] = {}
+            opts['as'] = {}
+            opts['c'] = {}
+            opts['cpp'] = {}
+            opts['ld'] = {}
+
+            opts['id'] = id
+            opts['name'] = opts['id'].capitalize()
+
+            # TODO: Add prints to log or console in verbose mode.
+            #print ('\nBuild configuration: {0}'.format(opts['name']))
+
+            profile = profiles[id]
+
+            # A small hack, do not bother with src_path again,
+            # pass an empty string to avoid crashing.
+            src_paths = ['']
+            toolchain = prepare_toolchain(
+                src_paths, "", self.toolchain.target.name, self.TOOLCHAIN, build_profile=[profile])
+
+            # Hack to fill in build_dir
+            toolchain.build_dir = self.toolchain.build_dir
+
+            flags = self.toolchain_flags(toolchain)
+
+            # TODO: Add prints to log or console in verbose mode.
+            # print 'Common flags:', ' '.join(flags['common_flags'])
+            # print 'C++ flags:', ' '.join(flags['cxx_flags'])
+            # print 'C flags:', ' '.join(flags['c_flags'])
+            # print 'ASM flags:', ' '.join(flags['asm_flags'])
+            # print 'Linker flags:', ' '.join(flags['ld_flags'])
+
+            # Most GNU ARM Eclipse options have a parent,
+            # either debug or release.
+            if '-O0' in flags['common_flags'] or '-Og' in flags['common_flags']:
+                opts['parent_id'] = 'debug'
+            else:
+                opts['parent_id'] = 'release'
+
+            self.process_options(opts, flags)
+
+            opts['c']['defines'] = self.c_defines
+            opts['cpp']['defines'] = self.cpp_defines
+            opts['as']['defines'] = self.as_defines
+
+            self.process_sw_options(opts, flags)
+
+            opts['ld']['library_paths'] = [
+                self.filter_dot(s) for s in self.resources.lib_dirs]
+
+            opts['ld']['user_libraries'] = libraries
+            opts['ld']['system_libraries'] = self.system_libraries
+            opts['ld']['script'] = "linker-script-" + id + ".ld"
+
+            # Unique IDs used in multiple places.
+            uid = {}
+            uid['config'] = u.id
+            uid['tool_c_compiler'] = u.id
+            uid['tool_c_compiler_input'] = u.id
+            uid['tool_cpp_compiler'] = u.id
+            uid['tool_cpp_compiler_input'] = u.id
+
+            opts['uid'] = uid
+
+            options[id] = opts
 
         ctx = {
             'name': self.project_name,
-            'include_paths': self.resources.inc_dirs,
-            'linker_script': self.resources.linker_script,
-            'library_paths': self.resources.lib_dirs,
+            'platform': platform,
+            'include_paths': self.include_path,
+            'config_header': config_header,
+            'exclude_paths': '|'.join(self.excluded_folders),
+            'ld_script': ld_script,
+            'library_paths': lib_dirs,
             'object_files': self.resources.objects,
             'libraries': libraries,
-            'symbols': self.toolchain.get_symbols(),
             'board_name': self.BOARDS[self.target.upper()]['name'],
             'mcu_name': self.BOARDS[self.target.upper()]['mcuId'],
-            'debug_config_uid': self.__generate_uid(),
-            'debug_tool_compiler_uid': self.__generate_uid(),
-            'debug_tool_compiler_input_uid': self.__generate_uid(),
-            'release_config_uid': self.__generate_uid(),
-            'release_tool_compiler_uid': self.__generate_uid(),
-            'release_tool_compiler_input_uid': self.__generate_uid(),
-            'uid': self.__generate_uid(),
-            'floating_point_hardware': fp_hardware,
-            'floating_point_abi': fp_abi
+            'cpp_cmd': preproc_cmd,
+            'options': options,
+            # id property of 'u' will generate new random identifier every time
+            # when called.
+            'u': u
         }
 
         self.__gen_dir('.settings')
-        self.gen_file('sw4stm32/language_settings_commom.tmpl', ctx, '.settings/language.settings.xml')
+        self.gen_file('sw4stm32/language_settings_commom.tmpl',
+                      ctx, '.settings/language.settings.xml')
         self.gen_file('sw4stm32/project_common.tmpl', ctx, '.project')
         self.gen_file('sw4stm32/cproject_common.tmpl', ctx, '.cproject')
+        self.gen_file('sw4stm32/makefile.targets.tmpl', ctx,
+                      'makefile.targets', trim_blocks=True, lstrip_blocks=True)
+        self.gen_file('sw4stm32/launch.tmpl', ctx, self.project_name +
+                      ' ' + options['debug']['name'] + '.launch')