blob: cb9acbfae45114f56f8d1e8954d02c416652dcc1 [file] [log] [blame]
#!/usr/bin/python2.6
#
# Copyright 2010 Google Inc. All Rights Reserved.
"""Utilities for toolchain build."""
__author__ = "asharif@google.com (Ahmad Sharif)"
from contextlib import contextmanager
import os
import re
import command_executer
import logger
def GetChromeOSVersionFromLSBVersion(lsb_version):
ce = command_executer.GetCommandExecuter()
command = "git ls-remote http://git.chromium.org/chromiumos/manifest.git"
ret, out, _ = ce.RunCommand(command, return_output=True,
print_to_console=False)
assert ret == 0, "Command %s failed" % command
lower = []
for line in out.splitlines():
mo = re.search("refs/heads/release-R(\d+)-(\d+)\.B", line)
if mo:
revision = int(mo.group(1))
build = int(mo.group(2))
lsb_build = int(lsb_version.split(".")[0])
if lsb_build > build:
lower.append(revision)
lower = sorted(lower)
if lower:
return "R%d-%s" % (lower[-1] + 1, lsb_version)
else:
return "Unknown"
def ApplySubs(string, *substitutions):
for pattern, replacement in substitutions:
string = re.sub(pattern, replacement, string)
return string
def UnitToNumber(string, base=1000):
unit_dict = {"kilo": base,
"mega": base**2,
"giga": base**3}
string = string.lower()
mo = re.search("(\d*)(.+)?", string)
number = mo.group(1)
unit = mo.group(2)
if not unit:
return float(number)
for k, v in unit_dict.items():
if k.startswith(unit):
return float(number) * v
raise Exception("Unit: %s not found in byte: %s!" %
(unit,
string))
def GetFilenameFromString(string):
return ApplySubs(string,
("/", "__"),
("\s", "_"),
("[\^\$=\"\\\?]", ""),
)
def GetRoot(scr_name):
"""Break up pathname into (dir+name)."""
abs_path = os.path.abspath(scr_name)
return (os.path.dirname(abs_path), os.path.basename(abs_path))
def GetChrootPath(chromeos_root):
return os.path.join(chromeos_root,
"chroot")
def GetInsideChrootPath(chromeos_root, file_path):
if not file_path.startswith(GetChrootPath(chromeos_root)):
raise Exception("File: %s doesn't seem to be in the chroot: %s" %
(file_path,
chromeos_root))
return file_path[len(GetChrootPath(chromeos_root)):]
def GetOutsideChrootPath(chromeos_root, file_path):
return os.path.join(GetChrootPath(chromeos_root),
file_path.lstrip("/"))
def FormatQuotedCommand(command):
return ApplySubs(command,
("\"", "\\\""))
def FormatCommands(commands):
return ApplySubs(str(commands),
("&&", "&&\n"),
(";", ";\n"),
("\n+\s*", "\n"))
def GetImageDir(chromeos_root, board):
return os.path.join(chromeos_root,
"src",
"build",
"images",
board)
def LabelLatestImage(chromeos_root, board, label):
image_dir = GetImageDir(chromeos_root, board)
latest_image_dir = os.path.join(image_dir, "latest")
latest_image_dir = os.path.realpath(latest_image_dir)
latest_image_dir = os.path.basename(latest_image_dir)
with WorkingDirectory(image_dir):
command = "ln -sf -T %s %s" % (latest_image_dir, label)
ce = command_executer.GetCommandExecuter()
return ce.RunCommand(command)
def DoesLabelExist(chromeos_root, board, label):
image_label = os.path.join(GetImageDir(chromeos_root, board),
label)
return os.path.exists(image_label)
def GetBuildPackagesCommand(board, usepkg=False):
if usepkg:
usepkg_flag = "--usepkg"
else:
usepkg_flag = "--nousepkg"
return ("./build_packages %s --withdev --withtest --withautotest "
"--skip_toolchain_update --nowithdebug --board=%s" %
(usepkg_flag, board))
def GetBuildImageCommand(board):
return "./build_image --board=%s test" % board
def GetSetupBoardCommand(board, gcc_version=None, binutils_version=None,
usepkg=None, force=None):
options = []
if gcc_version:
options.append("--gcc_version=%s" % gcc_version)
if binutils_version:
options.append("--binutils_version=%s" % binutils_version)
if usepkg:
options.append("--usepkg")
else:
options.append("--nousepkg")
if force:
options.append("--force")
return "./setup_board --board=%s %s" % (board, " ".join(options))
def CanonicalizePath(path):
path = os.path.expanduser(path)
path = os.path.realpath(path)
return path
def GetCtargetFromBoard(board, chromeos_root):
base_board = board.split("_")[0]
command = ("source "
"../platform/dev/toolchain_utils.sh; get_ctarget_from_board %s" %
base_board)
ce = command_executer.GetCommandExecuter()
ret, out, _ = ce.ChrootRunCommand(chromeos_root,
command,
return_output=True)
if ret != 0:
raise ValueError("Board %s is invalid!" % board)
# Remove ANSI escape sequences.
out = StripANSIEscapeSequences(out)
return out.strip()
def StripANSIEscapeSequences(string):
string = re.sub("\x1b\[[0-9]*[a-zA-Z]", "", string)
return string
def GetChromeSrcDir():
return "var/cache/distfiles/target/chrome-src/src"
def GetEnvStringFromDict(env_dict):
return " ".join(["%s=\"%s\"" % var for var in env_dict.items()])
def MergeEnvStringWithDict(env_string, env_dict, prepend=True):
if not env_string.strip():
return GetEnvStringFromDict(env_dict)
override_env_list = []
ce = command_executer.GetCommandExecuter()
for k, v in env_dict.items():
v = v.strip("\"'")
if prepend:
new_env = "%s=\"%s $%s\"" % (k, v, k)
else:
new_env = "%s=\"$%s %s\"" % (k, k, v)
command = "; ".join([env_string, new_env, "echo $%s" % k])
ret, out, _ = ce.RunCommand(command, return_output=True)
override_env_list.append("%s=%r" % (k, out.strip()))
ret = env_string + " " + " ".join(override_env_list)
return ret.strip()
def GetAllImages(chromeos_root, board):
ce = command_executer.GetCommandExecuter()
command = ("find %s/src/build/images/%s -name chromiumos_test_image.bin" %
(chromeos_root, board))
ret, out, _ = ce.RunCommand(command, return_output=True)
assert ret == 0, "Could not run command: %s" % command
return out.splitlines()
@contextmanager
def WorkingDirectory(new_dir):
old_dir = os.getcwd()
if old_dir != new_dir:
msg = "cd %s" % new_dir
logger.GetLogger().LogCmd(msg)
os.chdir(new_dir)
yield new_dir
if old_dir != new_dir:
msg = "cd %s" % old_dir
logger.GetLogger().LogCmd(msg)
os.chdir(old_dir)