diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 94fec9dab..63c155b60 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -6,42 +6,42 @@ on:
- master
env:
- CURRENT_STABLE_CHANNEL: nixpkgs-24.11-darwin
+ NIXPKGS_BRANCH: nixpkgs-unstable
+ NIX_DARWIN_BRANCH: master
+ NIX_VERSION: 2.24.11
jobs:
- test-stable:
- runs-on: macos-13
- steps:
- - uses: actions/checkout@v4
- - name: Install nix corresponding to latest stable channel
- uses: cachix/install-nix-action@v30
- with:
- install_url: https://releases.nixos.org/nix/nix-2.18.8/install
- - run: nix flake check --override-input nixpkgs nixpkgs/${{ env.CURRENT_STABLE_CHANNEL }}
+ # The `test-stable` and `install-against-stable` job names are
+ # load‐bearing, despite their inaccuracy on the unstable branch, as
+ # they are set as required checks in the repository configuration,
+ # which only repository admins can change.
+ #
+ # TODO: Change them once the repository configuration is updated.
- test-unstable:
+ test-stable:
runs-on: macos-13
steps:
- uses: actions/checkout@v4
- - name: Install nix from current unstable channel
+ - name: Install Nix
uses: cachix/install-nix-action@v30
with:
- install_url: https://releases.nixos.org/nix/nix-2.24.9/install
- - run: nix flake check --override-input nixpkgs nixpkgs/nixpkgs-unstable
+ install_url: https://releases.nixos.org/nix/nix-${{ env.NIX_VERSION }}/install
+ - run: nix flake check --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
install-against-stable:
runs-on: macos-13
+ timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- - name: Install nix corresponding to latest stable channel
+ - name: Install Nix
uses: cachix/install-nix-action@v30
with:
- install_url: https://releases.nixos.org/nix/nix-2.18.8/install
- nix_path: nixpkgs=channel:${{ env.CURRENT_STABLE_CHANNEL }}
+ install_url: https://releases.nixos.org/nix/nix-${{ env.NIX_VERSION }}/install
+ nix_path: nixpkgs=channel:${{ env.NIXPKGS_BRANCH }}
- name: Install channels
run: |
- nix-channel --add https://github.com/LnL7/nix-darwin/archive/master.tar.gz darwin
- nix-channel --add https://nixos.org/channels/${{ env.CURRENT_STABLE_CHANNEL }} nixpkgs
+ nix-channel --add https://github.com/LnL7/nix-darwin/archive/${{ env.NIX_DARWIN_BRANCH }}.tar.gz darwin
+ nix-channel --add https://nixos.org/channels/${{ env.NIXPKGS_BRANCH }} nixpkgs
nix-channel --update
- name: Install nix-darwin
run: |
@@ -75,116 +75,20 @@ jobs:
# `cachix/install-nix-action` but not by our default config above
nix run .#darwin-uninstaller \
--extra-experimental-features "nix-command flakes" \
- --override-input nixpkgs nixpkgs/${{ env.CURRENT_STABLE_CHANNEL }}
+ --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
nix run .#darwin-uninstaller.tests.uninstaller \
--extra-experimental-features "nix-command flakes" \
- --override-input nixpkgs nixpkgs/${{ env.CURRENT_STABLE_CHANNEL }}
-
- install-against-unstable:
- runs-on: macos-13
- timeout-minutes: 30
- steps:
- - uses: actions/checkout@v4
- - name: Install nix from current unstable channel
- uses: cachix/install-nix-action@v30
- with:
- install_url: https://releases.nixos.org/nix/nix-2.24.9/install
- nix_path: nixpkgs=channel:nixpkgs-unstable
- - name: Install channels
- run: |
- nix-channel --add https://github.com/LnL7/nix-darwin/archive/master.tar.gz darwin
- nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs
- nix-channel --update
- - name: Install nix-darwin
- run: |
- export NIX_PATH=$HOME/.nix-defexpr/channels
-
- mkdir -p ~/.config/nix-darwin
- cp modules/examples/simple.nix ~/.config/nix-darwin/configuration.nix
-
- nixConfHash=$(shasum -a 256 /etc/nix/nix.conf | cut -d ' ' -f 1)
- /usr/bin/sed -i.bak \
- "s/# programs.fish.enable = true;/nix.settings.access-tokens = [ \"github.com=\${{ secrets.GITHUB_TOKEN }}\" ]; environment.etc.\"nix\/nix.conf\".knownSha256Hashes = [ \"$nixConfHash\" ];/" \
- ~/.config/nix-darwin/configuration.nix
-
- nix run .#darwin-rebuild \
- -- switch \
- -I darwin-config=$HOME/.config/nix-darwin/configuration.nix
- - name: Switch to new configuration
- run: |
- . /etc/bashrc
-
- /usr/bin/sed -i.bak \
- "s/pkgs.vim/pkgs.hello/" \
- ~/.config/nix-darwin/configuration.nix
-
- darwin-rebuild switch -I darwin=.
-
- hello
- - name: Test uninstallation of nix-darwin
- run: |
- # We need to specify `--extra-experimental-features` because `experimental-features` is set by
- # `cachix/install-nix-action` but not by our default config above
- nix run .#darwin-uninstaller \
- --extra-experimental-features "nix-command flakes" \
- --override-input nixpkgs nixpkgs/nixpkgs-unstable
- nix run .#darwin-uninstaller.tests.uninstaller \
- --extra-experimental-features "nix-command flakes" \
- --override-input nixpkgs nixpkgs/nixpkgs-unstable
-
- install-flake-against-stable:
- runs-on: macos-13
- steps:
- - uses: actions/checkout@v4
- - name: Install nix version corresponding to latest stable channel
- uses: cachix/install-nix-action@v30
- with:
- install_url: https://releases.nixos.org/nix/nix-2.18.8/install
- - name: Install nix-darwin
- run: |
- mkdir -p ~/.config/nix-darwin
- darwin=$(pwd)
- pushd ~/.config/nix-darwin
- nix flake init -t $darwin
- nixConfHash=$(shasum -a 256 /etc/nix/nix.conf | cut -d ' ' -f 1)
- /usr/bin/sed -i.bak \
- "s/# programs.fish.enable = true;/nix.settings.access-tokens = [ \"github.com=\${{ secrets.GITHUB_TOKEN }}\" ]; environment.etc.\"nix\/nix.conf\".knownSha256Hashes = [ \"$nixConfHash\" ];/" \
- flake.nix
- /usr/bin/sed -i.bak \
- 's/nixpkgs.hostPlatform = "aarch64-darwin";/nixpkgs.hostPlatform = "'$(nix eval --expr builtins.currentSystem --impure --raw)'";/' \
- flake.nix
- popd
- nix run .#darwin-rebuild -- \
- switch --flake ~/.config/nix-darwin#simple \
- --override-input nix-darwin . \
- --override-input nixpkgs nixpkgs/${{ env.CURRENT_STABLE_CHANNEL }}
- - name: Switch to new configuration
- run: |
- . /etc/bashrc
-
- /usr/bin/sed -i.bak \
- "s/pkgs.vim/pkgs.hello/" \
- ~/.config/nix-darwin/flake.nix
-
- darwin-rebuild switch --flake ~/.config/nix-darwin#simple \
- --override-input nix-darwin . \
- --override-input nixpkgs nixpkgs/${{ env.CURRENT_STABLE_CHANNEL }}
-
- hello
- - name: Test uninstallation of nix-darwin
- run: |
- nix run .#darwin-uninstaller --override-input nixpkgs nixpkgs/${{ env.CURRENT_STABLE_CHANNEL }}
- nix run .#darwin-uninstaller.tests.uninstaller --override-input nixpkgs nixpkgs/${{ env.CURRENT_STABLE_CHANNEL }}
+ --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
- install-flake-against-unstable:
+ install-flake:
runs-on: macos-13
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- - name: Install nix from current unstable channel
+ - name: Install Nix
uses: cachix/install-nix-action@v30
with:
- install_url: https://releases.nixos.org/nix/nix-2.24.9/install
+ install_url: https://releases.nixos.org/nix/nix-${{ env.NIX_VERSION }}/install
- name: Install nix-darwin
run: |
mkdir -p ~/.config/nix-darwin
@@ -202,7 +106,7 @@ jobs:
nix run .#darwin-rebuild -- \
switch --flake ~/.config/nix-darwin#simple \
--override-input nix-darwin . \
- --override-input nixpkgs nixpkgs/nixpkgs-unstable
+ --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
- name: Switch to new configuration
run: |
. /etc/bashrc
@@ -213,10 +117,10 @@ jobs:
darwin-rebuild switch --flake ~/.config/nix-darwin#simple \
--override-input nix-darwin . \
- --override-input nixpkgs nixpkgs/nixpkgs-unstable
+ --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
hello
- name: Test uninstallation of nix-darwin
run: |
- nix run .#darwin-uninstaller --override-input nixpkgs nixpkgs/nixpkgs-unstable
- nix run .#darwin-uninstaller.tests.uninstaller --override-input nixpkgs nixpkgs/nixpkgs-unstable
+ nix run .#darwin-uninstaller --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
+ nix run .#darwin-uninstaller.tests.uninstaller --override-input nixpkgs nixpkgs/${{ env.NIXPKGS_BRANCH }}
diff --git a/README.md b/README.md
index ba9fa7797..97200d69c 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,12 @@ If you don't have an existing `configuration.nix`, you can run the following com
```bash
mkdir -p ~/.config/nix-darwin
cd ~/.config/nix-darwin
-nix flake init -t nix-darwin
+
+# To use Nixpkgs unstable:
+nix flake init -t nix-darwin/master
+# To use Nixpkgs 24.11:
+nix flake init -t nix-darwin/nix-darwin-24.11
+
sed -i '' "s/simple/$(scutil --get LocalHostName)/" flake.nix
```
@@ -57,8 +62,10 @@ Add the following to `flake.nix` in the same folder as `configuration.nix`:
description = "John's darwin system";
inputs = {
- nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-24.11-darwin";
- nix-darwin.url = "github:LnL7/nix-darwin";
+ # Use `github:NixOS/nixpkgs/nixpkgs-24.11-darwin` to use Nixpkgs 24.11.
+ nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
+ # Use `github:LnL7/nix-darwin/nix-darwin-24.11` to use Nixpkgs 24.11.
+ nix-darwin.url = "github:LnL7/nix-darwin/master";
nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
};
@@ -122,8 +129,12 @@ Copy the [simple](./modules/examples/simple.nix) example to `~/.config/nix-darwi
### Step 2. Adding `nix-darwin` channel
```bash
-nix-channel --add https://github.com/LnL7/nix-darwin/archive/master.tar.gz darwin
-nix-channel --update
+# If you use Nixpkgs unstable (the default):
+sudo nix-channel --add https://github.com/LnL7/nix-darwin/archive/master.tar.gz darwin
+# If you use Nixpkgs 24.11:
+sudo nix-channel --add https://github.com/LnL7/nix-darwin/archive/nix-darwin-24.11.tar.gz darwin
+
+sudo nix-channel --update
```
### Step 3. Installing `nix-darwin`
@@ -131,7 +142,11 @@ nix-channel --update
To install `nix-darwin`, you can just run `darwin-rebuild switch` to install nix-darwin. As `darwin-rebuild` won't be installed in your `PATH` yet, you can use the following command:
```bash
+# If you use Nixpkgs unstable (the default):
nix-build https://github.com/LnL7/nix-darwin/archive/master.tar.gz -A darwin-rebuild
+# If you use Nixpkgs 24.11:
+nix-build https://github.com/LnL7/nix-darwin/archive/nix-darwin-24.11.tar.gz -A darwin-rebuild
+
./result/bin/darwin-rebuild switch -I darwin-config=$HOME/.config/nix-darwin/configuration.nix
```
@@ -145,10 +160,10 @@ darwin-rebuild switch
### Step 5. Updating `nix-darwin`
-You can update `nix-darwin` using the following command:
+You can update Nixpkgs and `nix-darwin` using the following command:
```bash
-nix-channel --update darwin
+sudo nix-channel --update
```
diff --git a/eval-config.nix b/eval-config.nix
index cd14493d0..5014c6c9e 100644
--- a/eval-config.nix
+++ b/eval-config.nix
@@ -1,10 +1,72 @@
+let
+ nixDarwinVersion = builtins.fromJSON (builtins.readFile ./version.json);
+
+ checkRelease = lib:
+ # Avoid breaking configurations when the unstable Nixpkgs version
+ # rolls over.
+ #
+ # TODO: Something more refined than this would be ideal, as this
+ # still means you could be using unstable nix-darwin 25.05 with
+ # Nixpkgs 26.05, which would be unfortunate.
+ if nixDarwinVersion.isReleaseBranch then
+ lib.trivial.release == nixDarwinVersion.release
+ else
+ lib.versionAtLeast lib.trivial.release nixDarwinVersion.release;
+in
+
{ lib
, modules
, baseModules ? import ./modules/module-list.nix
, specialArgs ? { }
, check ? true
+, enableNixpkgsReleaseCheck ? true
}@args:
+assert enableNixpkgsReleaseCheck -> checkRelease lib || throw ''
+
+ nix-darwin now uses release branches that correspond to Nixpkgs releases.
+ The nix-darwin and Nixpkgs branches in use must match, but you are currently
+ using nix-darwin ${nixDarwinVersion.release} with Nixpkgs ${lib.trivial.release}.
+
+ On macOS, you should use either the `nixpkgs-unstable` or
+ `nixpkgs-YY.MM-darwin` branches of Nixpkgs. These correspond to the
+ `master` and `nix-darwin-YY.MM` branches of nix-darwin, respectively. Check
+ for the currently supported Nixpkgs releases.
+
+ If you’re using flakes, make sure your inputs look like this:
+
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/NIXPKGS-BRANCH";
+ nix-darwin.url = "github:LnL7/nix-darwin/NIX-DARWIN-BRANCH";
+ nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
+ # …
+ };
+
+ If you’re using channels, you can check your current channels with:
+
+ $ sudo nix-channel --list
+ nixpkgs https://nixos.org/channels/NIXPKGS-BRANCH
+ darwin https://github.com/LnL7/nix-darwin/archive/NIX-DARWIN-BRANCH.tar.gz
+ …
+ $ nix-channel --list
+ …
+
+ If `darwin` or `nixpkgs` are present in `nix-channel --list` (without
+ `sudo`), you should delete them with `nix-channel --remove NAME`. These can
+ contribute to version mismatch problems.
+
+ You can then fix your channels like this:
+
+ $ sudo nix-channel --add https://nixos.org/channels/NIXPKGS-BRANCH nixpkgs
+ $ sudo nix-channel --add https://github.com/LnL7/nix-darwin/archive/NIX-DARWIN-BRANCH.tar.gz darwin
+ $ sudo nix-channel --update
+
+ After that, activating your system again should work correctly. If it
+ doesn’t, please open an issue at
+ and include as much
+ information as possible.
+'';
+
let
argsModule = {
_file = ./eval-config.nix;
diff --git a/flake.lock b/flake.lock
index 3ce8eac68..0f05e93e0 100644
--- a/flake.lock
+++ b/flake.lock
@@ -2,16 +2,18 @@
"nodes": {
"nixpkgs": {
"locked": {
- "lastModified": 1718149104,
- "narHash": "sha256-Ds1QpobBX2yoUDx9ZruqVGJ/uQPgcXoYuobBguyKEh8=",
+ "lastModified": 1736241350,
+ "narHash": "sha256-CHd7yhaDigUuJyDeX0SADbTM9FXfiWaeNyY34FL1wQU=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "e913ae340076bbb73d9f4d3d065c2bca7caafb16",
+ "rev": "8c9fd3e564728e90829ee7dbac6edc972971cd0f",
"type": "github"
},
"original": {
- "id": "nixpkgs",
- "type": "indirect"
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
}
},
"root": {
diff --git a/flake.nix b/flake.nix
index 2c1ae1b26..92569fa93 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,6 +1,10 @@
{
description = "A collection of darwin modules";
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
+ };
+
outputs = { self, nixpkgs }: let
forAllSystems = nixpkgs.lib.genAttrs [ "aarch64-darwin" "x86_64-darwin" "aarch64-linux" "x86_64-linux" ];
forDarwinSystems = nixpkgs.lib.genAttrs [ "aarch64-darwin" "x86_64-darwin" ];
diff --git a/modules/examples/flake/flake.nix b/modules/examples/flake/flake.nix
index 4520b8ff0..138c04738 100644
--- a/modules/examples/flake/flake.nix
+++ b/modules/examples/flake/flake.nix
@@ -3,7 +3,7 @@
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
- nix-darwin.url = "github:LnL7/nix-darwin";
+ nix-darwin.url = "github:LnL7/nix-darwin/master";
nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
};
diff --git a/modules/system/checks.nix b/modules/system/checks.nix
index 57ddfd277..a5fd44a81 100644
--- a/modules/system/checks.nix
+++ b/modules/system/checks.nix
@@ -211,8 +211,8 @@ let
if ! test -e "$darwinPath"; then
echo "[1;31merror: Changed but target does not exist, aborting activation[0m" >&2
echo "Add the darwin repo as a channel or set nix.nixPath:" >&2
- echo "$ nix-channel --add https://github.com/LnL7/nix-darwin/archive/master.tar.gz darwin" >&2
- echo "$ nix-channel --update" >&2
+ echo "$ sudo nix-channel --add https://github.com/LnL7/nix-darwin/archive/master.tar.gz darwin" >&2
+ echo "$ sudo nix-channel --update" >&2
echo >&2
echo "or set" >&2
echo >&2
@@ -225,8 +225,8 @@ let
if ! test -e "$nixpkgsPath"; then
echo "[1;31merror: Changed but target does not exist, aborting activation[0m" >&2
echo "Add a nixpkgs channel or set nix.nixPath:" >&2
- echo "$ nix-channel --add http://nixos.org/channels/nixpkgs-unstable nixpkgs" >&2
- echo "$ nix-channel --update" >&2
+ echo "$ sudo nix-channel --add http://nixos.org/channels/nixpkgs-unstable nixpkgs" >&2
+ echo "$ sudo nix-channel --update" >&2
echo >&2
echo "or set" >&2
echo >&2
diff --git a/modules/system/version.nix b/modules/system/version.nix
index 826ad3520..54829d1d8 100644
--- a/modules/system/version.nix
+++ b/modules/system/version.nix
@@ -59,11 +59,18 @@ in
description = "Label to be used in the names of generated outputs.";
};
+ system.darwinRelease = mkOption {
+ readOnly = true;
+ type = types.str;
+ default = (lib.importJSON ../../version.json).release;
+ description = "The nix-darwin release (e.g. `24.11`).";
+ };
+
system.darwinVersion = mkOption {
internal = true;
type = types.str;
- default = "darwin${toString cfg.stateVersion}${cfg.darwinVersionSuffix}";
- description = "The full darwin version (e.g. `darwin4.2abdb5a`).";
+ default = cfg.darwinRelease + cfg.darwinVersionSuffix;
+ description = "The full nix-darwin version (e.g. `24.11.2abdb5a`).";
};
system.darwinVersionSuffix = mkOption {
@@ -72,7 +79,7 @@ in
default = if cfg.darwinRevision != null
then ".${substring 0 7 cfg.darwinRevision}"
else "";
- description = "The short darwin version suffix (e.g. `.2abdb5a`).";
+ description = "The short nix-darwin version suffix (e.g. `.2abdb5a`).";
};
system.darwinRevision = mkOption {
@@ -86,14 +93,15 @@ in
readOnly = true;
type = types.str;
default = lib.trivial.release;
- description = "The nixpkgs release (e.g. `16.03`).";
+ description = "The nixpkgs release (e.g. `24.11`).";
};
+ # TODO: Shouldn’t mismatch the Darwin release, rethink all this…
system.nixpkgsVersion = mkOption {
internal = true;
type = types.str;
default = cfg.nixpkgsRelease + cfg.nixpkgsVersionSuffix;
- description = "The full nixpkgs version (e.g. `16.03.1160.f2d4ee1`).";
+ description = "The full nixpkgs version (e.g. `24.11.1160.f2d4ee1`).";
};
system.nixpkgsVersionSuffix = mkOption {
@@ -124,7 +132,7 @@ in
config = {
# This default is set here rather than up there so that the options
# documentation is not reprocessed on every commit
- system.darwinLabel = mkDefault "${cfg.nixpkgsVersion}+${cfg.darwinVersion}";
+ system.darwinLabel = mkDefault cfg.darwinVersion;
assertions = [
{
diff --git a/version.json b/version.json
new file mode 100644
index 000000000..1d2863a09
--- /dev/null
+++ b/version.json
@@ -0,0 +1,4 @@
+{
+ "release": "25.05",
+ "isReleaseBranch": false
+}