mirror of
https://chromium.googlesource.com/chromium/tools/depot_tools.git
synced 2026-01-11 02:31:29 +00:00
autoninja: support running from outside of workspace
gclient_paths.GetPrimarySolutionPath() finds primary solution path from current directory, so it would fail if it is invoked from outside of workspace. Pass directory to gclient_paths.GetPrimarySolutionPath so it could find workspace correctly if it is invoked ninja outside of workspace. Bug: 441240584 Change-Id: I873f7883873e143ec8a64ee0e636042ac2336a2a Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/6898614 Auto-Submit: Fumitoshi Ukai <ukai@google.com> Reviewed-by: Scott Lee <ddoman@chromium.org> Commit-Queue: Scott Lee <ddoman@chromium.org> Reviewed-by: Takuto Ikuta <tikuta@chromium.org>
This commit is contained in:
20
autoninja.py
20
autoninja.py
@@ -85,9 +85,9 @@ def _is_google_corp_machine():
|
||||
return shutil.which("gcert") is not None
|
||||
|
||||
|
||||
def _has_internal_checkout():
|
||||
def _has_internal_checkout(output_dir):
|
||||
"""Check if internal is checked out."""
|
||||
root_dir = gclient_paths.GetPrimarySolutionPath()
|
||||
root_dir = gclient_paths.GetPrimarySolutionPath(output_dir)
|
||||
if not root_dir:
|
||||
return False
|
||||
return os.path.exists(os.path.join(root_dir, "internal", ".git"))
|
||||
@@ -111,12 +111,12 @@ def _reclient_rbe_project():
|
||||
return ""
|
||||
|
||||
|
||||
def _siso_rbe_project():
|
||||
def _siso_rbe_project(output_dir):
|
||||
"""Returns RBE project used by siso."""
|
||||
siso_project = os.environ.get('SISO_PROJECT')
|
||||
if siso_project:
|
||||
return siso_project
|
||||
root_dir = gclient_paths.GetPrimarySolutionPath()
|
||||
root_dir = gclient_paths.GetPrimarySolutionPath(output_dir)
|
||||
if not root_dir:
|
||||
return ""
|
||||
sisoenv_path = os.path.join(root_dir, 'build/config/siso/.sisoenv')
|
||||
@@ -151,8 +151,8 @@ def _print_cmd(cmd):
|
||||
print(*[shell_quoter(arg) for arg in cmd], file=sys.stderr)
|
||||
|
||||
|
||||
def _get_remoteexec_defaults():
|
||||
root_dir = gclient_paths.GetPrimarySolutionPath()
|
||||
def _get_remoteexec_defaults(output_dir):
|
||||
root_dir = gclient_paths.GetPrimarySolutionPath(output_dir)
|
||||
if not root_dir:
|
||||
return None
|
||||
default_file = os.path.join(root_dir,
|
||||
@@ -179,7 +179,7 @@ def _get_remoteexec_defaults():
|
||||
# this logic should match with //build/toolchain/siso.gni
|
||||
def _get_use_siso_default(output_dir):
|
||||
"""Returns use_siso default value."""
|
||||
root_dir = gclient_paths.GetPrimarySolutionPath()
|
||||
root_dir = gclient_paths.GetPrimarySolutionPath(output_dir)
|
||||
if not root_dir:
|
||||
return False
|
||||
|
||||
@@ -364,7 +364,7 @@ def _main_inner(input_args, build_id):
|
||||
use_siso = False
|
||||
|
||||
if use_reclient is None and use_remoteexec:
|
||||
if values := _get_remoteexec_defaults():
|
||||
if values := _get_remoteexec_defaults(output_dir):
|
||||
if use_siso:
|
||||
use_reclient = values["use_reclient_on_siso"]
|
||||
else:
|
||||
@@ -381,9 +381,9 @@ def _main_inner(input_args, build_id):
|
||||
elif use_siso and project is None:
|
||||
# siso runs locally if empty project is given
|
||||
# even if use_remoteexec=true is set.
|
||||
project = _siso_rbe_project()
|
||||
project = _siso_rbe_project(output_dir)
|
||||
|
||||
if _has_internal_checkout():
|
||||
if _has_internal_checkout(output_dir):
|
||||
# user may login on non-@google.com account on corp,
|
||||
# but need to use @google.com and rbe-chrome-untrusted
|
||||
# with src-internal.
|
||||
|
||||
@@ -95,9 +95,12 @@ def _GetPrimarySolutionPathInternal(cwd):
|
||||
return None
|
||||
|
||||
|
||||
def GetPrimarySolutionPath():
|
||||
def GetPrimarySolutionPath(from_dir=None):
|
||||
"""Returns the full path to the primary solution. (gclient_root + src)"""
|
||||
return _GetPrimarySolutionPathInternal(os.getcwd())
|
||||
if not from_dir:
|
||||
from_dir = os.getcwd()
|
||||
from_dir = os.path.abspath(from_dir)
|
||||
return _GetPrimarySolutionPathInternal(from_dir)
|
||||
|
||||
|
||||
@functools.lru_cache
|
||||
|
||||
14
ninja.py
14
ninja.py
@@ -32,7 +32,7 @@ def find_ninja_in_path():
|
||||
return ninja_path
|
||||
|
||||
|
||||
def check_out_dir(ninja_args):
|
||||
def parse_args(ninja_args):
|
||||
out_dir = "."
|
||||
tool = ""
|
||||
for i, arg in enumerate(ninja_args):
|
||||
@@ -44,6 +44,10 @@ def check_out_dir(ninja_args):
|
||||
out_dir = ninja_args[i + 1]
|
||||
elif arg.startswith("-C"):
|
||||
out_dir = arg[2:]
|
||||
return tool, out_dir
|
||||
|
||||
|
||||
def check_out_dir(tool, out_dir):
|
||||
if tool in ["list", "commands", "inputs", "targets"]:
|
||||
# These tools are just inspect ninja rules and not modify out dir.
|
||||
# TODO: b/339320220 - implement these in siso
|
||||
@@ -105,9 +109,11 @@ def main(args):
|
||||
os.environ.pop("LIBRARY_PATH", None)
|
||||
os.environ.pop("SDKROOT", None)
|
||||
|
||||
tool, out_dir = parse_args(args[1:])
|
||||
|
||||
# Get gclient root + src.
|
||||
primary_solution_path = gclient_paths.GetPrimarySolutionPath()
|
||||
gclient_root_path = gclient_paths.FindGclientRoot(os.getcwd())
|
||||
primary_solution_path = gclient_paths.GetPrimarySolutionPath(out_dir)
|
||||
gclient_root_path = gclient_paths.FindGclientRoot(out_dir)
|
||||
gclient_src_root_path = None
|
||||
if gclient_root_path:
|
||||
gclient_src_root_path = os.path.join(gclient_root_path, "src")
|
||||
@@ -123,7 +129,7 @@ def main(args):
|
||||
"ninja" + gclient_paths.GetExeSuffix(),
|
||||
)
|
||||
if os.path.isfile(ninja_path):
|
||||
check_out_dir(args[1:])
|
||||
check_out_dir(tool, out_dir)
|
||||
return caffeinate.run([ninja_path] + args[1:])
|
||||
|
||||
return fallback(args[1:])
|
||||
|
||||
16
siso.py
16
siso.py
@@ -16,7 +16,7 @@ import caffeinate
|
||||
import gclient_paths
|
||||
|
||||
|
||||
def checkOutdir(args):
|
||||
def parse_args(args):
|
||||
subcmd = ''
|
||||
out_dir = "."
|
||||
for i, arg in enumerate(args):
|
||||
@@ -27,8 +27,10 @@ def checkOutdir(args):
|
||||
out_dir = args[i + 1]
|
||||
elif arg.startswith("-C"):
|
||||
out_dir = arg[2:]
|
||||
if subcmd != "ninja":
|
||||
return
|
||||
return subcmd, out_dir
|
||||
|
||||
|
||||
def check_outdir(subcmd, out_dir):
|
||||
ninja_marker = os.path.join(out_dir, ".ninja_deps")
|
||||
if os.path.exists(ninja_marker):
|
||||
print("depot_tools/siso.py: %s contains Ninja state file.\n"
|
||||
@@ -89,9 +91,11 @@ def main(args):
|
||||
|
||||
environ = os.environ.copy()
|
||||
|
||||
subcmd, out_dir = parse_args(args[1:])
|
||||
|
||||
# Get gclient root + src.
|
||||
primary_solution_path = gclient_paths.GetPrimarySolutionPath()
|
||||
gclient_root_path = gclient_paths.FindGclientRoot(os.getcwd())
|
||||
primary_solution_path = gclient_paths.GetPrimarySolutionPath(out_dir)
|
||||
gclient_root_path = gclient_paths.FindGclientRoot(out_dir)
|
||||
gclient_src_root_path = None
|
||||
if gclient_root_path:
|
||||
gclient_src_root_path = os.path.join(gclient_root_path, 'src')
|
||||
@@ -150,7 +154,7 @@ def main(args):
|
||||
]
|
||||
for siso_path in siso_paths:
|
||||
if siso_path and os.path.isfile(siso_path):
|
||||
checkOutdir(args[1:])
|
||||
check_outdir(subcmd, out_dir)
|
||||
return caffeinate.run([siso_path] + args[1:], env=env)
|
||||
print(
|
||||
'depot_tools/siso.py: Could not find siso in third_party/siso '
|
||||
|
||||
@@ -75,18 +75,17 @@ class AutoninjaTest(trial_dir.TestCase):
|
||||
|
||||
def test_autoninja_reclient(self):
|
||||
"""
|
||||
Test that when specifying use_remoteexec=true, autoninja delegates to
|
||||
reclient_helper.
|
||||
Test that when specifying use_remoteexec=true use_reclient=true,
|
||||
autoninja delegates to reclient_helper.
|
||||
"""
|
||||
with mock.patch('reclient_helper.run_ninja',
|
||||
return_value=0) as run_ninja:
|
||||
out_dir = os.path.join('out', 'dir')
|
||||
write(os.path.join(out_dir, 'args.gn'), 'use_remoteexec=true')
|
||||
write(os.path.join('build', 'toolchain', 'use_reclient_value.py'),
|
||||
"""
|
||||
def use_reclient_value(output_dir):
|
||||
return True
|
||||
""")
|
||||
write(
|
||||
os.path.join(out_dir, 'args.gn'), """
|
||||
use_remoteexec=true
|
||||
use_reclient=true
|
||||
""")
|
||||
write(os.path.join('buildtools', 'reclient_cfgs', 'reproxy.cfg'),
|
||||
'RBE_v=2')
|
||||
write(os.path.join('buildtools', 'reclient', 'version.txt'), '0.0')
|
||||
@@ -136,14 +135,12 @@ def use_reclient_value(output_dir):
|
||||
with mock.patch('reclient_helper.build_context', reclient_helper_mock):
|
||||
with mock.patch('siso.main', return_value=0) as siso_main:
|
||||
out_dir = os.path.join('out', 'dir')
|
||||
write(os.path.join(out_dir, 'args.gn'),
|
||||
'use_siso=true\nuse_remoteexec=true')
|
||||
write(
|
||||
os.path.join('build', 'toolchain', 'use_reclient_value.py'),
|
||||
"""
|
||||
def use_reclient_value(output_dir):
|
||||
return True
|
||||
""")
|
||||
os.path.join(out_dir, 'args.gn'), """
|
||||
use_remoteexec=true
|
||||
use_siso=true
|
||||
use_reclient=true
|
||||
""")
|
||||
write(
|
||||
os.path.join('buildtools', 'reclient_cfgs', 'reproxy.cfg'),
|
||||
'instance=projects/rbe-chromium-untrusted-test/'
|
||||
|
||||
Reference in New Issue
Block a user