commit a4bf6536046f634420e09cb06a36e38225601a7b Author: Mikael Voss Date: Sun Jul 21 16:55:31 2024 +0200 Initial import diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b8b578 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Hidden files +.* +!.git* + +# Nix +/result diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..4913bc6 --- /dev/null +++ b/flake.lock @@ -0,0 +1,48 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1721562059, + "narHash": "sha256-Tybxt65eyOARf285hMHIJ2uul8SULjFZbT9ZaEeUnP8=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "68c9ed8bbed9dfce253cc91560bf9043297ef2fe", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1721810656, + "narHash": "sha256-33UCMmgPL+sz06+iupNkl99hcBABP56ENcxSoKqr0TY=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "a6afdaab4a47d6ecf647a74968e92a51c4a18e5a", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..b5d7d89 --- /dev/null +++ b/flake.nix @@ -0,0 +1,71 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + nixConfig = { + extra-substituters = [ "https://cache.kyouma.net" ]; + extra-trusted-public-keys = [ "cache.kyouma.net:Frjwu4q1rnwE/MnSTmX9yx86GNA/z3p/oElGvucLiZg=" ]; + }; + + outputs = { self, nixpkgs, rust-overlay, ... }@inputs: + let + inherit (builtins) mapAttrs; + inherit (nixpkgs) lib; + + platforms = mapAttrs + (name: platform: lib.systems.elaborate platform) + (import ./platforms.nix); + in { + lib = { inherit platforms; }; + overlays.default = import ./overlay.nix inputs; + + nixosModules.default = { ... }: { + nixpkgs = { + overlays = [ self.overlays.default rust-overlay.overlays.default ]; + config = { + allowUnsupportedSystem = true; + replaceStdenv = + { pkgs }: pkgs.idiosyn pkgs.stdenv; + replaceCrossStdenv = + { buildPackages, baseStdenv }: buildPackages.idiosyn baseStdenv; + }; + }; + + imports = [ ./module.nix ]; + }; + + legacyPackages = mapAttrs (system: platform: + import nixpkgs { + localSystem = builtins.currentSystem or system; + crossSystem = platform; + overlays = [ self.overlays.default rust-overlay.overlays.default ]; + config = { + allowUnsupportedSystem = true; + replaceStdenv = + { pkgs }: pkgs.idiosyn pkgs.stdenv; + replaceCrossStdenv = + { buildPackages, baseStdenv }: buildPackages.idiosyn baseStdenv; + }; + }) platforms; + + nixosConfigurations = mapAttrs (system: platform: lib.nixosSystem { + modules = [ + self.nixosModules.default + ./nixos.nix { + nixpkgs.buildPlatform = builtins.currentSystem or system; + nixpkgs.hostPlatform = platform; + } + ]; + }) platforms; + + hydraJobs = { + stdenv = mapAttrs (system: pkgs: pkgs.stdenv) self.legacyPackages; + nixos = mapAttrs (name: host: host.config.system.build.toplevel) self.nixosConfigurations; + }; + }; +} diff --git a/module.nix b/module.nix new file mode 100644 index 0000000..28495a7 --- /dev/null +++ b/module.nix @@ -0,0 +1,34 @@ +{ config, lib, pkgs, modulesPath, ... }: +let + inherit (pkgs.stdenv) hostPlatform; + locale-archive-stub = + pkgs.stdenvNoCC.mkDerivation { + pname = "locale-archive-stub"; + version = "0"; + + buildCommand = '' + mkdir -p "$out/lib/locale" + touch "$out/lib/locale/locale-archive" + ''; + }; +in { + disabledModules = [ + (modulesPath + "/config/ldso.nix") + (modulesPath + "/config/stub-ld.nix") + (modulesPath + "/programs/nix-ld.nix") + ]; + + config = lib.mkMerge [ + (lib.mkIf hostPlatform.isMusl { + i18n.glibcLocales = lib.mkDefault locale-archive-stub; + i18n.supportedLocales = lib.mkDefault [ ]; + + programs.command-not-found.enable = lib.mkDefault false; + programs.less.lessopen = lib.mkDefault null; + + security.pam.services.login.updateWtmp = lib.mkForce false; + services.nscd.enable = lib.mkForce false; + system.nssModules = lib.mkForce [ ]; + }) + ]; +} diff --git a/nixos.nix b/nixos.nix new file mode 100644 index 0000000..1cfb7e6 --- /dev/null +++ b/nixos.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: { + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + fileSystems."/".label = "nixos"; + + security.sudo.wheelNeedsPassword = false; + services.getty.autologinUser = "nixos"; + + users.users.nixos = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + }; + + system.stateVersion = "24.11"; + + virtualisation.vmVariant.virtualisation.diskImage = null; +} diff --git a/overlay.nix b/overlay.nix new file mode 100644 index 0000000..e0476f5 --- /dev/null +++ b/overlay.nix @@ -0,0 +1,46 @@ +{ nixpkgs, ... }: final: prev: +let + inherit (final) lib callPackage; + + pkgs = import nixpkgs { + localSystem = final.buildPlatform; + crossSystem = final.hostPlatform; + config = removeAttrs final.config [ + "replaceStdenv" + "replaceCrossStdenv" + ]; + }; + + idiosyn = import ./stdenv.nix pkgs; + + gentoo-patches = final.fetchgit { + url = "https://anongit.gentoo.org/git/repo/gentoo.git"; + rev = "fa77d52a7ff39464c50707ca024725deab08b534"; + sparseCheckout = [ "*.patch" ]; + nonConeMode = true; + hash = "sha256-ZTrPeo8TjKSDAUyeJyWq1C8O9EXd9uhClHlphPsFXCA="; + }; +in { + inherit idiosyn; + + busybox = prev.busybox.overrideAttrs (base: { + makeFlags = base.makeFlags + ++ [ "CC=${final.buildPackages.gcc}/bin/${final.stdenv.cc.targetPrefix}cc" ]; + }); + + libgcrypt = prev.libgcrypt.overrideAttrs (base: { + configureFlags = base.configureFlags or [ ] + ++ [ "--disable-jent-support" ]; + }); + + rustc = if final.buildPlatform != final.hostPlatform + then final.rust-bin.stable.latest.default.passthru.availableComponents.rustc + else prev.rustc; + + time = prev.time.overrideAttrs (base: { + patches = base.patches or [ ] + ++ lib.optional final.time.stdenv.cc.isClang + "${gentoo-patches}/sys-process/time/files/time-1.9-implicit-func-decl-clang.patch"; + }); +} + diff --git a/platforms.nix b/platforms.nix new file mode 100644 index 0000000..56bc4a7 --- /dev/null +++ b/platforms.nix @@ -0,0 +1,23 @@ +{ + "x86_64-linux" = { + system = "x86_64-linux"; + #config = "x86_64-unknown-linux-musl"; + gcc.arch = "x86-64-v3"; + useLLVM = true; + linker = "lld"; + }; + "aarch64-linux" = { + system = "aarch64-linux"; + #config = "aarch64-unknown-linux-musl"; + gcc.arch = "armv8.2-a"; + useLLVM = true; + linker = "lld"; + }; + "riscv64-linux" = { + system = "aarch64-linux"; + #config = "riscv64-unknown-linux-musl"; + gcc.arch = "rv64imafdc_zicsr_zba_zbb"; + useLLVM = true; + linker = "lld"; + }; +} diff --git a/stdenv.nix b/stdenv.nix new file mode 100644 index 0000000..addd95b --- /dev/null +++ b/stdenv.nix @@ -0,0 +1,53 @@ +pkgs: stdenv: +let + inherit (pkgs) addAttrsToDerivation; + inherit (pkgs.lib) optionalAttrs optionals toList; + inherit (stdenv) buildPlatform hostPlatform; + + cflagsC = [ + "-pipe" # Prefer pipes over temporary files between stages + "-O2" + ] ++ optionals buildPlatform.useLLVM [ + "-flto=thin" + ]; + + ldflags = [ + "-O2" # Enable tail merging of strings + "--hash-style=gnu" # Produce only DT_GNU_HASH + ] ++ optionals buildPlatform.useLLVM [ + "--icf=safe" # Fold identical code where safe + "--lto-O2" + "--pack-dyn-relocs=relr" + ]; + + cflagsL = map (flag: "-Wl,${flag}") ldflags; + + rustflags = [ + "-C opt-level=2" + ] ++ optionals buildPlatform.useLLVM [ + "-C lto=thin" + "-C linker-plugin-lto" + ] ++ optionals (hostPlatform.isx86_64 && hostPlatform ? gcc.arch) [ + "-C target-cpu=${hostPlatform.gcc.arch}" + ] ++ map (flag: "-C link-arg=${flag}") ldflags; + +in addAttrsToDerivation (base: { + env = (base.env or { }) // optionalAttrs (!base ? NIX_CFLAGS_COMPILE) { + NIX_CFLAGS_COMPILE = + toString (toList base.env.NIX_CFLAGS_COMPILE or [ ] ++ cflagsC); + } // optionalAttrs (base ? env.NIX_CFLAGS_LINK) { + NIX_CFLAGS_LINK = + toString (toList base.NIX_CFLAGS_LINK or [ ] ++ cflagsL); + } // optionalAttrs (base ? env.NIX_LDFLAGS) { + NIX_LDFLAGS = + toString (toList base.env.NIX_LDFLAGS or [ ] ++ ldflags); + }; + + NIX_RUSTFLAGS = toList base.NIX_RUSTFLAGS or [ ] ++ rustflags; +} // optionalAttrs (base ? env.NIX_CFLAGS) { + NIX_CFLAGS_COMPILE = toList base.NIX_CFLAGS_COMPILE or [ ] ++ cflagsC; +} // optionalAttrs (!base ? env.NIX_CFLAGS_LINK) { + NIX_CFLAGS_LINK = toList base.NIX_CFLAGS_LINK or [ ] ++ cflagsL; +} // optionalAttrs (!base ? env.NIX_LDFLAGS) { + NIX_LDFLAGS = toList base.NIX_LDFLAGS or [ ] ++ ldflags; +}) stdenv