about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/builders/packages/cataclysm-dda.section.md35
-rw-r--r--pkgs/games/cataclysm-dda/default.nix3
-rw-r--r--pkgs/games/cataclysm-dda/git.nix9
-rw-r--r--pkgs/games/cataclysm-dda/lib.nix31
-rw-r--r--pkgs/games/cataclysm-dda/pkgs/default.nix10
-rw-r--r--pkgs/games/cataclysm-dda/stable.nix9
6 files changed, 77 insertions, 20 deletions
diff --git a/doc/builders/packages/cataclysm-dda.section.md b/doc/builders/packages/cataclysm-dda.section.md
index 1173fe32adae9..0f908cb75909c 100644
--- a/doc/builders/packages/cataclysm-dda.section.md
+++ b/doc/builders/packages/cataclysm-dda.section.md
@@ -34,6 +34,41 @@ cataclysm-dda.override {
 }
 ```
 
+## Important note for overriding packages
+
+After applying `overrideAttrs`, you need to fix `passthru.pkgs` and
+`passthru.withMods` attributes either manually or by using `attachPkgs`:
+
+```nix
+let
+  # You enabled parallel building.
+  myCDDA = cataclysm-dda-git.overrideAttrs (_: {
+    enableParallelBuilding = true;
+  });
+
+  # Unfortunately, this refers to the package before overriding and
+  # parallel building is still disabled.
+  badExample = myCDDA.withMods (_: []);
+
+  inherit (cataclysmDDA) attachPkgs pkgs wrapCDDA;
+
+  # You can fix it by hand
+  goodExample1 = myCDDA.overrideAttrs (old: {
+    passthru = old.passthru // {
+      pkgs = pkgs.override { build = goodExample1; };
+      withMods = wrapCDDA goodExample1;
+    };
+  });
+
+  # or by using a helper function `attachPkgs`.
+  goodExample2 = attachPkgs pkgs myCDDA;
+in
+
+# badExample                     # parallel building disabled
+# goodExample1.withMods (_: [])  # parallel building enabled
+goodExample2.withMods (_: [])    # parallel building enabled
+```
+
 ## Customizing with mods
 
 To install Cataclysm DDA with mods of your choice, you can use `withMods`
diff --git a/pkgs/games/cataclysm-dda/default.nix b/pkgs/games/cataclysm-dda/default.nix
index ada212ea7e9fb..1649cd031a4b4 100644
--- a/pkgs/games/cataclysm-dda/default.nix
+++ b/pkgs/games/cataclysm-dda/default.nix
@@ -33,7 +33,8 @@ let
     buildMod
     buildSoundPack
     buildTileSet
-    wrapCDDA;
+    wrapCDDA
+    attachPkgs;
 
     inherit pkgs;
   };
diff --git a/pkgs/games/cataclysm-dda/git.nix b/pkgs/games/cataclysm-dda/git.nix
index 36f37f7aeba42..9af90481acda7 100644
--- a/pkgs/games/cataclysm-dda/git.nix
+++ b/pkgs/games/cataclysm-dda/git.nix
@@ -1,4 +1,4 @@
-{ lib, callPackage, CoreFoundation, fetchFromGitHub, pkgs, wrapCDDA
+{ lib, callPackage, CoreFoundation, fetchFromGitHub, pkgs, wrapCDDA, attachPkgs
 , tiles ? true, Cocoa
 , debug ? false
 , useXdgDir ? false
@@ -26,11 +26,6 @@ let
       "VERSION=git-${version}-${lib.substring 0 8 src.rev}"
     ];
 
-    passthru = common.passthru // {
-      pkgs = pkgs.override { build = self; };
-      withMods = wrapCDDA self;
-    };
-
     meta = common.meta // {
       maintainers = with lib.maintainers;
       common.meta.maintainers ++ [ rardiol ];
@@ -38,4 +33,4 @@ let
   });
 in
 
-self
+attachPkgs pkgs self
diff --git a/pkgs/games/cataclysm-dda/lib.nix b/pkgs/games/cataclysm-dda/lib.nix
index 02678ed0228e9..f2b38a16aa534 100644
--- a/pkgs/games/cataclysm-dda/lib.nix
+++ b/pkgs/games/cataclysm-dda/lib.nix
@@ -1,6 +1,6 @@
 { callPackage }:
 
-{
+rec {
   buildMod = callPackage ./builder.nix {
     type = "mod";
   };
@@ -14,4 +14,33 @@
   };
 
   wrapCDDA = callPackage ./wrapper.nix {};
+
+  # Required to fix `pkgs` and `withMods` attrs after applying `overrideAttrs`.
+  #
+  # Example:
+  #     let
+  #       myBuild = cataclysmDDA.jenkins.latest.tiles.overrideAttrs (_: {
+  #         x = "hello";
+  #       });
+  #
+  #       # This refers to the derivation before overriding! So, `badExample.x` is not accessible.
+  #       badExample = myBuild.withMods (_: []);
+  #
+  #       # `myBuild` is correctly referred by `withMods` and `goodExample.x` is accessible.
+  #       goodExample = let
+  #         inherit (cataclysmDDA) attachPkgs pkgs;
+  #       in
+  #       (attachPkgs pkgs myBuild).withMods (_: []);
+  #     in
+  #     goodExample.x  # returns "hello"
+  attachPkgs = pkgs: super:
+  let
+    self = super.overrideAttrs (old: {
+      passthru = old.passthru // {
+        pkgs = pkgs.override { build = self; };
+        withMods = wrapCDDA self;
+      };
+    });
+  in
+  self;
 }
diff --git a/pkgs/games/cataclysm-dda/pkgs/default.nix b/pkgs/games/cataclysm-dda/pkgs/default.nix
index 6f3df09a78616..39abad809c5b3 100644
--- a/pkgs/games/cataclysm-dda/pkgs/default.nix
+++ b/pkgs/games/cataclysm-dda/pkgs/default.nix
@@ -13,15 +13,17 @@ let
     };
   };
 
-  pkgs' = lib.mapAttrs (_: mod: lib.filterAttrs availableForBuild mod) pkgs;
+  pkgs' = lib.mapAttrs (_: mods: lib.filterAttrs isAvailable mods) pkgs;
 
-  availableForBuild = _: mod:
+  isAvailable = _: mod:
   if isNull build then
     true
   else if build.isTiles then
-    mod.forTiles
+    mod.forTiles or false
+  else if build.isCurses then
+    mod.forCurses or false
   else
-    mod.forCurses;
+    false;
 in
 
 lib.makeExtensible (_: pkgs')
diff --git a/pkgs/games/cataclysm-dda/stable.nix b/pkgs/games/cataclysm-dda/stable.nix
index 4210a21669466..d0452090ca658 100644
--- a/pkgs/games/cataclysm-dda/stable.nix
+++ b/pkgs/games/cataclysm-dda/stable.nix
@@ -1,4 +1,4 @@
-{ lib, callPackage, CoreFoundation, fetchFromGitHub, pkgs, wrapCDDA
+{ lib, callPackage, CoreFoundation, fetchFromGitHub, pkgs, wrapCDDA, attachPkgs
 , tiles ? true, Cocoa
 , debug ? false
 , useXdgDir ? false
@@ -19,11 +19,6 @@ let
       sha256 = "qhHtsm5cM0ct/7qXev0SiLInO2jqs2odxhWndLfRDIE=";
     };
 
-    passthru = common.passthru // {
-      pkgs = pkgs.override { build = self; };
-      withMods = wrapCDDA self;
-    };
-
     meta = common.meta // {
       maintainers = with lib.maintainers;
       common.meta.maintainers ++ [ skeidel ];
@@ -31,4 +26,4 @@ let
   });
 in
 
-self
+attachPkgs pkgs self