Brian Daniels / mbed-tools

Fork of mbed-tools by Morpheus

Committer:
screamer
Date:
Wed Mar 30 16:23:44 2016 +0000
Revision:
0:4a2e5f0422d6
Initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:4a2e5f0422d6 1 """
screamer 0:4a2e5f0422d6 2 mbed SDK
screamer 0:4a2e5f0422d6 3 Copyright (c) 2011-2013 ARM Limited
screamer 0:4a2e5f0422d6 4
screamer 0:4a2e5f0422d6 5 Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:4a2e5f0422d6 6 you may not use this file except in compliance with the License.
screamer 0:4a2e5f0422d6 7 You may obtain a copy of the License at
screamer 0:4a2e5f0422d6 8
screamer 0:4a2e5f0422d6 9 http://www.apache.org/licenses/LICENSE-2.0
screamer 0:4a2e5f0422d6 10
screamer 0:4a2e5f0422d6 11 Unless required by applicable law or agreed to in writing, software
screamer 0:4a2e5f0422d6 12 distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:4a2e5f0422d6 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:4a2e5f0422d6 14 See the License for the specific language governing permissions and
screamer 0:4a2e5f0422d6 15 limitations under the License.
screamer 0:4a2e5f0422d6 16 """
screamer 0:4a2e5f0422d6 17 import sys
screamer 0:4a2e5f0422d6 18 import inspect
screamer 0:4a2e5f0422d6 19 import os
screamer 0:4a2e5f0422d6 20 from os import listdir, remove, makedirs
screamer 0:4a2e5f0422d6 21 from shutil import copyfile
screamer 0:4a2e5f0422d6 22 from os.path import isdir, join, exists, split, relpath, splitext
screamer 0:4a2e5f0422d6 23 from subprocess import Popen, PIPE, STDOUT, call
screamer 0:4a2e5f0422d6 24
screamer 0:4a2e5f0422d6 25
screamer 0:4a2e5f0422d6 26 def cmd(l, check=True, verbose=False, shell=False, cwd=None):
screamer 0:4a2e5f0422d6 27 text = l if shell else ' '.join(l)
screamer 0:4a2e5f0422d6 28 if verbose:
screamer 0:4a2e5f0422d6 29 print text
screamer 0:4a2e5f0422d6 30 rc = call(l, shell=shell, cwd=cwd)
screamer 0:4a2e5f0422d6 31 if check and rc != 0:
screamer 0:4a2e5f0422d6 32 raise Exception('ERROR %d: "%s"' % (rc, text))
screamer 0:4a2e5f0422d6 33
screamer 0:4a2e5f0422d6 34
screamer 0:4a2e5f0422d6 35 def run_cmd(command, wd=None, redirect=False):
screamer 0:4a2e5f0422d6 36 assert is_cmd_valid(command[0])
screamer 0:4a2e5f0422d6 37 p = Popen(command, stdout=PIPE, stderr=STDOUT if redirect else PIPE, cwd=wd)
screamer 0:4a2e5f0422d6 38 _stdout, _stderr = p.communicate()
screamer 0:4a2e5f0422d6 39 return _stdout, _stderr, p.returncode
screamer 0:4a2e5f0422d6 40
screamer 0:4a2e5f0422d6 41
screamer 0:4a2e5f0422d6 42 def run_cmd_ext(command):
screamer 0:4a2e5f0422d6 43 assert is_cmd_valid(command[0])
screamer 0:4a2e5f0422d6 44 p = Popen(command, stdout=PIPE, stderr=PIPE)
screamer 0:4a2e5f0422d6 45 _stdout, _stderr = p.communicate()
screamer 0:4a2e5f0422d6 46 return _stdout, _stderr, p.returncode
screamer 0:4a2e5f0422d6 47
screamer 0:4a2e5f0422d6 48
screamer 0:4a2e5f0422d6 49 def is_cmd_valid(cmd):
screamer 0:4a2e5f0422d6 50 caller = get_caller_name()
screamer 0:4a2e5f0422d6 51 abspath = find_cmd_abspath(cmd)
screamer 0:4a2e5f0422d6 52 if not abspath:
screamer 0:4a2e5f0422d6 53 error("%s: Command '%s' can't be found" % (caller, cmd))
screamer 0:4a2e5f0422d6 54 if not is_exec(abspath):
screamer 0:4a2e5f0422d6 55 error("%s: Command '%s' resolves to file '%s' which is not executable" % (caller, cmd, abspath))
screamer 0:4a2e5f0422d6 56 return True
screamer 0:4a2e5f0422d6 57
screamer 0:4a2e5f0422d6 58
screamer 0:4a2e5f0422d6 59 def is_exec(path):
screamer 0:4a2e5f0422d6 60 return os.access(path, os.X_OK) or os.access(path+'.exe', os.X_OK)
screamer 0:4a2e5f0422d6 61
screamer 0:4a2e5f0422d6 62
screamer 0:4a2e5f0422d6 63 def find_cmd_abspath(cmd):
screamer 0:4a2e5f0422d6 64 """ Returns the absolute path to a command.
screamer 0:4a2e5f0422d6 65 None is returned if no absolute path was found.
screamer 0:4a2e5f0422d6 66 """
screamer 0:4a2e5f0422d6 67 if exists(cmd) or exists(cmd + '.exe'):
screamer 0:4a2e5f0422d6 68 return os.path.abspath(cmd)
screamer 0:4a2e5f0422d6 69 if not 'PATH' in os.environ:
screamer 0:4a2e5f0422d6 70 raise Exception("Can't find command path for current platform ('%s')" % sys.platform)
screamer 0:4a2e5f0422d6 71 PATH=os.environ['PATH']
screamer 0:4a2e5f0422d6 72 for path in PATH.split(os.pathsep):
screamer 0:4a2e5f0422d6 73 abspath = '%s/%s' % (path, cmd)
screamer 0:4a2e5f0422d6 74 if exists(abspath) or exists(abspath + '.exe'):
screamer 0:4a2e5f0422d6 75 return abspath
screamer 0:4a2e5f0422d6 76
screamer 0:4a2e5f0422d6 77
screamer 0:4a2e5f0422d6 78 def mkdir(path):
screamer 0:4a2e5f0422d6 79 if not exists(path):
screamer 0:4a2e5f0422d6 80 makedirs(path)
screamer 0:4a2e5f0422d6 81
screamer 0:4a2e5f0422d6 82
screamer 0:4a2e5f0422d6 83 def copy_file(src, dst):
screamer 0:4a2e5f0422d6 84 """ Implement the behaviour of "shutil.copy(src, dst)" without copying the
screamer 0:4a2e5f0422d6 85 permissions (this was causing errors with directories mounted with samba)
screamer 0:4a2e5f0422d6 86 """
screamer 0:4a2e5f0422d6 87 if isdir(dst):
screamer 0:4a2e5f0422d6 88 _, file = split(src)
screamer 0:4a2e5f0422d6 89 dst = join(dst, file)
screamer 0:4a2e5f0422d6 90 copyfile(src, dst)
screamer 0:4a2e5f0422d6 91
screamer 0:4a2e5f0422d6 92
screamer 0:4a2e5f0422d6 93 def delete_dir_files(dir):
screamer 0:4a2e5f0422d6 94 if not exists(dir):
screamer 0:4a2e5f0422d6 95 return
screamer 0:4a2e5f0422d6 96
screamer 0:4a2e5f0422d6 97 for f in listdir(dir):
screamer 0:4a2e5f0422d6 98 file = join(dir, f)
screamer 0:4a2e5f0422d6 99 if not isdir(file):
screamer 0:4a2e5f0422d6 100 remove(file)
screamer 0:4a2e5f0422d6 101
screamer 0:4a2e5f0422d6 102
screamer 0:4a2e5f0422d6 103 def get_caller_name(steps=2):
screamer 0:4a2e5f0422d6 104 """
screamer 0:4a2e5f0422d6 105 When called inside a function, it returns the name
screamer 0:4a2e5f0422d6 106 of the caller of that function.
screamer 0:4a2e5f0422d6 107 """
screamer 0:4a2e5f0422d6 108 return inspect.stack()[steps][3]
screamer 0:4a2e5f0422d6 109
screamer 0:4a2e5f0422d6 110
screamer 0:4a2e5f0422d6 111 def error(msg):
screamer 0:4a2e5f0422d6 112 print("ERROR: %s" % msg)
screamer 0:4a2e5f0422d6 113 sys.exit(1)
screamer 0:4a2e5f0422d6 114
screamer 0:4a2e5f0422d6 115
screamer 0:4a2e5f0422d6 116 def rel_path(path, base, dot=False):
screamer 0:4a2e5f0422d6 117 p = relpath(path, base)
screamer 0:4a2e5f0422d6 118 if dot and not p.startswith('.'):
screamer 0:4a2e5f0422d6 119 p = './' + p
screamer 0:4a2e5f0422d6 120 return p
screamer 0:4a2e5f0422d6 121
screamer 0:4a2e5f0422d6 122
screamer 0:4a2e5f0422d6 123 class ToolException(Exception):
screamer 0:4a2e5f0422d6 124 pass
screamer 0:4a2e5f0422d6 125
screamer 0:4a2e5f0422d6 126 class NotSupportedException(Exception):
screamer 0:4a2e5f0422d6 127 pass
screamer 0:4a2e5f0422d6 128
screamer 0:4a2e5f0422d6 129 def split_path(path):
screamer 0:4a2e5f0422d6 130 base, file = split(path)
screamer 0:4a2e5f0422d6 131 name, ext = splitext(file)
screamer 0:4a2e5f0422d6 132 return base, name, ext
screamer 0:4a2e5f0422d6 133
screamer 0:4a2e5f0422d6 134
screamer 0:4a2e5f0422d6 135 def args_error(parser, message):
screamer 0:4a2e5f0422d6 136 print "\n\n%s\n\n" % message
screamer 0:4a2e5f0422d6 137 parser.print_help()
screamer 0:4a2e5f0422d6 138 sys.exit()
screamer 0:4a2e5f0422d6 139
screamer 0:4a2e5f0422d6 140
screamer 0:4a2e5f0422d6 141 def construct_enum(**enums):
screamer 0:4a2e5f0422d6 142 """ Create your own pseudo-enums """
screamer 0:4a2e5f0422d6 143 return type('Enum', (), enums)
screamer 0:4a2e5f0422d6 144
screamer 0:4a2e5f0422d6 145
screamer 0:4a2e5f0422d6 146 def check_required_modules(required_modules, verbose=True):
screamer 0:4a2e5f0422d6 147 """ Function checks for Python modules which should be "importable" (installed)
screamer 0:4a2e5f0422d6 148 before test suite can be used.
screamer 0:4a2e5f0422d6 149 @return returns True if all modules are installed already
screamer 0:4a2e5f0422d6 150 """
screamer 0:4a2e5f0422d6 151 import imp
screamer 0:4a2e5f0422d6 152 not_installed_modules = []
screamer 0:4a2e5f0422d6 153 for module_name in required_modules:
screamer 0:4a2e5f0422d6 154 try:
screamer 0:4a2e5f0422d6 155 imp.find_module(module_name)
screamer 0:4a2e5f0422d6 156 except ImportError as e:
screamer 0:4a2e5f0422d6 157 # We also test against a rare case: module is an egg file
screamer 0:4a2e5f0422d6 158 try:
screamer 0:4a2e5f0422d6 159 __import__(module_name)
screamer 0:4a2e5f0422d6 160 except ImportError as e:
screamer 0:4a2e5f0422d6 161 not_installed_modules.append(module_name)
screamer 0:4a2e5f0422d6 162 if verbose:
screamer 0:4a2e5f0422d6 163 print "Error: %s" % e
screamer 0:4a2e5f0422d6 164
screamer 0:4a2e5f0422d6 165 if verbose:
screamer 0:4a2e5f0422d6 166 if not_installed_modules:
screamer 0:4a2e5f0422d6 167 print "Warning: Module(s) %s not installed. Please install required module(s) before using this script."% (', '.join(not_installed_modules))
screamer 0:4a2e5f0422d6 168
screamer 0:4a2e5f0422d6 169 if not_installed_modules:
screamer 0:4a2e5f0422d6 170 return False
screamer 0:4a2e5f0422d6 171 else:
screamer 0:4a2e5f0422d6 172 return True