Toolchain check generic in mbedToolchain

pull/2675/head
Sarah Marsh 2016-09-13 13:38:58 -05:00
parent 8b74c5b3c7
commit ab92a5ace2
5 changed files with 47 additions and 32 deletions

View File

@ -21,8 +21,7 @@ TEST BUILD & RUN
import sys import sys
from time import sleep from time import sleep
from shutil import copy from shutil import copy
from os.path import join, abspath, dirname, exists from os.path import join, abspath, dirname
from distutils.spawn import find_executable
# Be sure that the tools directory is in the search path # Be sure that the tools directory is in the search path
ROOT = abspath(join(dirname(__file__), "..")) ROOT = abspath(join(dirname(__file__), ".."))

View File

@ -27,6 +27,7 @@ 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 abc import ABCMeta, abstractmethod
from distutils.spawn import find_executable
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, compile_worker from tools.utils import run_cmd, mkdir, rel_path, ToolException, NotSupportedException, split_path, compile_worker
@ -1091,6 +1092,44 @@ class mbedToolchain:
self.config_processed = True self.config_processed = True
return self.config_file return self.config_file
@staticmethod
def generic_check_executable(tool_key, executable_name, levels_up,
nested_dir=None):
"""
Positional args:
tool_key: the key to index TOOLCHAIN_PATHS
executable_name: the toolchain's named executable (ex. armcc)
levels_up: each toolchain joins the toolchain_path, some
variable directories (bin, include), and the executable name,
so the TOOLCHAIN_PATH value must be appropriately distanced
Keyword args:
nested_dir: the directory within TOOLCHAIN_PATHS where the executable
is found (ex: 'bin' for ARM\bin\armcc (necessary to check for path
that will be used by toolchain's compile)
Returns True if the executable location specified by the user
exists and is valid OR the executable can be found on the PATH.
Returns False otherwise.
"""
# Search PATH if user did not specify a path or specified path doesn't
# exist.
if not TOOLCHAIN_PATHS[tool_key] or not exists(TOOLCHAIN_PATHS[tool_key]):
exe = find_executable(executable_name)
if not exe:
return False
for level in range(levels_up):
# move up the specified number of directories
exe = dirname(exe)
TOOLCHAIN_PATHS[tool_key] = exe
if nested_dir:
subdir = join(TOOLCHAIN_PATHS[tool_key], nested_dir,
executable_name)
else:
subdir = join(TOOLCHAIN_PATHS[tool_key],executable_name)
# User could have specified a path that exists but does not contain exe
return exists(subdir) or exists(subdir +'.exe')
@abstractmethod @abstractmethod
def get_config_option(self, config_header): def get_config_option(self, config_header):
"""Generate the compiler option that forces the inclusion of the configuration """Generate the compiler option that forces the inclusion of the configuration

View File

@ -15,8 +15,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
""" """
import re import re
from os.path import join, dirname, splitext, basename, exists from os.path import join, dirname, splitext, basename
from distutils.spawn import find_executable
from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS
from tools.hooks import hook_tool from tools.hooks import hook_tool
@ -47,12 +46,7 @@ class ARM(mbedToolchain):
"""Returns True if the executable (armcc) location specified by the """Returns True if the executable (armcc) location specified by the
user exists OR the executable can be found on the PATH. user exists OR the executable can be found on the PATH.
Returns False otherwise.""" Returns False otherwise."""
if not TOOLCHAIN_PATHS["ARM"] or not exists(TOOLCHAIN_PATHS['ARM']): return mbedToolchain.generic_check_executable("ARM", 'armcc', 2, 'bin')
exe = find_executable('armcc')
if not exe:
return False
TOOLCHAIN_PATHS['ARM'] = dirname(dirname(exe))
return True
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):
mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose) mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose)

View File

@ -15,8 +15,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
""" """
import re import re
from os.path import join, basename, splitext, dirname, exists from os.path import join, basename, splitext
from distutils.spawn import find_executable
from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS
from tools.hooks import hook_tool from tools.hooks import hook_tool
@ -275,12 +274,7 @@ class GCC_ARM(GCC):
"""Returns True if the executable (arm-none-eabi-gcc) location """Returns True if the executable (arm-none-eabi-gcc) location
specified by the user exists OR the executable can be found on the PATH. specified by the user exists OR the executable can be found on the PATH.
Returns False otherwise.""" Returns False otherwise."""
if not TOOLCHAIN_PATHS["GCC_ARM"] or not exists(TOOLCHAIN_PATHS['GCC_ARM']): return mbedToolchain.generic_check_executable("GCC_ARM", 'arm-none-eabi-gcc', 1)
exe = find_executable('arm-none-eabi-gcc')
if not exe:
return False
TOOLCHAIN_PATHS['GCC_ARM'] = dirname(exe)
return True
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):
GCC.__init__(self, target, options, notify, macros, silent, TOOLCHAIN_PATHS['GCC_ARM'], extra_verbose=extra_verbose) GCC.__init__(self, target, options, notify, macros, silent, TOOLCHAIN_PATHS['GCC_ARM'], extra_verbose=extra_verbose)
@ -312,12 +306,7 @@ class GCC_CR(GCC):
"""Returns True if the executable (arm-none-eabi-gcc) location """Returns True if the executable (arm-none-eabi-gcc) location
specified by the user exists OR the executable can be found on the PATH. specified by the user exists OR the executable can be found on the PATH.
Returns False otherwise.""" Returns False otherwise."""
if not TOOLCHAIN_PATHS["GCC_CR"] or not exists(TOOLCHAIN_PATHS['GCC_CR']): return mbedToolchain.generic_check_executable("GCC_CR", 'arm-none-eabi-gcc', 1)
exe = find_executable('arm-none-eabi-gcc')
if not exe:
return False
TOOLCHAIN_PATHS['GCC_CR'] = dirname(exe)
return True
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):
GCC.__init__(self, target, options, notify, macros, silent, TOOLCHAIN_PATHS['GCC_CR'], extra_verbose=extra_verbose) GCC.__init__(self, target, options, notify, macros, silent, TOOLCHAIN_PATHS['GCC_CR'], extra_verbose=extra_verbose)

View File

@ -16,8 +16,7 @@ limitations under the License.
""" """
import re import re
from os import remove from os import remove
from os.path import join, exists, dirname, splitext, exists from os.path import join, splitext
from distutils.spawn import find_executable
from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS
from tools.hooks import hook_tool from tools.hooks import hook_tool
@ -50,12 +49,7 @@ class IAR(mbedToolchain):
"""Returns True if the executable (arm-none-eabi-gcc) location """Returns True if the executable (arm-none-eabi-gcc) location
specified by the user exists OR the executable can be found on the PATH. specified by the user exists OR the executable can be found on the PATH.
Returns False otherwise.""" Returns False otherwise."""
if not TOOLCHAIN_PATHS["IAR"] or not exists(TOOLCHAIN_PATHS['IAR']): return mbedToolchain.generic_check_executable("IAR", 'iccarm', 2, "bin")
exe = find_executable('iccarm')
if not exe:
return False
TOOLCHAIN_PATHS['IAR'] = dirname(dirname(exe))
return True
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):
mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose) mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose)