Skip to content

Darwin support#1

Merged
ethancedwards8 merged 6 commits into
exa-labs:exafrom
zw3rk:darwin-support
Jul 10, 2026
Merged

Darwin support#1
ethancedwards8 merged 6 commits into
exa-labs:exafrom
zw3rk:darwin-support

Conversation

@ethancedwards8

@ethancedwards8 ethancedwards8 commented Jul 10, 2026

Copy link
Copy Markdown

angerman and others added 6 commits July 1, 2026 06:53
Add support for deploying to macOS machines using nix-darwin.

Changes:
- Add SystemType enum (NixOS vs Darwin) in mod.rs
- Add evalDarwinNode in eval.nix using nix-darwin's darwinSystem
- Add darwinDefaults support for darwin-specific defaults
- Auto-detect darwin nodes from flake's darwinConfigurations
- Add deployment.systemType option for explicit system type
- Handle darwin-specific profile activation commands
- Fix macOS PATH issues for root user:
  - Add DARWIN_NIX_BIN_PATH constant (/nix/var/nix/profiles/default/bin)
  - Use remote-program parameter for ssh-ng:// nix-daemon
  - Use full path for nix-env during profile activation

Usage in flake.nix:
  colmena = {
    meta.nix-darwin = inputs.darwin;  # Required for darwin nodes

    my-mac = {
      deployment.systemType = "darwin";
      deployment.targetHost = "my-mac.local";
      # ... darwin configuration
    };
  };
Fix two issues causing CI failures in PR nix-community#319:

1. Code formatting: Run rustfmt to fix formatting in host module and
   profile.rs where multi-parameter function signatures weren't split
   across lines per Rust style guidelines.

2. Test compilation: Add missing system_type field to NodeConfig in
   node_filter.rs test code. The field was added as part of the darwin
   support feature but the test template wasn't updated accordingly.
realize_remote() called nix-store without a full path, which fails
on macOS when connecting as root since /nix/var/nix/profiles/default/bin
is not in root's PATH. Use DARWIN_NIX_BIN_PATH for nix-store on darwin,
matching the existing pattern for nix-env in activate().
Remove the #[cfg(target_os = "linux")] gate that prevented apply-local
from compiling on macOS. Replace the NixOS-only /etc/os-release check
with a platform-aware guard: macOS is accepted directly (for
nix-darwin), Linux still validates NixOS via os-release.
Add tests for:
- systemType defaults to NixOS
- systemType parses "darwin" correctly
- darwin systemType is accepted as valid config
Addresses issues found while reviewing the nix-darwin support. No change to
existing NixOS deployments.

Correctness:
* systemType detection now reads `deployment.systemType` through the module
  system, so function-form node modules (not just attrsets) are routed to the
  darwin evaluator; the `meta.nix-darwin` assertion is now actually forced (it
  was bound to an unreferenced `let` and never ran).
* apply-local ran `nix-store`/`nix-env` by bare name, which fails on macOS under
  sudo's `secure_path`; resolve them to an absolute path when the local machine
  is macOS. `DARWIN_NIX_BIN_PATH` is hoisted to a shared const.
* `readlink -e` (GNU-only) errors on BSD/macOS targets; use `readlink -f` with an
  `[ -e … ]` guard that preserves the CURRENT_PROFILE fallback on both.
* Non-flake darwin copies used legacy `nix-copy-closure` (relies on the remote
  PATH); force the ssh-ng `nix copy` path for darwin.

Cleanup:
* Remove dead `Profile::from_store_path_with_type` (can't be wired in — its local
  `exists()` checks would break `buildOnTarget`) and the now-unused
  `InvalidProfile`, `SystemType::is_nixos()`, and `RebootOptions::get_system_type()`.
* Add `remote_nix_bin`/`local_nix_bin` helpers; factor eval.nix's duplicated
  `specialArgs`/nixpkgs selection into `mkSpecialArgs`/`npkgsFor`; drop redundant
  Nix (`or {}`, `nullOr`, unused arg); tighten visibility; tidy darwin tests.
@ethancedwards8
ethancedwards8 merged commit 206a90e into exa-labs:exa Jul 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants