about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nix/buildkite/default.nix29
1 files changed, 14 insertions, 15 deletions
diff --git a/nix/buildkite/default.nix b/nix/buildkite/default.nix
index 892f49f9639a..e45deade4bea 100644
--- a/nix/buildkite/default.nix
+++ b/nix/buildkite/default.nix
@@ -29,20 +29,14 @@ let
   inherit (depot.nix.readTree) mkLabel;
 in
 rec {
-  # Creates a Nix expression that yields the target at the specified
-  # location in the repository.
-  #
-  # This makes a distinction between normal targets (which physically
-  # exist in the repository) and subtargets (which are "virtual"
-  # targets exposed by a physical one) to make it clear in the build
-  # output which is which.
-  mkBuildExpr = target:
+  # Given an arbitrary attribute path generate a Nix expression which obtains
+  # this from the root of depot (assumed to be ./.). Attributes may be any
+  # Nix strings suitable as attribute names, not just Nix literal-safe strings.
+  mkBuildExpr = attrPath:
     let
       descend = expr: attr: "builtins.getAttr \"${attr}\" (${expr})";
-      targetExpr = foldl' descend "import ./. {}" target.__readTree;
-      subtargetExpr = descend targetExpr target.__subtarget;
     in
-    if target ? __subtarget then subtargetExpr else targetExpr;
+    foldl' descend "import ./. {}" attrPath;
 
   # Determine whether to skip a target if it has not diverged from the
   # HEAD branch.
@@ -51,8 +45,8 @@ rec {
     then "Target has not changed."
     else false;
 
-  # Create build command for a derivation target.
-  mkBuildCommand = { target, drvPath }: concatStringsSep " " [
+  # Create build command for an attribute path pointing to a derivation.
+  mkBuildCommand = { attrPath, drvPath }: concatStringsSep " " [
     # First try to realise the drvPath of the target so we don't evaluate twice.
     # Nix has no concept of depending on a derivation file without depending on
     # at least one of its `outPath`s, so we need to discard the string context
@@ -62,7 +56,7 @@ rec {
     # Since we don't gcroot the derivation files, they may be deleted by the
     # garbage collector. In that case we can reevaluate and build the attribute
     # using nix-build.
-    "|| (test ! -f '${drvPath}' && nix-build -E '${mkBuildExpr target}' --show-trace)"
+    "|| (test ! -f '${drvPath}' && nix-build -E '${mkBuildExpr attrPath}' --show-trace)"
   ];
 
   # Create a pipeline step from a single target.
@@ -75,7 +69,12 @@ rec {
       label = ":nix: " + label;
       key = hashString "sha1" label;
       skip = shouldSkip { inherit label drvPath parentTargetMap; };
-      command = mkBuildCommand { inherit target drvPath; };
+      command = mkBuildCommand {
+        attrPath =
+          target.__readTree
+          ++ lib.optionals (target ? __subtarget) [ target.__subtarget ];
+        inherit drvPath;
+      };
       env.READTREE_TARGET = label;
       cancel_on_build_failing = cancelOnBuildFailing;