Move the systemsConfigs key so that every entry defines its system. Determine flake attrs automatically.
This commit is contained in:
parent
5ccc6b1bba
commit
15dd869682
3 changed files with 51 additions and 10 deletions
16
flake.nix
16
flake.nix
|
|
@ -100,17 +100,11 @@
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
systemConfig = self.lib.makeSystemConfig {
|
|
||||||
inherit system;
|
|
||||||
modules = [
|
|
||||||
./nix/modules
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
packages = {
|
packages = {
|
||||||
inherit system-manager;
|
inherit system-manager;
|
||||||
default = self.packages.${system}.system-manager;
|
default = self.packages.${system}.system-manager;
|
||||||
};
|
};
|
||||||
|
|
||||||
devShells.default = pkgs.devshell.mkShell {
|
devShells.default = pkgs.devshell.mkShell {
|
||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
llvm.clang
|
llvm.clang
|
||||||
|
|
@ -174,6 +168,7 @@
|
||||||
};
|
};
|
||||||
}).shellHook;
|
}).shellHook;
|
||||||
};
|
};
|
||||||
|
|
||||||
checks = {
|
checks = {
|
||||||
inherit
|
inherit
|
||||||
# Build the crate as part of `nix flake check` for convenience
|
# Build the crate as part of `nix flake check` for convenience
|
||||||
|
|
@ -186,5 +181,12 @@
|
||||||
lib = import ./nix/lib.nix {
|
lib = import ./nix/lib.nix {
|
||||||
inherit nixpkgs self;
|
inherit nixpkgs self;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
systemConfigs.default = self.lib.makeSystemConfig {
|
||||||
|
system = flake-utils.lib.system.x86_64-linux;
|
||||||
|
modules = [
|
||||||
|
./nix/modules
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs::DirBuilder;
|
use std::fs::DirBuilder;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use std::process::ExitStatus;
|
||||||
use std::{fs, process, str};
|
use std::{fs, process, str};
|
||||||
|
|
||||||
use super::{create_store_link, StorePath, FLAKE_ATTR, GCROOT_PATH, PROFILE_DIR, PROFILE_NAME};
|
use super::{create_store_link, StorePath, FLAKE_ATTR, GCROOT_PATH, PROFILE_DIR, PROFILE_NAME};
|
||||||
|
|
@ -52,8 +53,7 @@ fn create_gcroot(gcroot_path: &str, profile_path: &Path) -> Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build(flake_uri: &str) -> Result<StorePath> {
|
pub fn build(flake_uri: &str) -> Result<StorePath> {
|
||||||
// FIXME: we should not hard-code the system here
|
let flake_attr = find_flake_attr(flake_uri)?;
|
||||||
let flake_attr = format!("{FLAKE_ATTR}.x86_64-linux");
|
|
||||||
|
|
||||||
log::info!("Building new system-manager generation...");
|
log::info!("Building new system-manager generation...");
|
||||||
log::info!("Running nix build...");
|
log::info!("Running nix build...");
|
||||||
|
|
@ -62,6 +62,34 @@ pub fn build(flake_uri: &str) -> Result<StorePath> {
|
||||||
Ok(store_path)
|
Ok(store_path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn find_flake_attr(flake_uri: &str) -> Result<String> {
|
||||||
|
let hostname = nix::unistd::gethostname()?;
|
||||||
|
let flake_attr = format!("{FLAKE_ATTR}.{}", hostname.to_string_lossy());
|
||||||
|
|
||||||
|
let status = try_flake_attr(flake_uri, &flake_attr)?;
|
||||||
|
if status {
|
||||||
|
return Ok(flake_attr);
|
||||||
|
} else {
|
||||||
|
let flake_attr = format!("{FLAKE_ATTR}.default");
|
||||||
|
let status = try_flake_attr(flake_uri, &flake_attr)?;
|
||||||
|
if status {
|
||||||
|
return Ok(flake_attr);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
anyhow::bail!("No suitable flake attribute found, giving up.");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn try_flake_attr(flake_uri: &str, flake_attr: &str) -> Result<bool> {
|
||||||
|
log::info!("Trying flake attribute: {flake_uri}#{flake_attr}...");
|
||||||
|
let status = try_nix_eval(flake_uri, flake_attr)?;
|
||||||
|
if status.success() {
|
||||||
|
log::info!("Success, using {flake_uri}#{flake_attr}");
|
||||||
|
} else {
|
||||||
|
log::info!("Attribute {flake_uri}#{flake_attr} not found in flake.");
|
||||||
|
};
|
||||||
|
Ok(status.success())
|
||||||
|
}
|
||||||
|
|
||||||
fn get_store_path(nix_build_result: process::Output) -> Result<StorePath> {
|
fn get_store_path(nix_build_result: process::Output) -> Result<StorePath> {
|
||||||
if nix_build_result.status.success() {
|
if nix_build_result.status.success() {
|
||||||
String::from_utf8(nix_build_result.stdout)
|
String::from_utf8(nix_build_result.stdout)
|
||||||
|
|
@ -103,3 +131,14 @@ fn run_nix_build(flake_uri: &str, flake_attr: &str) -> Result<process::Output> {
|
||||||
.output()?;
|
.output()?;
|
||||||
Ok(output)
|
Ok(output)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn try_nix_eval(flake_uri: &str, flake_attr: &str) -> Result<process::ExitStatus> {
|
||||||
|
let status = process::Command::new("nix")
|
||||||
|
.arg("eval")
|
||||||
|
.arg(format!("{flake_uri}#{flake_attr}"))
|
||||||
|
.arg("--json")
|
||||||
|
.stdout(process::Stdio::null())
|
||||||
|
.stderr(process::Stdio::null())
|
||||||
|
.status()?;
|
||||||
|
Ok(status)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ use std::os::unix;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::{fs, str};
|
use std::{fs, str};
|
||||||
|
|
||||||
const FLAKE_ATTR: &str = "systemConfig";
|
const FLAKE_ATTR: &str = "systemConfigs";
|
||||||
const PROFILE_DIR: &str = "/nix/var/nix/profiles/system-manager-profiles";
|
const PROFILE_DIR: &str = "/nix/var/nix/profiles/system-manager-profiles";
|
||||||
const PROFILE_NAME: &str = "system-manager";
|
const PROFILE_NAME: &str = "system-manager";
|
||||||
const GCROOT_PATH: &str = "/nix/var/nix/gcroots/system-manager-current";
|
const GCROOT_PATH: &str = "/nix/var/nix/gcroots/system-manager-current";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue