about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--default.nix19
-rw-r--r--ops/nixos/default.nix1
-rw-r--r--ops/pipelines/depot.nix19
3 files changed, 31 insertions, 8 deletions
diff --git a/default.nix b/default.nix
index 151d8987ea..61821bce8f 100644
--- a/default.nix
+++ b/default.nix
@@ -50,10 +50,25 @@ let
 
   # Walk the tree starting with 'node', recursively extending the list
   # of build targets with anything that looks buildable.
+  #
+  # Any tree node can specify logical targets by exporting a
+  # 'meta.targets' attribute containing a list of keys in itself. This
+  # enables target specifications that do not exist on disk directly.
   gather = node:
     if node ? __readTree then
-      (if eligible node then [node] else []) ++
-      concatMap gather (attrValues node)
+      # Include the node itself if it is eligible.
+      (if eligible node then [ node ] else [])
+      # Include eligible children of the node
+      ++ concatMap gather (attrValues node)
+      # Include specified sub-targets of the node
+      ++ filter eligible (map
+           (k: (node."${k}" or {}) // {
+             # Keep the same tree location, but explicitly mark this
+             # node as a subtarget.
+             __readTree = node.__readTree;
+             __subtarget = k;
+           })
+           (node.meta.targets or []))
     else [];
 in fix(self: {
   config = config self;
diff --git a/ops/nixos/default.nix b/ops/nixos/default.nix
index 917a56b766..5bd32e4068 100644
--- a/ops/nixos/default.nix
+++ b/ops/nixos/default.nix
@@ -48,4 +48,5 @@ rec {
   # TODO(tazjin): Refactor the whole systems setup, it's a bit
   # inconsistent at the moment.
   whitbySystem = (nixosFor whitby).system;
+  meta.targets = [ "whitbySystem" ];
 }
diff --git a/ops/pipelines/depot.nix b/ops/pipelines/depot.nix
index 5d1f2babe1..ec7fb81327 100644
--- a/ops/pipelines/depot.nix
+++ b/ops/pipelines/depot.nix
@@ -13,12 +13,19 @@ let
 
   # Create an expression that builds the target at the specified
   # location.
-  mkBuildExpr =
-    let descend = expr: attr: "builtins.getAttr \"${attr}\" (${expr})";
-    in foldl' descend "import ./. {}";
+  mkBuildExpr = target:
+    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;
 
   # Create a pipeline label from the targets tree location.
-  mkLabel = concatStringsSep "/";
+  mkLabel = target:
+    let label = concatStringsSep "/" target.__readTree;
+    in if target ? __subtarget
+      then "${label}:${target.__subtarget}"
+      else label;
 
   # Create a pipeline step from a single target.
   #
@@ -27,9 +34,9 @@ let
   # regardless, but this data is not accessible.
   mkStep = target: {
     command = ''
-      nix-build -E '${mkBuildExpr target.__readTree}' || (buildkite-agent meta-data set "failure" "1"; exit 1)
+      nix-build -E '${mkBuildExpr target}' || (buildkite-agent meta-data set "failure" "1"; exit 1)
     '';
-    label = ":nix: ${mkLabel target.__readTree}";
+    label = ":nix: ${mkLabel target}";
   };
 
   # Protobuf check step which validates that changes to .proto files