Clone of official tools

Revision:
21:4fdf0dd04f6f
Parent:
20:835f6355470d
Child:
22:9e85236d8716
--- a/toolchains/__init__.py	Fri Jul 15 15:28:09 2016 +0100
+++ b/toolchains/__init__.py	Fri Jul 15 22:58:15 2016 +0100
@@ -28,7 +28,7 @@
 from tools.config import Config
 
 from multiprocessing import Pool, cpu_count
-from tools.utils import run_cmd, mkdir, rel_path, ToolException, NotSupportedException, split_path
+from tools.utils import run_cmd, mkdir, rel_path, ToolException, NotSupportedException, split_path, compile_worker
 from tools.settings import BUILD_OPTIONS, MBED_ORG_USER
 import tools.hooks as hooks
 from tools.memap import MemapParser
@@ -38,28 +38,7 @@
 
 #Disables multiprocessing if set to higher number than the host machine CPUs
 CPU_COUNT_MIN = 1
-
-def compile_worker(job):
-    results = []
-    for command in job['commands']:
-        try:
-            _, _stderr, _rc = run_cmd(command, work_dir=job['work_dir'], chroot=job['chroot'])
-        except KeyboardInterrupt as e:
-            raise ToolException
-
-        results.append({
-            'code': _rc,
-            'output': _stderr,
-            'command': command
-        })
-
-    return {
-        'source': job['source'],
-        'object': job['object'],
-        'commands': job['commands'],
-        'results': results
-    }
-
+CPU_COEF = 1
 
 class Resources:
     def __init__(self, base_path=None):
@@ -210,6 +189,8 @@
 
 class mbedToolchain:
     VERBOSE = True
