diff --git a/.bazelrc b/.bazelrc index 273e9e0..b80f581 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,5 +1,6 @@ -# No bzlmod yet -common --noenable_bzlmod +# Valdi custom Bazel registry (patched rules_swift, rules_kotlin, etc.) +common --registry=https://raw.githubusercontent.com/Snapchat/Valdi/beta-0.1.0/registry +common --registry=https://bcr.bazel.build common --bes_instance_name=client common --enable_platform_specific_config @@ -20,8 +21,11 @@ build:linux --sandbox_writable_path=/var/tmp # common cc configuration build --cxxopt=-std=c++20 build --cxxopt=-Wno-ambiguous-reversed-operator +build --cxxopt=-Wno-gcc-compat +build --cxxopt=-Wno-nullability-extension build --cxxopt=-D_LIBCPP_ENABLE_CXX20_REMOVED_TYPE_TRAITS build --host_cxxopt=-std=c++20 +build --host_cxxopt=-Wno-nullability-extension ## we need to disable this due to a bug in bazel ## see https://github.com/bazelbuild/bazel/issues/12381 @@ -57,19 +61,15 @@ build --define=android_incremental_dexing_tool=d8_dexbuilder build --define=android_standalone_dexing_tool=d8_compat_dx build --incremental_dexing -# Disable 3rd party libs warnings -build --per_file_copt=external/com_github_grpc_grpc/.*\$@-Wno-everything -build --per_file_copt=external/snap_protobuf/.*\$@-Wno-everything -build --per_file_copt=external/boringssl/.*\$@-Wno-everything -build --per_file_copt=external/com_github_google_flatbuffers/.*\$@-Wno-everything +# Disable 3rd party libs warnings (bzlmod-compatible patterns) +build --per_file_copt=external/protobuf[^/]*/.*\$@-Wno-everything +build --per_file_copt=external/boringssl[^/]*/.*\$@-Wno-everything +build --per_file_copt=external/grpc[^/]*/.*\$@-Wno-everything +build --per_file_copt=external/flatbuffers[^/]*/.*\$@-Wno-everything # Enable persistent worker for Valdi compilation build --strategy=ValdiCompile=worker -## Disable sandboxing for macs, both laptops and in CI; the performance hit is much too high. -build:macos --spawn_strategy=local -build:linux --sandbox_writable_path=/var/tmp - # Disable disk cache to save disk space build --disk_cache="" @@ -86,7 +86,6 @@ build --flag_alias=valdi_js_engine=@valdi//bzl/valdi:js_engine # Enable web compilation (generates JS outputs from Valdi compiler for web targets) common --define=enable_web=true -build --android_crosstool_top="@snap_client_toolchains//:android_crosstool" # Web build configuration (used by scripts/bazel_web_serve.sh) build:web --build_tag_filters=web build:ios --repo_env=VALDI_PLATFORM_DEPENDENCIES=ios diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 97d72dc..c1e5b5e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,6 +16,23 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Checkout Valdi + uses: actions/checkout@v4 + with: + repository: Snapchat/Valdi + lfs: true + path: .valdi + + - name: Patch for CI (local Valdi checkout) + run: | + VALDI=${{ github.workspace }}/.valdi + # Remove root-module-only llvm extension from Valdi's MODULE.bazel + sed -i '' '/^llvm = use_extension/d; /^llvm\.toolchain/d; /^use_repo(llvm/d; /^register_toolchains("@llvm_toolchain/d' .valdi/MODULE.bazel + # Point .bazelrc registry at local Valdi checkout (release tag may not exist yet) + sed -i '' "s|--registry=https://raw.githubusercontent.com/Snapchat/Valdi/.*/registry|--registry=file://$VALDI/registry|" .bazelrc + # Stub out open_source_archives.bzl (stripped by Copybara, not on public repo) + echo 'ARCHIVES = {}' > .valdi/bzl/open_source_archives.bzl + - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.8.5 with: @@ -24,7 +41,23 @@ jobs: repository-cache: true - name: Run all tests - run: bazel test --test_output=all //valdi_modules/widgets:test //valdi_modules/navigation:test //valdi_modules/valdi_standalone_ui:test //valdi_modules/navigation_internal:test //valdi_modules/playground:test + run: | + VALDI=${{ github.workspace }}/.valdi + bazel test --test_output=all \ + --override_module=valdi=$VALDI \ + --override_module=android_macros=$VALDI/bzl/macros \ + --override_module=snap_macros=$VALDI/bzl/valdi/snap_macros \ + --override_module=snap_client_toolchains=$VALDI/bzl/toolchains \ + --override_module=snap_platforms=$VALDI/bzl/platforms \ + --override_module=skia_user_config=$VALDI/third-party/skia_user_config \ + --override_module=rules_hdrs=$VALDI/third-party/rules_hdrs \ + --override_module=valdi_toolchain=$VALDI/bin \ + --override_module=resvg_libs=$VALDI/third-party/resvg/resvg_libs \ + //valdi_modules/widgets:test \ + //valdi_modules/navigation:test \ + //valdi_modules/valdi_standalone_ui:test \ + //valdi_modules/navigation_internal:test \ + //valdi_modules/playground:test - name: Upload test results if: always() diff --git a/.gitignore b/.gitignore index f0fb03c..2b1b47e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.DS_Store bazel-* +MODULE.bazel.lock .cursor/rules/remote # Web playground dev server dependencies diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 0000000..299f23b --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,98 @@ +module(name = "valdi_widgets", version = "0.1") + +# Valdi framework (https://github.com/Snapchat/Valdi) +# For development against a local checkout, replace archive_override with +# local_path_override entries (see CONTRIBUTING.md). +VALDI_TAG = "beta-0.1.0" +VALDI_URL = "https://github.com/Snapchat/Valdi/archive/{}.tar.gz".format(VALDI_TAG) +VALDI_STRIP_PREFIX = "Valdi-{}".format(VALDI_TAG) + +bazel_dep(name = "valdi", version = "0.1") +archive_override( + module_name = "valdi", + urls = [VALDI_URL], + strip_prefix = VALDI_STRIP_PREFIX, +) + +bazel_dep(name = "android_macros") +archive_override( + module_name = "android_macros", + urls = [VALDI_URL], + strip_prefix = VALDI_STRIP_PREFIX + "/bzl/macros", +) + +bazel_dep(name = "snap_macros") +archive_override( + module_name = "snap_macros", + urls = [VALDI_URL], + strip_prefix = VALDI_STRIP_PREFIX + "/bzl/valdi/snap_macros", +) + +bazel_dep(name = "snap_client_toolchains") +archive_override( + module_name = "snap_client_toolchains", + urls = [VALDI_URL], + strip_prefix = VALDI_STRIP_PREFIX + "/bzl/toolchains", +) + +bazel_dep(name = "snap_platforms") +archive_override( + module_name = "snap_platforms", + urls = [VALDI_URL], + strip_prefix = VALDI_STRIP_PREFIX + "/bzl/platforms", +) + +bazel_dep(name = "skia_user_config") +archive_override( + module_name = "skia_user_config", + urls = [VALDI_URL], + strip_prefix = VALDI_STRIP_PREFIX + "/third-party/skia_user_config", +) + +bazel_dep(name = "rules_hdrs") +archive_override( + module_name = "rules_hdrs", + urls = [VALDI_URL], + strip_prefix = VALDI_STRIP_PREFIX + "/third-party/rules_hdrs", +) + +bazel_dep(name = "valdi_toolchain") +archive_override( + module_name = "valdi_toolchain", + urls = [VALDI_URL], + strip_prefix = VALDI_STRIP_PREFIX + "/bin", +) + +bazel_dep(name = "resvg_libs") +archive_override( + module_name = "resvg_libs", + urls = [VALDI_URL], + strip_prefix = VALDI_STRIP_PREFIX + "/third-party/resvg/resvg_libs", +) + +# C++ toolchains via Valdi's unified extension (Apple CC before LLVM for ObjC priority). +valdi_toolchains = use_extension("@valdi//bzl:valdi_toolchains.bzl", "valdi_toolchains") +use_repo(valdi_toolchains, "local_config_apple_cc_toolchains", "local_config_apple_cc", "llvm_toolchain", "llvm_toolchain_llvm") +register_toolchains("@local_config_apple_cc_toolchains//:all") +register_toolchains("@llvm_toolchain//:all") + +# Required for widgets/BUILD.bazel which uses ts_project directly. +bazel_dep(name = "aspect_rules_ts", version = "3.7.0") +rules_ts_ext = use_extension("@aspect_rules_ts//ts:extensions.bzl", "ext") +use_repo(rules_ts_ext, "npm_typescript") + +# Third-party patches: Valdi's single_version_override entries only take +# effect when Valdi is the root module. The Valdi Bazel registry provides +# pre-patched versions of rules_swift, rules_kotlin, and rules_android_ndk. +# Websocketpp still needs a local patch. +single_version_override( + module_name = "websocketpp", + patches = ["//third-party/patches:websocketpp.patch"], + patch_strip = 1, +) + +# Version pins (must match Valdi's MODULE.bazel). +single_version_override(module_name = "protobuf", version = "27.0") +single_version_override(module_name = "rules_apple", version = "4.0.0") +single_version_override(module_name = "rules_pkg", version = "0.9.1") +single_version_override(module_name = "zlib", version = "1.3.2") diff --git a/WORKSPACE b/WORKSPACE deleted file mode 100644 index db08568..0000000 --- a/WORKSPACE +++ /dev/null @@ -1,74 +0,0 @@ -workspace(name = "valdi_widgets") - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") - -# Valdi bleeding edge (https://github.com/Snapchat/Valdi) -http_archive( - name = "valdi", - strip_prefix = "Valdi-45b28375a189da8f9c24544e3b2d40318d3386a9", - url = "https://github.com/Snapchat/Valdi/archive/45b28375a189da8f9c24544e3b2d40318d3386a9.tar.gz", -) - -# For local development (uncomment to use local Valdi checkout): -# local_repository(name = "valdi", path = "/Users/cholgate/Snapchat/Dev/mobile/client/src/open_source") - -# Valdi release beta-0.0.2 (https://github.com/Snapchat/Valdi/releases) -# http_archive( -# name = "valdi", -# strip_prefix = "Valdi-beta-0.0.2", -# url = "https://github.com/Snapchat/Valdi/archive/refs/tags/beta-0.0.2.tar.gz", -# ) - -load("@valdi//bzl:workspace_prepare.bzl", "valdi_prepare_workspace") - -valdi_prepare_workspace() - -load("@valdi//bzl:workspace_preinit.bzl", "valdi_preinitialize_workspace") - -valdi_preinitialize_workspace() - -load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies", "aspect_bazel_lib_register_toolchains", "register_yq_toolchains") - -register_yq_toolchains() - -# Required bazel-lib dependencies - -aspect_bazel_lib_dependencies() - -# Required rules_shell dependencies -load("@rules_shell//shell:repositories.bzl", "rules_shell_dependencies", "rules_shell_toolchains") - -rules_shell_dependencies() - -rules_shell_toolchains() - -# Register bazel-lib toolchains - -aspect_bazel_lib_register_toolchains() - -# Create the host platform repository transitively required by bazel-lib - -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") -load("@platforms//host:extension.bzl", "host_platform_repo") - -maybe( - host_platform_repo, - name = "host_platform", -) - -load("@valdi//bzl:workspace_init.bzl", "platform_dependency_rule", "valdi_initialize_workspace") - -platform_dependency_rule(name = "platform_check") - -load("@platform_check//:target_platform.bzl", "VALDI_PLATFORM_DEPENDENCIES") - -valdi_initialize_workspace(VALDI_PLATFORM_DEPENDENCIES) - -load("@valdi_npm//:repositories.bzl", "npm_repositories") - -npm_repositories() - -load("@valdi//bzl:workspace_postinit.bzl", "valdi_post_initialize_workspace") - -valdi_post_initialize_workspace() diff --git a/third-party/patches/BUILD.bazel b/third-party/patches/BUILD.bazel new file mode 100644 index 0000000..d518110 --- /dev/null +++ b/third-party/patches/BUILD.bazel @@ -0,0 +1 @@ +exports_files(glob(["*.patch"])) diff --git a/third-party/patches/websocketpp.patch b/third-party/patches/websocketpp.patch new file mode 100644 index 0000000..10ddaca --- /dev/null +++ b/third-party/patches/websocketpp.patch @@ -0,0 +1,17 @@ +--- a/BUILD.bazel ++++ b/BUILD.bazel +@@ -23,12 +23,12 @@ + }), + includes = ["."], + linkopts = select({ +- "@platforms//os:osx": [ ++ "@platforms//os:linux": [ + "-lpthread", ++ "-lrt", + ], + "//conditions:default": [ + "-lpthread", +- "-lrt", + ], + }), + visibility = ["//visibility:public"],