summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtools/moveconfig.py71
1 files changed, 48 insertions, 23 deletions
diff --git a/tools/moveconfig.py b/tools/moveconfig.py
index ce8245a9f5..7e916c2c9a 100755
--- a/tools/moveconfig.py
+++ b/tools/moveconfig.py
@@ -82,7 +82,12 @@ It looks like one of the followings:
This config option was not found in the config header.
Nothing to do.
- - Failed to process. Skip.
+ - Compiler is missing. Do nothing.
+ The compiler specified for this architecture was not found
+ in your PATH environment.
+ (If -e option is passed, the tool exits immediately.)
+
+ - Failed to process.
An error occurred during processing this defconfig. Skipped.
(If -e option is passed, the tool exits immediately on error.)
@@ -272,7 +277,7 @@ def log_msg(color_enabled, color, defconfig, msg):
return defconfig[:-len('_defconfig')].ljust(37) + ': ' + \
color_text(color_enabled, color, msg) + '\n'
-def update_cross_compile():
+def update_cross_compile(color_enabled):
"""Update per-arch CROSS_COMPILE via environment variables
The default CROSS_COMPILE values are available
@@ -286,6 +291,9 @@ def update_cross_compile():
export CROSS_COMPILE_ARM=...
export CROSS_COMPILE_POWERPC=...
+
+ Then, this function checks if specified compilers really exist in your
+ PATH environment.
"""
archs = []
@@ -299,8 +307,20 @@ def update_cross_compile():
for arch in archs:
env = 'CROSS_COMPILE_' + arch.upper()
cross_compile = os.environ.get(env)
- if cross_compile:
- CROSS_COMPILE[arch] = cross_compile
+ if not cross_compile:
+ cross_compile = CROSS_COMPILE.get(arch, '')
+
+ for path in os.environ["PATH"].split(os.pathsep):
+ gcc_path = os.path.join(path, cross_compile + 'gcc')
+ if os.path.isfile(gcc_path) and os.access(gcc_path, os.X_OK):
+ break
+ else:
+ print >> sys.stderr, color_text(color_enabled, COLOR_YELLOW,
+ 'warning: %sgcc: not found in PATH. %s architecture boards will be skipped'
+ % (cross_compile, arch))
+ cross_compile = None
+
+ CROSS_COMPILE[arch] = cross_compile
def cleanup_one_header(header_path, patterns, dry_run):
"""Clean regex-matched lines away from a file.
@@ -387,6 +407,10 @@ class KconfigParser:
Returns:
A string storing the compiler prefix for the architecture.
+ Return a NULL string for architectures that do not require
+ compiler prefix (Sandbox and native build is the case).
+ Return None if the specified compiler is missing in your PATH.
+ Caller should distinguish '' and None.
"""
arch = ''
cpu = ''
@@ -400,13 +424,14 @@ class KconfigParser:
if m:
cpu = m.group(1)
- assert arch, 'Error: arch is not defined in %s' % defconfig
+ if not arch:
+ return None
# fix-up for aarch64
if arch == 'arm' and cpu == 'armv8':
arch = 'aarch64'
- return CROSS_COMPILE.get(arch, '')
+ return CROSS_COMPILE.get(arch, None)
def parse_one_config(self, config_attr, defconfig_lines, autoconf_lines):
"""Parse .config, defconfig, include/autoconf.mk for one config.
@@ -606,21 +631,12 @@ class Slot:
return False
if self.ps.poll() != 0:
- errmsg = 'Failed to process.'
- errout = self.ps.stderr.read()
- if errout.find('gcc: command not found') != -1:
- errmsg = 'Compiler not found ('
- errmsg += color_text(self.options.color, COLOR_YELLOW,
- self.cross_compile)
- errmsg += color_text(self.options.color, COLOR_LIGHT_RED,
- ')')
- print >> sys.stderr, log_msg(self.options.color,
- COLOR_LIGHT_RED,
- self.defconfig,
- errmsg),
+ print >> sys.stderr, log_msg(self.options.color, COLOR_LIGHT_RED,
+ self.defconfig, "Failed to process."),
if self.options.verbose:
print >> sys.stderr, color_text(self.options.color,
- COLOR_LIGHT_CYAN, errout)
+ COLOR_LIGHT_CYAN,
+ self.ps.stderr.read())
if self.options.exit_on_error:
sys.exit("Exit on error.")
# If --exit-on-error flag is not set, skip this board and continue.
@@ -651,15 +667,24 @@ class Slot:
return True
self.cross_compile = self.parser.get_cross_compile()
+ if self.cross_compile is None:
+ print >> sys.stderr, log_msg(self.options.color, COLOR_YELLOW,
+ self.defconfig,
+ "Compiler is missing. Do nothing."),
+ if self.options.exit_on_error:
+ sys.exit("Exit on error.")
+ # If --exit-on-error flag is not set, skip this board and continue.
+ # Record the failed board.
+ self.failed_boards.append(self.defconfig)
+ self.state = STATE_IDLE
+ return True
+
cmd = list(self.make_cmd)
if self.cross_compile:
cmd.append('CROSS_COMPILE=%s' % self.cross_compile)
cmd.append('KCONFIG_IGNORE_DUPLICATES=1')
cmd.append('include/config/auto.conf')
- """This will be screen-scraped, so be sure the expected text will be
- returned consistently on every machine by setting LANG=C"""
self.ps = subprocess.Popen(cmd, stdout=self.devnull,
- env=dict(os.environ, LANG='C'),
stderr=subprocess.PIPE)
self.state = STATE_AUTOCONF
return False
@@ -907,7 +932,7 @@ def main():
check_top_directory()
- update_cross_compile()
+ update_cross_compile(options.color)
if not options.cleanup_headers_only:
move_config(config_attrs, options)