+    COMPILE_C_AS_CPP = False
+    RESPONSE_FILES = True
 
     CORTEX_SYMBOLS = {
         "Cortex-M0" : ["__CORTEX_M0", "ARM_MATH_CM0", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
@@ -223,10 +204,6 @@
         "Cortex-M7FD" : ["__CORTEX_M7", "ARM_MATH_CM7", "__FPU_PRESENT=1", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
         "Cortex-A9" : ["__CORTEX_A9", "ARM_MATH_CA9", "__FPU_PRESENT", "__CMSIS_RTOS", "__EVAL", "__MBED_CMSIS_RTOS_CA9"],
     }
-    
-
-    GOANNA_FORMAT = "[Goanna] warning [%FILENAME%:%LINENO%] - [%CHECKNAME%(%SEVERITY%)] %MESSAGE%"
-    GOANNA_DIAGNOSTIC_PATTERN = re.compile(r'"\[Goanna\] (?P<severity>warning) \[(?P<file>[^:]+):(?P<line>\d+)\] \- (?P<message>.*)"')
 
     MBED_CONFIG_FILE_NAME="mbed_config.h"
 
@@ -271,7 +248,7 @@
         self.ignore_patterns = []
 
         # Pre-mbed 2.0 ignore dirs
-        self.legacy_ignore_dirs = LEGACY_IGNORE_DIRS - set([target.name, LEGACY_TOOLCHAIN_NAMES[self.name]])
+        self.legacy_ignore_dirs = (LEGACY_IGNORE_DIRS | TOOLCHAINS) - set([target.name, LEGACY_TOOLCHAIN_NAMES[self.name]])
 
         # Output notify function
         if notify:
@@ -325,7 +302,7 @@
         elif event['type'] == 'cc':
             event['severity'] = event['severity'].title()
             event['file'] = basename(event['file'])
-            msg = '[%(severity)s] %(file)s@%(line)s: %(message)s' % event
+            msg = '[%(severity)s] %(file)s@%(line)s,%(col)s: %(message)s' % event
 
         elif event['type'] == 'progress':
             if not silent:
@@ -360,12 +337,6 @@
         """
         return self.notify_fun(event, self.silent)
 
-    def goanna_parse_line(self, line):
-        if "analyze" in self.options:
-            return self.GOANNA_DIAGNOSTIC_PATTERN.match(line)
-        else:
-            return None
-
     def get_symbols(self):
         if self.symbols is None:
             # Target and Toolchain symbols
@@ -451,6 +422,8 @@
     # object and the parameter *exclude_paths* is used by the directory traversal to
     # exclude certain paths from the traversal.
     def scan_resources(self, path, exclude_paths=None, base_path=None):
+        self.progress("scan", path)
+
         resources = Resources(path)
         if not base_path:
             if isfile(path):
@@ -498,9 +471,8 @@
             for d in copy(dirs):
                 dir_path = join(root, d)
                 # Add internal repo folders/files. This is needed for exporters
-                if d == '.hg':
+                if d == '.hg' or d == '.git':
                     resources.repo_dirs.append(dir_path)
-                    resources.repo_files.extend(self.scan_repository(dir_path))
 
                 if ((d.startswith('.') or d in self.legacy_ignore_dirs) or
                     # Ignore targets that do not match the TARGET in extra_labels list
@@ -632,20 +604,6 @@
             mkdir(obj_dir)
         return join(obj_dir, name + '.o')
 
-    def get_link_file(self, cmd):
-        link_file = join(self.build_dir, ".link_files.txt")
-        with open(link_file, "wb") as f:
-            cmd_list = []
-            for c in cmd:
-                if c:
-                    c = c.replace("\\", "/")
-                    if self.CHROOT:
-                        c = c.replace(self.CHROOT, '')
-                    cmd_list.append(('"%s"' % c) if not c.startswith('-') else c)
-            string = " ".join(cmd_list)
-            f.write(string)
-        return link_file
-
     def get_inc_file(self, includes):
         include_file = join(self.build_dir, ".includes_%s.txt" % self.inc_md5)
         if not exists(include_file):
@@ -661,12 +619,38 @@
                 f.write(string)
         return include_file
 
+    def get_link_file(self, cmd):
+        link_file = join(self.build_dir, ".link_files.txt")
+        with open(link_file, "wb") as f:
+            cmd_list = []
+            for c in cmd:
+                if c:
+                    c = c.replace("\\", "/")
+                    if self.CHROOT:
+                        c = c.replace(self.CHROOT, '')
+                    cmd_list.append(('"%s"' % c) if not c.startswith('-') else c)
+            string = " ".join(cmd_list)
+            f.write(string)
+        return link_file
+ 
+    def get_arch_file(self, objects):
+        archive_file = join(self.build_dir, ".archive_files.txt")
+        with open(archive_file, "wb") as f:
+            o_list = []
+            for o in objects:
+                o_list.append('"%s"' % o)
+            string = " ".join(o_list).replace("\\", "/")
+            f.write(string)
+        return archive_file
+
     def compile_sources(self, resources, build_path, inc_dirs=None):
         # Web IDE progress bar for project build
         files_to_compile = resources.s_sources + resources.c_sources + resources.cpp_sources
         self.to_be_compiled = len(files_to_compile)
         self.compiled = 0
 
+        self.cc_verbose("Macros: "+' '.join(['-D%s' % s for s in self.get_symbols()]))
+
         inc_paths = resources.inc_dirs
         if inc_dirs is not None:
             inc_paths.extend(inc_dirs)
@@ -716,7 +700,7 @@
             self.compiled += 1
             self.progress("compile", item['source'], build_update=True)
             for res in result['results']:
-                self.debug("Command: %s" % ' '.join(res['command']))
+                self.cc_verbose("Compile: %s" % ' '.join(res['command']), result['source'])
                 self.compile_output([
                     res['code'],
                     res['output'],
@@ -726,7 +710,7 @@
         return objects
 
     def compile_queue(self, queue, objects):
-        jobs_count = int(self.jobs if self.jobs else cpu_count())
+        jobs_count = int(self.jobs if self.jobs else cpu_count() * CPU_COEF)
         p = Pool(processes=jobs_count)
 
         results = []
@@ -753,7 +737,7 @@
                         self.compiled += 1
                         self.progress("compile", result['source'], build_update=True)
                         for res in result['results']:
-                            self.debug("Command: %s" % ' '.join(res['command']))
+                            self.cc_verbose("Compile: %s" % ' '.join(res['command']), result['source'])
                             self.compile_output([
                                 res['code'],
                                 res['output'],
@@ -784,10 +768,10 @@
             dep_path = base + '.d'
             deps = self.parse_dependencies(dep_path) if (exists(dep_path)) else []
             if len(deps) == 0 or self.need_update(object, deps):
-                if ext == '.c':
+                if ext == '.cpp' or self.COMPILE_C_AS_CPP:
+                    return self.compile_cpp(source, object, includes)
+                else:
                     return self.compile_c(source, object, includes)
-                else:
-                    return self.compile_cpp(source, object, includes)
         elif ext == '.s':
             deps = [source]
             if self.need_update(object, deps):
@@ -811,12 +795,8 @@
         for error_line in _stderr.splitlines():
             self.debug("Output: %s"% error_line)
 
-
         # Check return code
         if _rc != 0:
-            for line in _stderr.splitlines():
-                self.tool_error(line)
-
             if self.is_not_supported_error(_stderr):
                 raise NotSupportedException(_stderr)
             else:
@@ -863,7 +843,6 @@
         if self.need_update(bin, [elf]):
             needed_update = True
             self.progress("elf2bin", name)
-
             self.binary(r, elf, bin)
 
         self.mem_stats(map)
@@ -874,9 +853,7 @@
         return bin, needed_update
 
     def default_cmd(self, command):
-        self.debug("Command: %s"% ' '.join(command))
         _stdout, _stderr, _rc = run_cmd(command, work_dir=getcwd(), chroot=self.CHROOT)
-
         self.debug("Return: %s"% _rc)
 
         for output_line in _stdout.splitlines():
@@ -900,14 +877,13 @@
             message = "[DEBUG] " + message
             self.notify({'type': 'debug', 'message': message})
 
-    def cc_info(self, severity, file, line, message, target_name=None, toolchain_name=None):
-        self.notify({'type': 'cc',
-                     'severity': severity,
-                     'file': file,
-                     'line': line,
-                     'message': message,
-                     'target_name': target_name,
-                     'toolchain_name': toolchain_name})
+    def cc_info(self, info=None):
+        if info is not None:
+            info['type'] = 'cc'
+            self.notify(info)
+
+    def cc_verbose(self, message, file=""):
+        self.debug(message)
 
     def progress(self, action, file, build_update=False):
         msg = {'type': 'progress', 'action': action, 'file': file}