about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndreas Rammhold <andi@notmuch.email>2020-11-27T15·31+0100
committerandi <andi@notmuch.email>2020-11-27T19·09+0000
commit9bf6eb7f82d4b6996e10dbd5780a17850fb93fd8 (patch)
tree90d7014b19280b3b4fb721f2310e0c6ee74a70bc
parente772f38a5e19dc2f1cdd6c5b9175693eb17c0249 (diff)
chore(tvix): avoid unnesscary rebuilds of protos and tvix r/1934
For the build of tvix we can safely ignore all the files in src/protos
as well as all the nix files in the root of the repository. By passing
the input sources through builtins.filterSource we can make a per-file
decision whether or not we want to copy it into the store (in other
words: if we consider it relevant for the build).

This enables much faster development on the actual build expression.

Change-Id: Ib4c01dbe9cbfa9770922f6257af2a7259814ce0d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2159
Tested-by: BuildkiteCI
Reviewed-by: glittershark <grfn@gws.fyi>
Reviewed-by: lukegb <lukegb@tvl.fyi>
-rw-r--r--third_party/nix/default.nix28
1 files changed, 26 insertions, 2 deletions
diff --git a/third_party/nix/default.nix b/third_party/nix/default.nix
index 15eb69d184..b48551cff0 100644
--- a/third_party/nix/default.nix
+++ b/third_party/nix/default.nix
@@ -12,12 +12,36 @@ let
     customMemoryManagement = false;
   };
 
-  src = ./.;
+  src = let
+    srcDir = ./.;
+    # create relative paths for all the sources we are filtering
+    asRelative = path:
+      let
+        srcS = toString srcDir;
+        pathS = toString path;
+      in
+        if ! lib.hasPrefix srcS pathS then
+          throw "Path is outside of the working directory."
+        else
+        lib.removePrefix srcS pathS;
+
+  in builtins.filterSource (path: type:
+    # Strip out .nix files that are in the root of the repository.  Changing
+    # the expression of tvix shouldn't cause a rebuild of tvix unless really
+    # required.
+    !(dirOf (asRelative path) == "/" && lib.hasSuffix ".nix" path) &&
+
+    # remove the proto files from the repo as those are compiled separately
+    !(lib.hasPrefix "src/proto" (asRelative path)) &&
+
+    # ignore result symlinks
+    !(type == "symlink" && lib.hasPrefix "result" (baseNameOf path))
+  ) srcDir;
 
   # Proto generation in CMake is theoretically possible, but that is
   # very theoretical - this does it in Nix instead.
   protoSrcs = pkgs.runCommand "nix-proto-srcs" {} ''
-    export PROTO_SRCS=${src + "/src/proto"}
+    export PROTO_SRCS=${./src/proto}
     mkdir -p $out/libproto
     ${pkgs.protobuf}/bin/protoc -I=$PROTO_SRCS \
       --cpp_out=$out/libproto \