buck2 icon indicating copy to clipboard operation
buck2 copied to clipboard

Dicts passed to set_cfg_constructor stage0 callback should not be sorted

Open thetimmorland opened this issue 5 months ago • 0 comments

The commands below show that the dict passed to the package_modifiers argument of the set_cfg_constructor stage0 was sorted. This reordering is a problem because it causes cfg.conditional modifiers to resolve in an unexpected manner.

For example: I would expect the below modifier to leave the configuration unchanged if "cfg//c:y" and "cfg//a:y" were both set, but the sorting behaviour breaks this.

set_cfg_modifers(modifiers = [
  modifiers.conditional({
    "cfg//c:y": None,
    "cfg//b:y": None,
    "cfg//a:y": "cfg//ftr_foo:y",
  })
])

Minimal example

timorland-local@DUS-MXL3312NDR:/tmp/modifiers-problem$ git format-patch -1 --stdout
 .buckconfig |  2 ++
 .buckroot   |  0
 .gitignore  |  1 +
 BUCK        |  3 +++
 PACKAGE     | 18 ++++++++++++++++++
 defs.bzl    | 28 ++++++++++++++++++++++++++++
 6 files changed, 52 insertions(+)
 create mode 100644 .buckconfig
 create mode 100644 .buckroot
 create mode 100644 .gitignore
 create mode 100644 BUCK
 create mode 100644 PACKAGE
 create mode 100644 defs.bzl

diff --git a/.buckconfig b/.buckconfig
new file mode 100644
index 0000000..82ff4e5
--- /dev/null
+++ b/.buckconfig
@@ -0,0 +1,2 @@
+[cells]
+  root = .
diff --git a/.buckroot b/.buckroot
new file mode 100644
index 0000000..e69de29
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d60c5d2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+buck-out
diff --git a/BUCK b/BUCK
new file mode 100644
index 0000000..3cf47b4
--- /dev/null
+++ b/BUCK
@@ -0,0 +1,3 @@
+load(":defs.bzl", "nothing")
+
+nothing(name = "top")
diff --git a/PACKAGE b/PACKAGE
new file mode 100644
index 0000000..975e8d0
--- /dev/null
+++ b/PACKAGE
@@ -0,0 +1,18 @@
+load(":defs.bzl", "stage0", "stage1")
+
+set_cfg_constructor(
+    stage0 = stage0,
+    stage1 = stage1,
+    key = "buck.modifiers",
+    aliases = struct(),
+)
+
+write_package_value(
+    "buck.modifiers",
+    [
+        {
+            "b": "This should be first",
+            "a": "This should be second",
+        },
+    ],
+)
diff --git a/defs.bzl b/defs.bzl
new file mode 100644
index 0000000..b1bf623
--- /dev/null
+++ b/defs.bzl
@@ -0,0 +1,28 @@
+nothing = rule(
+    impl = lambda ctx: [DefaultInfo()],
+    attrs = {},
+)
+
+def stage0(*, legacy_platform, package_modifiers, target_modifiers, cli_modifiers, rule_name, aliases, **_kwargs):
+    print(
+        "stage0_args =",
+        pstr({
+            "legacy_platform": legacy_platform,
+            "package_modifiers": package_modifiers,
+            "target_modifiers": target_modifiers,
+            "cli_modifiers": cli_modifiers,
+            "rule_name": rule_name,
+            "aliases": aliases,
+        }),
+    )
+
+    return ([], None)
+
+def stage1(*, refs, params) -> PlatformInfo:
+    return PlatformInfo(
+        label = "<empty>",
+        configuration = ConfigurationInfo(
+            constraints = {},
+            values = {},
+        ),
+    )
--
2.45.GIT

timorland-local@DUS-MXL3312NDR:/tmp/modifiers-problem$ buck2 build :
Could not connect to buck2 daemon (buck2 daemon is not running), starting a new one...
Connected to new buck2 daemon.
stage0_args = {
  "legacy_platform": None,
  "package_modifiers": [ {
    "a": "This should be second",
    "b": "This should be first"
  } ],
  "target_modifiers": None,
  "cli_modifiers": [],
  "rule_name": "nothing",
  "aliases": struct()
}
Build ID: 1db24b5a-121c-4d48-ac22-bfb6d3783b2d
Jobs completed: 5. Time elapsed: 0.0s.
BUILD SUCCEEDED

thetimmorland avatar Sep 20 '24 20:09 thetimmorland