--- title: callPackage TARGET DECK: Obsidian::STEM FILE TAGS: nix tags: - nix --- ## Overview We first examine `lib.makeOverridable`. It's implementation isn't too important but understanding how it's used is. We adapt the example found in [nixpkgs](https://github.com/NixOS/nixpkgs/blob/56df668386ac83c5bcddf9849c645cf0d25706d7/lib/customisation.nix#L77): ```nix nix-repl> x = {a, b}: { example = a + b; } nix-repl> y = lib.makeOverridable x { a = 1; b = 2; } nix-repl> y { override = «lambda»; overrideDerivation = «lambda»; example = 3; } nix-repl> y.override { a = 10; } { override = «lambda»; overrideDerivation = «lambda»; example = 12; } ``` `lib.makeOverridable` is an example of partial function application. Notice `y` still contains the result (`example`) of evaluating `x`. We can re-run the computation with a different value (in this case `a`) by invoking `y.override`. %%ANKI Basic What is the result of the following? ```nix x = {a, b}: { example = a + b; } lib.functionArgs x ``` Back: `{ a = false; b = false; }` Reference: Yin, Ryan. “NixOS and Flakes Book.” Nix, February 1, 2024. [https://github.com/ryan4yin/nixos-and-flakes-book](https://github.com/ryan4yin/nixos-and-flakes-book) END%% %%ANKI Basic What does each boolean returned by `lib.functionArgs` indicate? Back: Whether the associated attribute has a default value. Reference: Yin, Ryan. “NixOS and Flakes Book.” Nix, February 1, 2024. [https://github.com/ryan4yin/nixos-and-flakes-book](https://github.com/ryan4yin/nixos-and-flakes-book) END%% %%ANKI Basic What additional attributes is included in the set returned by `lib.makeOverridable`? Back: `override` and `overrideDerivation`. Reference: Yin, Ryan. “NixOS and Flakes Book.” Nix, February 1, 2024. [https://github.com/ryan4yin/nixos-and-flakes-book](https://github.com/ryan4yin/nixos-and-flakes-book) END%% %%ANKI Basic What is the value of `y.example` in the following? ```nix x = {a, b}: { example = a + b; } y = lib.makeOverridable x { a = 1; b = 2; } ``` Back: `3` Reference: Yin, Ryan. “NixOS and Flakes Book.” Nix, February 1, 2024. [https://github.com/ryan4yin/nixos-and-flakes-book](https://github.com/ryan4yin/nixos-and-flakes-book) END%% %%ANKI Basic What is the value of `(y.override { a = 10; }).example` in the following? ```nix x = {a, b}: { example = a + b; } y = lib.makeOverridable x { a = 1; b = 2; } ``` Back: `12` Reference: Yin, Ryan. “NixOS and Flakes Book.” Nix, February 1, 2024. [https://github.com/ryan4yin/nixos-and-flakes-book](https://github.com/ryan4yin/nixos-and-flakes-book) END%% Now we can understand how `pkgs.callPackage` works. The following is a simplification of the [actual implementation](https://github.com/NixOS/nixpkgs/blob/56df668386ac83c5bcddf9849c645cf0d25706d7/lib/customisation.nix#L153): ```nix callPackageWith = autoArgs: fn: args: let f = if isFunction fn then fn else import fn; fargs = functionArgs f; allArgs = intersectArgs fargs autoArgs // args; in lib.makeOverridable f allArgs callPackage = callPackageWith pkgs; ``` %%ANKI Basic What two functions is `callPackage` implemented on top of? Back: `callPackageWith` and `lib.makeOverridable`. Reference: Yin, Ryan. “NixOS and Flakes Book.” Nix, February 1, 2024. [https://github.com/ryan4yin/nixos-and-flakes-book](https://github.com/ryan4yin/nixos-and-flakes-book) END%% %%ANKI Basic What is the purpose of `callPackage`? Back: It calls package functions with arguments automatic supplied if not overridden. Reference: Yin, Ryan. “NixOS and Flakes Book.” Nix, February 1, 2024. [https://github.com/ryan4yin/nixos-and-flakes-book](https://github.com/ryan4yin/nixos-and-flakes-book) END%% %%ANKI Basic What attribute must be invoked in `callPackage`'s return value to override arguments? Back: `override` Reference: Yin, Ryan. “NixOS and Flakes Book.” Nix, February 1, 2024. [https://github.com/ryan4yin/nixos-and-flakes-book](https://github.com/ryan4yin/nixos-and-flakes-book) END%% ## Reference * Yin, Ryan. “NixOS and Flakes Book.” Nix, February 1, 2024. [https://github.com/ryan4yin/nixos-and-flakes-book](https://github.com/ryan4yin/nixos-and-flakes-book)