Add shell and build environment for NixOS

This commit is contained in:
Vincent Berthier 2025-02-18 22:23:42 +00:00 committed by Jeremy Soller
parent b91d42a541
commit 4573edcc16
4 changed files with 284 additions and 0 deletions

98
flake.lock Normal file
View file

@ -0,0 +1,98 @@
{
"nodes": {
"crane": {
"locked": {
"lastModified": 1739638817,
"narHash": "sha256-pPiI27T416xAAUETorkLAgHQMiLT92moOrf0ItHhtPA=",
"owner": "ipetkov",
"repo": "crane",
"rev": "bef2b45cd1273a9e621fb5292de89f4ed59ad812",
"type": "github"
},
"original": {
"owner": "ipetkov",
"repo": "crane",
"type": "github"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1739512841,
"narHash": "sha256-Zc+K4AxAwFaWKK18nSl/3TKidGf46En7bfK8SL+Revg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "fada727ee7c0bd487e311dede0a2b0725a0f7765",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"crane": "crane",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1739673031,
"narHash": "sha256-Z/GT8ebbvc4goxN4A0A5ACj26G1HaGJO+VetrPuC5Mo=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "538528d55318e0c8af1c307dcf10b7629b988fc3",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

176
flake.nix Normal file
View file

@ -0,0 +1,176 @@
# Podman needs to be installed and configured on the system for all this to work:
# https://nixos.wiki/wiki/Podman
{
description = "The Nix-flake for Redox development on NixOS";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs = {
nixpkgs.follows = "nixpkgs";
};
};
crane = {
url = "github:ipetkov/crane";
};
flake-utils.url = "github:numtide/flake-utils";
};
outputs = {
self,
nixpkgs,
flake-utils,
rust-overlay,
crane,
} @ inputs:
flake-utils.lib.eachSystem ["x86_64-linux" "aarch64-linux"] (system: let
overlays = [(import rust-overlay)];
pkgs = import nixpkgs {
inherit system overlays;
};
inherit (pkgs) lib;
rust-bin =
pkgs.rust-bin.nightly."2025-01-12".default.override
{
extensions = ["rust-analyzer" "rust-src"];
targets = ["x86_64-unknown-redox"];
};
craneLib = (inputs.crane.mkLib pkgs).overrideToolchain rust-bin;
# Podman config taken from https://nixos.wiki/wiki/Podman and https://gist.github.com/adisbladis/187204cb772800489ee3dac4acdd9947
# Provides a script that copies required files to ~/
podmanSetupScript = let
registriesConf = pkgs.writeText "registries.conf" ''
[registries.search]
registries = ['docker.io']
[registries.block]
registries = []
'';
in
pkgs.writeScript "podman-setup" ''
#!${pkgs.runtimeShell}
# Dont overwrite customised configuration
if ! test -f ~/.config/containers/policy.json; then
install -Dm555 ${pkgs.skopeo.src}/default-policy.json ~/.config/containers/policy.json
fi
if ! test -f ~/.config/containers/registries.conf; then
install -Dm555 ${registriesConf} ~/.config/containers/registries.conf
fi
systemctl --user start podman.socket || true
export PODMAN_SYSTEMD_UNIT=podman.socket
'';
# Provides a fake "docker" binary mapping to podman
dockerCompat = pkgs.runCommandNoCC "docker-podman-compat" {} ''
mkdir -p $out/bin
ln -s ${pkgs.podman}/bin/podman $out/bin/docker
'';
cargo-config =
craneLib.buildPackage
{
pname = "cargo-config";
version = "0.1.1";
cargoArtifacts = null;
src = pkgs.fetchFromGitHub {
owner = "wesleywiser";
repo = "cargo-config";
rev = "cf576faf65913615ed424914daa960800ed3ebc4";
sha256 = "sha256-HrITNTfjBppOH1MhfZHfzHc6N8ymcm7vaiBI94ctUOA=";
fetchSubmodules = true;
};
};
buildInputs = with pkgs; [
# Compilation
rust-bin
# Utils
cowsay
lolcat
tokio-console
# Cargo utilities
bacon
cargo-bloat # check binaries size (which is fun but not terriby useful?)
cargo-cache # cargo cache -a
cargo-config
cargo-expand # for macro expension
cargo-spellcheck # Spellcheck documentation
# Podman
dockerCompat
podman # Docker compat
runc # Container runtime
conmon # Container runtime monitor
skopeo # Interact with container registry
slirp4netns # User-mode networking for unprivileged namespaces
fuse-overlayfs # CoW for images, much faster than default vfs
# Build Redox
ant
autoconf
automake
bison
cmake
curl
doxygen
expat
expect
file
flex
fuse
gmp
gnumake
gnupatch
gperf
just
libjpeg
libpng
libtool
llvmPackages.clang
llvmPackages.llvm
lua
m4
meson
nasm
perl
perl540Packages.HTMLParser
perl540Packages.Po4a
pkgconf
podman
protobuf
(python3.withPackages (ps: with ps; [mako]))
qemu_kvm
rust-cbindgen
scons
SDL
syslinux
texinfo
unzip
waf
wget
xdg-utils
zip
];
in {
devShells.default = with pkgs;
mkShell {
inherit buildInputs;
LD_LIBRARY_PATH = lib.makeLibraryPath buildInputs;
NIX_SHELL_BUILD = "1";
shellHook = ''
# Install required configuration
${podmanSetupScript}
echo "Redox environment loaded" | cowsay | lolcat
'';
};
});
}

View file

@ -3,10 +3,15 @@
# Don't check for Rust/Cargo if you will be using Podman # Don't check for Rust/Cargo if you will be using Podman
ifneq ($(PODMAN_BUILD),1) ifneq ($(PODMAN_BUILD),1)
# dont check for Rust and Cargo if building on a Nix system
ifneq ($(NIX_SHELL_BUILD),1)
ifeq ($(shell which rustup),) ifeq ($(shell which rustup),)
$(error rustup not found, install from "https://rustup.rs/") $(error rustup not found, install from "https://rustup.rs/")
endif endif
endif
ifeq ($(shell which cbindgen),) ifeq ($(shell which cbindgen),)
$(error cbindgen not found, install from crates.io or from your package manager) $(error cbindgen not found, install from crates.io or from your package manager)
endif endif
@ -19,9 +24,11 @@ ifeq ($(shell which just),)
$(error 'just' not found, install from crates.io or from your package manager) $(error 'just' not found, install from crates.io or from your package manager)
endif endif
ifneq ($(NIX_SHELL_BUILD),1)
CARGO_CONFIG_VERSION=0.1.1 CARGO_CONFIG_VERSION=0.1.1
ifeq ($(shell env -u RUSTUP_TOOLCHAIN cargo install --list | grep '^cargo-config v$(CARGO_CONFIG_VERSION):$$'),) ifeq ($(shell env -u RUSTUP_TOOLCHAIN cargo install --list | grep '^cargo-config v$(CARGO_CONFIG_VERSION):$$'),)
$(error cargo-config $(CARGO_CONFIG_VERSION) not found, run "cargo install --force --version $(CARGO_CONFIG_VERSION) cargo-config") $(error cargo-config $(CARGO_CONFIG_VERSION) not found, run "cargo install --force --version $(CARGO_CONFIG_VERSION) cargo-config")
endif endif
endif
endif endif

View file

@ -16,6 +16,9 @@ else
touch $@ touch $@
endif endif
$(INSTALLER): CC =
$(INSTALLER): TARGET = $(HOST_TARGET)
$(INSTALLER): RUSTUP_TOOLCHAIN =
$(INSTALLER): installer $(INSTALLER): installer
$(HOST_CARGO) build --bin redox_installer --manifest-path installer/Cargo.toml --release $(HOST_CARGO) build --bin redox_installer --manifest-path installer/Cargo.toml --release