From 2eb076f0e32e26a42c437033ff8cf216ef3a1f96 Mon Sep 17 00:00:00 2001 From: Pawel Zmarzly <pzmarzly@meta.com> Date: Mon, 20 Jan 2025 05:58:13 -0800 Subject: [PATCH] [antlir][build_defs] Fix fb_deps and fb_test_deps logic Summary: In our build defs, `fb_test_deps` can work when used with `rust_unittest`, but if used with `rust_{binary,library}`, the argument does not get forwarded to unittest rule, but to the main rule (since it starts with `fb_test_`, and we only check for `test_`). There's also a problem that if we have both `fb_deps` and `fb_test_deps`, one will override the other, instead of merging. In this diff, I'm changing `_split_rust_kwargs` to be able to turn `kwargs["fb_test_deps"]` into `test_kwargs["fb_deps"]`. Test Plan: Signals here should catch regressions Reviewed By: sergeyfd Differential Revision: D68327867 fbshipit-source-id: aa43b473aec6fcddbf9dcb725e231ee9eeb64f35 --- antlir/bzl/build_defs.bzl | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/antlir/bzl/build_defs.bzl b/antlir/bzl/build_defs.bzl index 6d5cfb6c7a6..a1889bdfadf 100644 --- a/antlir/bzl/build_defs.bzl +++ b/antlir/bzl/build_defs.bzl @@ -109,14 +109,23 @@ def _rust_implicit_test(kwargs, test_kwargs): test_kwargs.pop("linker_flags", None) test_kwargs["srcs"] = test_kwargs.get("srcs", []) + kwargs.get("srcs", []) test_kwargs["deps"] = test_kwargs.get("deps", []) + kwargs.get("deps", []) + test_kwargs["fb_deps"] = test_kwargs.get("fb_deps", []) + kwargs.get("fb_deps", []) _rust_common(shim.rust_unittest, **test_kwargs) -def _split_rust_kwargs(kwargs): - test_kwargs = dict(kwargs) - test_kwargs = {k: v for k, v in test_kwargs.items() if not k.startswith("test_")} - test_kwargs.update({k[len("test_"):]: v for k, v in kwargs.items() if k.startswith("test_")}) - kwargs = {k: v for k, v in kwargs.items() if not k.startswith("test_")} +def _is_rust_test_key(key): + return key.startswith("test_") or key.startswith("fb_test_") + +def _rust_test_key_to_regular_key(key): + if key.startswith("test_"): + return key[5:] + if key.startswith("fb_test_"): + return "fb_" + key[8:] + return key +def _split_rust_kwargs(kwargs): + test_kwargs = {k: v for k, v in kwargs.items() if not _is_rust_test_key(k)} + test_kwargs.update({_rust_test_key_to_regular_key(k): v for k, v in kwargs.items() if _is_rust_test_key(k)}) + kwargs = {k: v for k, v in kwargs.items() if not _is_rust_test_key(k)} return kwargs, test_kwargs def _normalize_rust_dep(dep):