From 67f20b3ee5f40f7d38ed84ee590dec0872b29f40 Mon Sep 17 00:00:00 2001 From: Felix Hanau Date: Wed, 23 Oct 2024 13:26:09 -0400 Subject: [PATCH] [build] Disable WebGPU for Windows non-release builds The Windows build is currently much slower than the macOS/Linux builds on CI, especially on mostly cached builds. Based on profiling on #2981, this is caused by the repo mapping stage for dawn taking several minutes of Windows. Disable the experimental WebGPU feature on Windows to better meet compile time constraints. Release builds remain unaffected. Fetching WPT also contributes here. Only fetch/use WPT on Unix and only configure targets based on globs as we start using them, Bazel configures 90,000 targets for it otherwise. --- .bazelrc | 29 +++++++++++++++++------------ build/BUILD.wpt | 15 +++++---------- build/ci.bazelrc | 6 ++++++ build/wpt_test.bzl | 9 +++++++++ src/wpt/BUILD.bazel | 3 +-- 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/.bazelrc b/.bazelrc index 90988b77da23..a6cac592ff2c 100644 --- a/.bazelrc +++ b/.bazelrc @@ -26,8 +26,13 @@ import %workspace%/build/ci.bazelrc import %workspace%/build/lint.bazelrc -# Enable webgpu -build --//src/workerd/io:enable_experimental_webgpu=True +# Enable webgpu. Merely fetching the required Dawn library and computing the repo mapping based on +# it slows down the Windows build significantly, so only enable this on Unix and for Windows release +# builds. This is mostly motivated by compile time constraints, we hope to lift this limitation +# again if this Windows performance bottleneck gets fixed within Bazel. +build:unix --config=webgpu +build:release_windows --config=webgpu +build:webgpu --//src/workerd/io:enable_experimental_webgpu=True # Avoid generating duplicate runfile trees. This will become the default in a future bazel version. build --nolegacy_external_runfiles @@ -38,16 +43,16 @@ build --incompatible_disallow_empty_glob # Prevents bazel cache invalidation when switching terminals build --incompatible_strict_action_env -# Dawn tint build flags -build --@dawn//src/tint:tint_build_glsl_writer=False -build --@dawn//src/tint:tint_build_glsl_validator=False -build --@dawn//src/tint:tint_build_hlsl_writer=True -build --@dawn//src/tint:tint_build_ir=False -build --@dawn//src/tint:tint_build_msl_writer=True -build --@dawn//src/tint:tint_build_spv_reader=False -build --@dawn//src/tint:tint_build_spv_writer=True -build --@dawn//src/tint:tint_build_wgsl_reader=True -build --@dawn//src/tint:tint_build_wgsl_writer=True +# Dawn tint build flags. Only enable when building with webgpu support +build:webgpu --@dawn//src/tint:tint_build_glsl_writer=False +build:webgpu --@dawn//src/tint:tint_build_glsl_validator=False +build:webgpu --@dawn//src/tint:tint_build_hlsl_writer=True +build:webgpu --@dawn//src/tint:tint_build_ir=False +build:webgpu --@dawn//src/tint:tint_build_msl_writer=True +build:webgpu --@dawn//src/tint:tint_build_spv_reader=False +build:webgpu --@dawn//src/tint:tint_build_spv_writer=True +build:webgpu --@dawn//src/tint:tint_build_wgsl_reader=True +build:webgpu --@dawn//src/tint:tint_build_wgsl_writer=True # Our dependencies (ICU, zlib, etc.) produce a lot of these warnings, so we disable them. Depending # on the clang version, zlib either produces warnings for -Wdeprecated-non-prototype or does not diff --git a/build/BUILD.wpt b/build/BUILD.wpt index 757b227041c7..b6fecfff69d2 100644 --- a/build/BUILD.wpt +++ b/build/BUILD.wpt @@ -2,16 +2,11 @@ # Licensed under the Apache 2.0 license found in the LICENSE file or at: # https://opensource.org/licenses/Apache-2.0 -directories = glob( - ["*"], - exclude = glob( - ["*"], - exclude_directories = 1, - ) + [ - ".*", - ], - exclude_directories = 0, -) +# successively enable wpt targets +directories = [ + "url", + "urlpattern", +] [filegroup( name = dir, diff --git a/build/ci.bazelrc b/build/ci.bazelrc index 71d8f68d0121..dc9dfb4044e0 100644 --- a/build/ci.bazelrc +++ b/build/ci.bazelrc @@ -19,6 +19,12 @@ build:ci --color=yes # Indicate support for more terminal columns, 100 is the line length recommended by KJ style. build:ci --terminal_columns=100 +# Only build runfile trees when needed/lazily, so that they are not built for disabled tests +build:ci --nobuild_runfile_links +# Speeds up CI build by making action output uploads non-blocking so Bazel can e.g. run a test +# before it finishes uploading the test binary. On-by-default in Bazel 8. +build:ci --experimental_remote_cache_async + build:ci --config=v8-codegen-opt test:ci --test_output=errors build:ci --disk_cache=~/bazel-disk-cache diff --git a/build/wpt_test.bzl b/build/wpt_test.bzl index 35bff703d29f..8cebac33210c 100644 --- a/build/wpt_test.bzl +++ b/build/wpt_test.bzl @@ -16,6 +16,10 @@ def wpt_test(name, wpt_directory, test_js): test_name = name, wpt_directory = wpt_directory, test_js = test_js, + target_compatible_with = select({ + "@platforms//os:windows": ["@platforms//:incompatible"], + "//conditions:default": [], + }), ) wd_test( @@ -28,6 +32,11 @@ def wpt_test(name, wpt_directory, test_js): wpt_directory, "//src/workerd/io:trimmed-supported-compatibility-date.txt", ], + # Even generating WPT tests is prohibitively expensive on Windows, disable it there + target_compatible_with = select({ + "@platforms//os:windows": ["@platforms//:incompatible"], + "//conditions:default": [], + }), ) def _wpt_test_gen_impl(ctx): diff --git a/src/wpt/BUILD.bazel b/src/wpt/BUILD.bazel index 4eda7837a58b..f8ad536a57f8 100644 --- a/src/wpt/BUILD.bazel +++ b/src/wpt/BUILD.bazel @@ -1,8 +1,7 @@ filegroup( name = "wpt-test-harness", srcs = glob( - include = ["**/*"], - allow_empty = True, + include = ["*.js"], ), visibility = ["//visibility:public"], )