From 4573edcc16445b96c6ddbee3eebfb4aefa6d1d6b Mon Sep 17 00:00:00 2001 From: Vincent Berthier Date: Tue, 18 Feb 2025 22:23:42 +0000 Subject: [PATCH] Add shell and build environment for NixOS --- flake.lock | 98 ++++++++++++++++++++++++++++ flake.nix | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++ mk/depends.mk | 7 ++ mk/fstools.mk | 3 + 4 files changed, 284 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..cda9bbe --- /dev/null +++ b/flake.lock @@ -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 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..fc709cc --- /dev/null +++ b/flake.nix @@ -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 + ''; + }; + }); +} diff --git a/mk/depends.mk b/mk/depends.mk index ed80f56..68ed63b 100644 --- a/mk/depends.mk +++ b/mk/depends.mk @@ -3,10 +3,15 @@ # Don't check for Rust/Cargo if you will be using Podman ifneq ($(PODMAN_BUILD),1) +# don’t check for Rust and Cargo if building on a Nix system +ifneq ($(NIX_SHELL_BUILD),1) + ifeq ($(shell which rustup),) $(error rustup not found, install from "https://rustup.rs/") endif +endif + ifeq ($(shell which cbindgen),) $(error cbindgen not found, install from crates.io or from your package manager) endif @@ -19,9 +24,11 @@ ifeq ($(shell which just),) $(error 'just' not found, install from crates.io or from your package manager) endif +ifneq ($(NIX_SHELL_BUILD),1) CARGO_CONFIG_VERSION=0.1.1 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") endif +endif endif diff --git a/mk/fstools.mk b/mk/fstools.mk index a3acde9..31f39f5 100644 --- a/mk/fstools.mk +++ b/mk/fstools.mk @@ -16,6 +16,9 @@ else touch $@ endif +$(INSTALLER): CC = +$(INSTALLER): TARGET = $(HOST_TARGET) +$(INSTALLER): RUSTUP_TOOLCHAIN = $(INSTALLER): installer $(HOST_CARGO) build --bin redox_installer --manifest-path installer/Cargo.toml --release