Bug 2023319 - Error on Windows when topsrcdir or topobjdir paths are too long r=firefox-build-system-reviewers,nalexander

We can't share code with `bin\bootstrap.py`, so there's a minor amount of
duplication, but it's better to notify the user before they clone than
during the first `./mach configure` run.

Differential Revision: https://phabricator.services.mozilla.com/D289380
This commit is contained in:
Alex Hochheiden
2026-03-24 09:42:30 +00:00
committed by ahochheiden@mozilla.com
parent e1e90cc6ab
commit f44c15b7d5
2 changed files with 59 additions and 0 deletions
+39
View File
@@ -100,6 +100,45 @@ def main(argv):
)
return 1
if sys.platform == "win32":
# Long paths cause two kinds of build failures on Windows:
# 1. Tools like midl.exe do not support paths exceeding MAX_PATH
# (260 characters), even with the LongPathsEnabled registry setting.
# 2. Long source paths repeated across many -I flags can exceed
# the CreateProcessW command line limit of 32,767 characters.
WIN32_MAX_PATH = 260
LONGEST_KNOWN_OBJDIR_RELATIVE_PATH = 170
DEFAULT_OBJDIR_NAME_LEN = 28 # /obj-x86_64-pc-windows-msvc/
max_objdir_len = WIN32_MAX_PATH - LONGEST_KNOWN_OBJDIR_RELATIVE_PATH
# Account for the default objdir name in the srcdir limit so that
# a user doesn't fix a srcdir error only to immediately hit the
# objdir error with the default configuration.
max_srcdir_len = max_objdir_len - DEFAULT_OBJDIR_NAME_LEN
if len(topsrcdir) > max_srcdir_len:
print(
f"Source directory path ({topsrcdir}) is "
f"{len(topsrcdir)} characters, which exceeds the "
f"Windows limit of {max_srcdir_len}.\n"
f"Move your source directory to a shorter path "
f"(e.g. D:\\mozilla-source\\firefox).",
file=sys.stderr,
)
return 1
if len(topobjdir) > max_objdir_len:
print(
f"Object directory path ({topobjdir}) is "
f"{len(topobjdir)} characters, which exceeds the "
f"Windows limit of {max_objdir_len}.\n"
+ (
"Move your source directory to a shorter path or set "
"MOZ_OBJDIR to a shorter absolute path in your mozconfig."
if topobjdir.startswith(topsrcdir)
else "Set MOZ_OBJDIR to a shorter absolute path in your mozconfig."
),
file=sys.stderr,
)
return 1
# Do not allow topobjdir == topsrcdir
if os.path.samefile(topsrcdir, topobjdir):
print(
+20
View File
@@ -71,6 +71,26 @@ def which(name):
def validate_clone_dest(dest: Path):
dest = dest.resolve()
if WINDOWS:
# Keep in sync with the path length checks in configure.py.
WIN32_MAX_PATH = 260
LONGEST_KNOWN_OBJDIR_RELATIVE_PATH = 170
DEFAULT_OBJDIR_NAME_LEN = 28 # /obj-x86_64-pc-windows-msvc/
max_srcdir_len = (
WIN32_MAX_PATH
- LONGEST_KNOWN_OBJDIR_RELATIVE_PATH
- DEFAULT_OBJDIR_NAME_LEN
)
dest_len = len(str(dest))
if dest_len > max_srcdir_len:
print(
f"ERROR! Destination path ({dest}) is {dest_len} characters, "
f"which exceeds the Windows limit of {max_srcdir_len}. "
f"This will cause build failures due to path length restrictions.\n"
f"Please choose a shorter path (e.g. D:\\mozilla-source\\firefox)."
)
return None
if not dest.exists():
return dest