Reapply "Bug 1967834 - moved process_gn_config call to generate_gn_config. r=ng"

This reverts commit 360d3a3311.
This commit is contained in:
Sandor Molnar
2025-05-22 14:54:33 +03:00
committed by smolnar@mozilla.com
parent 6e6ee29021
commit c172cbb25d

View File

@@ -9,6 +9,7 @@ import subprocess
import sys import sys
import tempfile import tempfile
from collections import defaultdict, deque from collections import defaultdict, deque
from concurrent.futures import ProcessPoolExecutor, as_completed
from copy import deepcopy from copy import deepcopy
from pathlib import Path from pathlib import Path
from shutil import which from shutil import which
@@ -514,27 +515,114 @@ def find_common_attrs(config_attributes):
return common_attrs return common_attrs
def write_mozbuild( def write_mozbuild(topsrcdir, write_mozbuild_variables, relsrcdir, configs):
target_srcdir = mozpath.join(topsrcdir, relsrcdir)
mkdir(target_srcdir)
target_mozbuild = mozpath.join(target_srcdir, "moz.build")
with open(target_mozbuild, "w") as fh:
mb = MozbuildWriter(fh)
mb.write(license_header)
mb.write("\n")
mb.write(generated_header)
try:
if relsrcdir in write_mozbuild_variables["INCLUDE_TK_CFLAGS_DIRS"]:
mb.write('if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":\n')
mb.write(' CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"]\n')
except KeyError:
pass
try:
if relsrcdir in write_mozbuild_variables["INCLUDE_SYSTEM_GBM_HANDLING"]:
mb.write('CXXFLAGS += CONFIG["MOZ_GBM_CFLAGS"]\n')
mb.write('if not CONFIG["MOZ_SYSTEM_GBM"]:\n')
mb.write(' LOCAL_INCLUDES += [ "/third_party/gbm/gbm/" ]\n')
except KeyError:
pass
try:
if relsrcdir in write_mozbuild_variables["INCLUDE_SYSTEM_LIBDRM_HANDLING"]:
mb.write('CXXFLAGS += CONFIG["MOZ_LIBDRM_CFLAGS"]\n')
mb.write('if not CONFIG["MOZ_SYSTEM_LIBDRM"]:\n')
mb.write(' LOCAL_INCLUDES += [ "/third_party/drm/drm/",\n')
mb.write(' "/third_party/drm/drm/include/",\n')
mb.write(
' "/third_party/drm/drm/include/libdrm" ]\n'
)
except KeyError:
pass
try:
if (
relsrcdir
in write_mozbuild_variables["INCLUDE_SYSTEM_PIPEWIRE_HANDLING"]
):
mb.write('CXXFLAGS += CONFIG["MOZ_PIPEWIRE_CFLAGS"]\n')
mb.write('if not CONFIG["MOZ_SYSTEM_PIPEWIRE"]:\n')
mb.write(' LOCAL_INCLUDES += [ "/third_party/pipewire/" ]\n')
except KeyError:
pass
try:
if relsrcdir in write_mozbuild_variables["INCLUDE_SYSTEM_LIBVPX_HANDLING"]:
mb.write('if not CONFIG["MOZ_SYSTEM_LIBVPX"]:\n')
mb.write(' LOCAL_INCLUDES += [ "/media/libvpx/libvpx/" ]\n')
mb.write(' CXXFLAGS += CONFIG["MOZ_LIBVPX_CFLAGS"]\n')
except KeyError:
pass
try:
if relsrcdir in write_mozbuild_variables["INCLUDE_SYSTEM_DAV1D_HANDLING"]:
mb.write('if CONFIG["MOZ_SYSTEM_AV1"]:\n')
mb.write(' CXXFLAGS += CONFIG["MOZ_SYSTEM_DAV1D_CFLAGS"]\n')
mb.write(' CXXFLAGS += CONFIG["MOZ_SYSTEM_LIBAOM_CFLAGS"]\n')
except KeyError:
pass
all_args = [args for args, _ in configs]
# Start with attributes that will be a part of the mozconfig
# for every configuration, then factor by other potentially useful
# combinations.
# FIXME: this is a time-bomb. See bug 1775202.
for attrs in (
(),
("MOZ_DEBUG",),
("OS_TARGET",),
("TARGET_CPU",),
("MOZ_DEBUG", "OS_TARGET"),
("OS_TARGET", "MOZ_X11"),
("OS_TARGET", "TARGET_CPU"),
("OS_TARGET", "TARGET_CPU", "MOZ_X11"),
("OS_TARGET", "TARGET_CPU", "MOZ_DEBUG"),
("OS_TARGET", "TARGET_CPU", "MOZ_DEBUG", "MOZ_X11"),
):
conditions = set()
for args in all_args:
cond = tuple((k, args.get(k) or "") for k in attrs)
conditions.add(cond)
for cond in sorted(conditions):
common_attrs = find_common_attrs(
[
attrs
for args, attrs in configs
if all((args.get(k) or "") == v for k, v in cond)
]
)
if any(common_attrs.values()):
if cond:
mb.write_condition(dict(cond))
mb.write_attrs(common_attrs)
if cond:
mb.terminate_condition()
mb.finalize()
return target_mozbuild
def write_mozbuild_files(
topsrcdir, topsrcdir,
srcdir, srcdir,
non_unified_sources, all_mozbuild_results,
gn_configs,
mozilla_flags,
write_mozbuild_variables, write_mozbuild_variables,
): ):
all_mozbuild_results = []
for gn_config in gn_configs:
mozbuild_attrs = process_gn_config(
gn_config,
topsrcdir,
srcdir,
non_unified_sources,
gn_config["sandbox_vars"],
mozilla_flags,
)
all_mozbuild_results.append(mozbuild_attrs)
# Translate {config -> {dirs -> build info}} into # Translate {config -> {dirs -> build info}} into
# {dirs -> [(config, build_info)]} # {dirs -> [(config, build_info)]}
configs_by_dir = defaultdict(list) configs_by_dir = defaultdict(list)
@@ -545,117 +633,11 @@ def write_mozbuild(
configs_by_dir[d].append((mozbuild_args, build_data)) configs_by_dir[d].append((mozbuild_args, build_data))
mozbuilds = set() mozbuilds = set()
# threading this section did not produce noticeable speed gains
for relsrcdir, configs in sorted(configs_by_dir.items()): for relsrcdir, configs in sorted(configs_by_dir.items()):
target_srcdir = mozpath.join(topsrcdir, relsrcdir) mozbuilds.add(
mkdir(target_srcdir) write_mozbuild(topsrcdir, write_mozbuild_variables, relsrcdir, configs)
)
target_mozbuild = mozpath.join(target_srcdir, "moz.build")
mozbuilds.add(target_mozbuild)
with open(target_mozbuild, "w") as fh:
mb = MozbuildWriter(fh)
mb.write(license_header)
mb.write("\n")
mb.write(generated_header)
try:
if relsrcdir in write_mozbuild_variables["INCLUDE_TK_CFLAGS_DIRS"]:
mb.write('if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":\n')
mb.write(' CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"]\n')
except KeyError:
pass
try:
if relsrcdir in write_mozbuild_variables["INCLUDE_SYSTEM_GBM_HANDLING"]:
mb.write('CXXFLAGS += CONFIG["MOZ_GBM_CFLAGS"]\n')
mb.write('if not CONFIG["MOZ_SYSTEM_GBM"]:\n')
mb.write(' LOCAL_INCLUDES += [ "/third_party/gbm/gbm/" ]\n')
except KeyError:
pass
try:
if (
relsrcdir
in write_mozbuild_variables["INCLUDE_SYSTEM_LIBDRM_HANDLING"]
):
mb.write('CXXFLAGS += CONFIG["MOZ_LIBDRM_CFLAGS"]\n')
mb.write('if not CONFIG["MOZ_SYSTEM_LIBDRM"]:\n')
mb.write(' LOCAL_INCLUDES += [ "/third_party/drm/drm/",\n')
mb.write(
' "/third_party/drm/drm/include/",\n'
)
mb.write(
' "/third_party/drm/drm/include/libdrm" ]\n'
)
except KeyError:
pass
try:
if (
relsrcdir
in write_mozbuild_variables["INCLUDE_SYSTEM_PIPEWIRE_HANDLING"]
):
mb.write('CXXFLAGS += CONFIG["MOZ_PIPEWIRE_CFLAGS"]\n')
mb.write('if not CONFIG["MOZ_SYSTEM_PIPEWIRE"]:\n')
mb.write(' LOCAL_INCLUDES += [ "/third_party/pipewire/" ]\n')
except KeyError:
pass
try:
if (
relsrcdir
in write_mozbuild_variables["INCLUDE_SYSTEM_LIBVPX_HANDLING"]
):
mb.write('if not CONFIG["MOZ_SYSTEM_LIBVPX"]:\n')
mb.write(' LOCAL_INCLUDES += [ "/media/libvpx/libvpx/" ]\n')
mb.write(' CXXFLAGS += CONFIG["MOZ_LIBVPX_CFLAGS"]\n')
except KeyError:
pass
try:
if (
relsrcdir
in write_mozbuild_variables["INCLUDE_SYSTEM_DAV1D_HANDLING"]
):
mb.write('if CONFIG["MOZ_SYSTEM_AV1"]:\n')
mb.write(' CXXFLAGS += CONFIG["MOZ_SYSTEM_DAV1D_CFLAGS"]\n')
mb.write(' CXXFLAGS += CONFIG["MOZ_SYSTEM_LIBAOM_CFLAGS"]\n')
except KeyError:
pass
all_args = [args for args, _ in configs]
# Start with attributes that will be a part of the mozconfig
# for every configuration, then factor by other potentially useful
# combinations.
# FIXME: this is a time-bomb. See bug 1775202.
for attrs in (
(),
("MOZ_DEBUG",),
("OS_TARGET",),
("TARGET_CPU",),
("MOZ_DEBUG", "OS_TARGET"),
("OS_TARGET", "MOZ_X11"),
("OS_TARGET", "TARGET_CPU"),
("OS_TARGET", "TARGET_CPU", "MOZ_X11"),
("OS_TARGET", "TARGET_CPU", "MOZ_DEBUG"),
("OS_TARGET", "TARGET_CPU", "MOZ_DEBUG", "MOZ_X11"),
):
conditions = set()
for args in all_args:
cond = tuple((k, args.get(k) or "") for k in attrs)
conditions.add(cond)
for cond in sorted(conditions):
common_attrs = find_common_attrs(
[
attrs
for args, attrs in configs
if all((args.get(k) or "") == v for k, v in cond)
]
)
if any(common_attrs.values()):
if cond:
mb.write_condition(dict(cond))
mb.write_attrs(common_attrs)
if cond:
mb.terminate_condition()
mb.finalize()
# write the project moz.build file # write the project moz.build file
dirs_mozbuild = mozpath.join(srcdir, "moz.build") dirs_mozbuild = mozpath.join(srcdir, "moz.build")
@@ -713,6 +695,7 @@ def write_mozbuild(
def generate_gn_config( def generate_gn_config(
topsrcdir,
build_root_dir, build_root_dir,
target_dir, target_dir,
gn_binary, gn_binary,
@@ -720,12 +703,17 @@ def generate_gn_config(
sandbox_variables, sandbox_variables,
gn_target, gn_target,
moz_build_flag, moz_build_flag,
non_unified_sources,
mozilla_flags,
): ):
def str_for_arg(v): def str_for_arg(v):
if v in (True, False): if v in (True, False):
return str(v).lower() return str(v).lower()
return '"%s"' % v return '"%s"' % v
build_root_dir = topsrcdir / build_root_dir
srcdir = build_root_dir / target_dir
input_variables = input_variables.copy() input_variables = input_variables.copy()
input_variables.update( input_variables.update(
{ {
@@ -785,6 +773,14 @@ def generate_gn_config(
input_variables, input_variables,
gn_target, gn_target,
) )
gn_config = process_gn_config(
gn_config,
topsrcdir,
srcdir,
non_unified_sources,
gn_config["sandbox_vars"],
mozilla_flags,
)
return gn_config return gn_config
@@ -833,26 +829,40 @@ def main():
vars_set.append(vars) vars_set.append(vars)
gn_configs = [] gn_configs = []
for vars in vars_set: NUM_WORKERS = 5
gn_configs.append( with ProcessPoolExecutor(max_workers=NUM_WORKERS) as executor:
generate_gn_config( # Submit tasks to the executor
topsrcdir / config["build_root_dir"], futures = {
executor.submit(
generate_gn_config,
topsrcdir,
config["build_root_dir"],
config["target_dir"], config["target_dir"],
gn_binary, gn_binary,
vars, vars,
config["gn_sandbox_variables"], config["gn_sandbox_variables"],
config["gn_target"], config["gn_target"],
config["moz_build_flag"], config["moz_build_flag"],
) config["non_unified_sources"],
) config["mozilla_flags"],
): vars
for vars in vars_set
}
# Process completed tasks as they finish
for future in as_completed(futures):
try:
gn_configs.append(future.result())
except Exception as e:
print(f"[Task] Task failed with exception: {e}")
print("All generation tasks have been processed.")
print("Writing moz.build files") print("Writing moz.build files")
write_mozbuild( write_mozbuild_files(
topsrcdir, topsrcdir,
topsrcdir / config["build_root_dir"] / config["target_dir"], topsrcdir / config["build_root_dir"] / config["target_dir"],
config["non_unified_sources"],
gn_configs, gn_configs,
config["mozilla_flags"],
config["write_mozbuild_variables"], config["write_mozbuild_variables"],
) )