summaryrefslogtreecommitdiff
path: root/tools/patman
diff options
context:
space:
mode:
authorAlper Nebi Yasak <alpernebiyasak@gmail.com>2020-09-06 14:46:06 +0300
committerSimon Glass <sjg@chromium.org>2020-09-22 12:54:13 -0600
commit29cc0918427e10d9198d5a7ca252c4887b36f2f8 (patch)
tree32e48580e8487eb8bf965610cb4ced6fe1093de1 /tools/patman
parent1e4687aa47ed269bbc82497df872f614cfafb2e9 (diff)
downloadu-boot-29cc0918427e10d9198d5a7ca252c4887b36f2f8.tar.gz
binman: Allow resolving host-specific tools from env vars
This patch lets tools.Run() use host-specific versions with the for_host keyword argument, based on the host-specific environment variables (HOSTCC, HOSTOBJCOPY, HOSTSTRIP, etc.). Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools/patman')
-rw-r--r--tools/patman/tools.py50
1 files changed, 49 insertions, 1 deletions
diff --git a/tools/patman/tools.py b/tools/patman/tools.py
index 66f6ab7af0..bbb157da87 100644
--- a/tools/patman/tools.py
+++ b/tools/patman/tools.py
@@ -188,6 +188,49 @@ def PathHasFile(path_spec, fname):
return True
return False
+def GetHostCompileTool(name):
+ """Get the host-specific version for a compile tool
+
+ This checks the environment variables that specify which version of
+ the tool should be used (e.g. ${HOSTCC}).
+
+ The following table lists the host-specific versions of the tools
+ this function resolves to:
+
+ Compile Tool | Host version
+ --------------+----------------
+ as | ${HOSTAS}
+ ld | ${HOSTLD}
+ cc | ${HOSTCC}
+ cpp | ${HOSTCPP}
+ c++ | ${HOSTCXX}
+ ar | ${HOSTAR}
+ nm | ${HOSTNM}
+ ldr | ${HOSTLDR}
+ strip | ${HOSTSTRIP}
+ objcopy | ${HOSTOBJCOPY}
+ objdump | ${HOSTOBJDUMP}
+ dtc | ${HOSTDTC}
+
+ Args:
+ name: Command name to run
+
+ Returns:
+ host_name: Exact command name to run instead
+ extra_args: List of extra arguments to pass
+ """
+ host_name = None
+ extra_args = []
+ if name in ('as', 'ld', 'cc', 'cpp', 'ar', 'nm', 'ldr', 'strip',
+ 'objcopy', 'objdump', 'dtc'):
+ host_name, *host_args = env.get('HOST' + name.upper(), '').split(' ')
+ elif name == 'c++':
+ host_name, *host_args = env.get('HOSTCXX', '').split(' ')
+
+ if host_name:
+ return host_name, extra_args
+ return name, []
+
def GetTargetCompileTool(name, cross_compile=None):
"""Get the target-specific version for a compile tool
@@ -269,6 +312,7 @@ def Run(name, *args, **kwargs):
Args:
name: Command name to run
args: Arguments to the tool
+ for_host: True to resolve the command to the version for the host
for_target: False to run the command as-is, without resolving it
to the version for the compile target
@@ -277,7 +321,8 @@ def Run(name, *args, **kwargs):
"""
try:
binary = kwargs.get('binary')
- for_target = kwargs.get('for_target', True)
+ for_host = kwargs.get('for_host', False)
+ for_target = kwargs.get('for_target', not for_host)
env = None
if tool_search_paths:
env = dict(os.environ)
@@ -285,6 +330,9 @@ def Run(name, *args, **kwargs):
if for_target:
name, extra_args = GetTargetCompileTool(name)
args = tuple(extra_args) + args
+ elif for_host:
+ name, extra_args = GetHostCompileTool(name)
+ args = tuple(extra_args) + args
all_args = (name,) + args
result = command.RunPipe([all_args], capture=True, capture_stderr=True,
env=env, raise_on_error=False, binary=binary)