Abstractify the mbedToolchain base class

The mbedToolchain class calls many members of it's subclasses, expecting
them to implement a particular API. This change adds a requirement to
each subclass that requires them to implement this expected API.

The API consists of these methods:
 - parse_dependencies
 - parse_ouptut
 - get_config_option
 - compile_c
 - compile_cpp
 - link
 - archive
 - binary
pull/2173/head
Jimmy Brisson 2016-07-05 17:58:43 -05:00
parent d0d023ab58
commit 17833e8f58
1 changed files with 73 additions and 0 deletions

View File

@ -26,6 +26,7 @@ from os.path import join, splitext, exists, relpath, dirname, basename, split, a
from inspect import getmro from inspect import getmro
from copy import deepcopy from copy import deepcopy
from tools.config import Config from tools.config import Config
from abc import ABCMeta, abstractmethod
from multiprocessing import Pool, cpu_count 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
@ -230,6 +231,8 @@ class mbedToolchain:
MBED_CONFIG_FILE_NAME="mbed_config.h" MBED_CONFIG_FILE_NAME="mbed_config.h"
__metaclass__ = ABCMeta
def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False): def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False):
self.target = target self.target = target
self.name = self.__class__.__name__ self.name = self.__class__.__name__
@ -784,9 +787,22 @@ class mbedToolchain:
return None return None
@abstractmethod
def parse_dependencies(self, dep_path):
"""Take in a dependency file generated by the compiler and build a list of
all files that the dep_path depends on.
"""
pass
def is_not_supported_error(self, output): def is_not_supported_error(self, output):
return "#error directive: [NOT_SUPPORTED]" in output return "#error directive: [NOT_SUPPORTED]" in output
@abstractmethod
def parse_output(self, output):
"""Take in compiler output and extract sinlge line warnings and errors from it
"""
pass
def compile_output(self, output=[]): def compile_output(self, output=[]):
_rc = output[0] _rc = output[0]
_stderr = output[1] _stderr = output[1]
@ -958,6 +974,63 @@ class mbedToolchain:
f.write(Config.config_to_header(self.config_data)) f.write(Config.config_to_header(self.config_data))
return config_file return config_file
@abstractmethod
def get_config_option(self, config_header):
"""Generate the compiler option that forces the inclusion of the configuration
header file.
"""
pass
@abstractmethod
def assemble(self, source, object, includes):
"""Generate the command line that:
- Assembles the given assembly *source* file.
- Puts the results into the file named *object*.
- Has an include search path that includes everything in *includes*
"""
pass
@abstractmethod
def compile_c(self, source, object, includes):
"""Generate the command line that:
- Compiles the given C *source* file.
- Puts the results into the file named *object*.
- Has an include search path that includes everything in *includes*
"""
pass
@abstractmethod
def compile_cpp(self, source, object, includes):
"""Generate the command line that:
- Compiles the given C++ *source* file.
- Puts the results into the file named *object*.
- Has an include search path that includes everything in *includes*
"""
pass
@abstractmethod
def link(self, output, objects, libraries, lib_dirs, mem_map):
"""Run the link command that will:
- Emit a file named *output*
- Includes all *objects* and *libraries*
- Searches for libraries in *lib_dirs*
- Generates a memory map file in the file *mem_map*
"""
pass
@abstractmethod
def archive(self, objects, lib_path):
"""Run the command line that creates an archive containing *objects*, and named *lib_path*
"""
pass
@abstractmethod
def binary(self, resources, elf, bin):
"""Run the command line that will Extract a binary named *bin* from an
elf file named *elf*.
"""
pass
# Return the list of macros geenrated by the build system # Return the list of macros geenrated by the build system
def get_config_macros(self): def get_config_macros(self):
return Config.config_to_macros(self.config_data) if self.config_data else [] return Config.config_to_macros(self.config_data) if self.config_data else []