From 8dc8fa38b0d17953d0d760d3ac267e154f7b1497 Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Sat, 19 Oct 2024 23:45:28 +0100 Subject: [PATCH] modules/nixpkgs: add `hostPlatform` & `buildPlatform` options --- modules/top-level/nixpkgs.nix | 46 +++++++++++++++++++++++++++++++++++ wrappers/_shared.nix | 15 +++++++++--- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/modules/top-level/nixpkgs.nix b/modules/top-level/nixpkgs.nix index 0b8151fe..3827f2d0 100644 --- a/modules/top-level/nixpkgs.nix +++ b/modules/top-level/nixpkgs.nix @@ -172,6 +172,52 @@ in ''; }; + hostPlatform = lib.mkOption { + type = with lib.types; either str attrs; + example = { + system = "aarch64-linux"; + }; + apply = lib.systems.elaborate; + defaultText = lib.literalMD '' + - Inherited from the "host" configuration's `pkgs` + - Must be specified manually when building a standalone nixvim + ''; + description = '' + Specifies the platform where the Nixvim configuration will run. + + To cross-compile, also set `nixpkgs.buildPlatform`. + + Ignored when `nixpkgs.pkgs` is set. + ''; + }; + + buildPlatform = lib.mkOption { + type = with lib.types; either str attrs; + default = cfg.hostPlatform; + example = { + system = "x86_64-linux"; + }; + apply = + value: + let + elaborated = lib.systems.elaborate value; + in + # If equivalent to `hostPlatform`, make it actually identical so that `==` can be used + # See https://github.com/NixOS/nixpkgs/issues/278001 + if lib.systems.equals elaborated cfg.hostPlatform then cfg.hostPlatform else elaborated; + defaultText = lib.literalMD '' + Inherited from the "host" configuration's `pkgs`. + Or `config.nixpkgs.hostPlatform` when building a standalone nixvim. + ''; + description = '' + Specifies the platform on which Nixvim should be built. + By default, Nixvim is built on the system where it runs, but you can change where it's built. + Setting this option will cause Nixvim to be cross-compiled. + + Ignored when `nixpkgs.pkgs` is set. + ''; + }; + # NOTE: This is a nixvim-specific option; there's no equivalent in nixos source = lib.mkOption { type = lib.types.path; diff --git a/wrappers/_shared.nix b/wrappers/_shared.nix index 33c002b6..424c4c82 100644 --- a/wrappers/_shared.nix +++ b/wrappers/_shared.nix @@ -32,11 +32,20 @@ let evalArgs // { modules = evalArgs.modules or [ ] ++ [ - # Use global packages by default in nixvim's submodule - # TODO: `useGlobalPackages` option and/or deprecate using host packages? { _file = ./_shared.nix; - nixpkgs.pkgs = lib.mkDefault pkgs; + + nixpkgs = { + # Use global packages by default in nixvim's submodule + # TODO: `useGlobalPackages` option and/or deprecate using host packages? + pkgs = lib.mkDefault pkgs; + + # Inherit platform spec + # FIXME: buildPlatform can't use option-default because it already has a default + # (it defaults to hostPlatform)... + hostPlatform = lib.mkOptionDefault pkgs.stdenv.hostPlatform; + buildPlatform = lib.mkDefault pkgs.stdenv.buildPlatform; + }; } ]; }