All checks were successful
		
		
	
	Test / Hakurei (push) Successful in 41s
				
			Test / Create distribution (push) Successful in 32s
				
			Test / Sandbox (push) Successful in 39s
				
			Test / Hpkg (push) Successful in 40s
				
			Test / Hakurei (race detector) (push) Successful in 41s
				
			Test / Sandbox (race detector) (push) Successful in 39s
				
			Test / Flake checks (push) Successful in 1m26s
				
			The vm state is discarded often, and it is quite cumbersome to set everything up again when the shell history is gone. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			257 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| {
 | |
|   description = "hakurei container tool and nixos module";
 | |
| 
 | |
|   inputs = {
 | |
|     nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
 | |
| 
 | |
|     home-manager = {
 | |
|       url = "github:nix-community/home-manager/release-25.05";
 | |
|       inputs.nixpkgs.follows = "nixpkgs";
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   outputs =
 | |
|     {
 | |
|       self,
 | |
|       nixpkgs,
 | |
|       home-manager,
 | |
|     }:
 | |
|     let
 | |
|       supportedSystems = [
 | |
|         "aarch64-linux"
 | |
|         "i686-linux"
 | |
|         "x86_64-linux"
 | |
|       ];
 | |
| 
 | |
|       forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
 | |
|       nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; });
 | |
|     in
 | |
|     {
 | |
|       nixosModules.hakurei = import ./nixos.nix self.packages;
 | |
| 
 | |
|       buildPackage = forAllSystems (
 | |
|         system:
 | |
|         nixpkgsFor.${system}.callPackage (
 | |
|           import ./cmd/hpkg/build.nix {
 | |
|             inherit
 | |
|               nixpkgsFor
 | |
|               system
 | |
|               nixpkgs
 | |
|               home-manager
 | |
|               ;
 | |
|           }
 | |
|         )
 | |
|       );
 | |
| 
 | |
|       checks = forAllSystems (
 | |
|         system:
 | |
|         let
 | |
|           pkgs = nixpkgsFor.${system};
 | |
| 
 | |
|           inherit (pkgs)
 | |
|             runCommandLocal
 | |
|             callPackage
 | |
|             nixfmt-rfc-style
 | |
|             deadnix
 | |
|             statix
 | |
|             ;
 | |
|         in
 | |
|         {
 | |
|           hakurei = callPackage ./test { inherit system self; };
 | |
|           race = callPackage ./test {
 | |
|             inherit system self;
 | |
|             withRace = true;
 | |
|           };
 | |
| 
 | |
|           sandbox = callPackage ./test/sandbox { inherit self; };
 | |
|           sandbox-race = callPackage ./test/sandbox {
 | |
|             inherit self;
 | |
|             withRace = true;
 | |
|           };
 | |
| 
 | |
|           hpkg = callPackage ./cmd/hpkg/test { inherit system self; };
 | |
| 
 | |
|           formatting = runCommandLocal "check-formatting" { nativeBuildInputs = [ nixfmt-rfc-style ]; } ''
 | |
|             cd ${./.}
 | |
| 
 | |
|             echo "running nixfmt..."
 | |
|             nixfmt --width=256 --check .
 | |
| 
 | |
|             touch $out
 | |
|           '';
 | |
| 
 | |
|           lint =
 | |
|             runCommandLocal "check-lint"
 | |
|               {
 | |
|                 nativeBuildInputs = [
 | |
|                   deadnix
 | |
|                   statix
 | |
|                 ];
 | |
|               }
 | |
|               ''
 | |
|                 cd ${./.}
 | |
| 
 | |
|                 echo "running deadnix..."
 | |
|                 deadnix --fail
 | |
| 
 | |
|                 echo "running statix..."
 | |
|                 statix check .
 | |
| 
 | |
|                 touch $out
 | |
|               '';
 | |
|         }
 | |
|       );
 | |
| 
 | |
|       packages = forAllSystems (
 | |
|         system:
 | |
|         let
 | |
|           inherit (self.packages.${system}) hakurei hsu;
 | |
|           pkgs = nixpkgsFor.${system};
 | |
|         in
 | |
|         {
 | |
|           default = hakurei;
 | |
|           hakurei = pkgs.pkgsStatic.callPackage ./package.nix {
 | |
|             inherit (pkgs)
 | |
|               # passthru.buildInputs
 | |
|               go
 | |
|               gcc
 | |
| 
 | |
|               # nativeBuildInputs
 | |
|               pkg-config
 | |
|               wayland-scanner
 | |
|               makeBinaryWrapper
 | |
| 
 | |
|               # appPackages
 | |
|               glibc
 | |
|               xdg-dbus-proxy
 | |
| 
 | |
|               # hpkg
 | |
|               zstd
 | |
|               gnutar
 | |
|               coreutils
 | |
|               ;
 | |
|           };
 | |
|           hsu = pkgs.callPackage ./cmd/hsu/package.nix { inherit (self.packages.${system}) hakurei; };
 | |
| 
 | |
|           dist = pkgs.runCommand "${hakurei.name}-dist" { buildInputs = hakurei.targetPkgs ++ [ pkgs.pkgsStatic.musl ]; } ''
 | |
|             # go requires XDG_CACHE_HOME for the build cache
 | |
|             export XDG_CACHE_HOME="$(mktemp -d)"
 | |
| 
 | |
|             # get a different workdir as go does not like /build
 | |
|             cd $(mktemp -d) \
 | |
|                 && cp -r ${hakurei.src}/. . \
 | |
|                 && chmod +w cmd && cp -r ${hsu.src}/. cmd/hsu/ \
 | |
|                 && chmod -R +w .
 | |
| 
 | |
|             export HAKUREI_VERSION="v${hakurei.version}"
 | |
|             ./dist/release.sh && mkdir $out && cp -v "dist/hakurei-$HAKUREI_VERSION.tar.gz"* $out
 | |
|           '';
 | |
|         }
 | |
|       );
 | |
| 
 | |
|       devShells = forAllSystems (
 | |
|         system:
 | |
|         let
 | |
|           inherit (self.packages.${system}) hakurei;
 | |
|           pkgs = nixpkgsFor.${system};
 | |
|         in
 | |
|         {
 | |
|           default = pkgs.mkShell { buildInputs = hakurei.targetPkgs; };
 | |
|           withPackage = pkgs.mkShell { buildInputs = [ hakurei ] ++ hakurei.targetPkgs; };
 | |
| 
 | |
|           vm =
 | |
|             let
 | |
|               nixos = nixpkgs.lib.nixosSystem {
 | |
|                 inherit system;
 | |
|                 modules = [
 | |
|                   {
 | |
|                     environment = {
 | |
|                       systemPackages = [
 | |
|                         (pkgs.buildFHSEnv {
 | |
|                           pname = "hakurei-fhs";
 | |
|                           inherit (hakurei) version;
 | |
|                           targetPkgs = _: hakurei.targetPkgs;
 | |
|                           extraOutputsToInstall = [ "dev" ];
 | |
|                           profile = ''
 | |
|                             export PKG_CONFIG_PATH="/usr/share/pkgconfig:$PKG_CONFIG_PATH"
 | |
|                           '';
 | |
|                         })
 | |
|                       ];
 | |
| 
 | |
|                       hakurei =
 | |
|                         let
 | |
|                           # this is used for interactive vm testing during development, where tests might be broken
 | |
|                           package = self.packages.${pkgs.system}.hakurei.override {
 | |
|                             buildGoModule = previousArgs: pkgs.pkgsStatic.buildGoModule (previousArgs // { doCheck = false; });
 | |
|                           };
 | |
|                         in
 | |
|                         {
 | |
|                           inherit package;
 | |
|                           hsuPackage = self.packages.${pkgs.system}.hsu.override { hakurei = package; };
 | |
|                         };
 | |
|                     };
 | |
|                   }
 | |
| 
 | |
|                   ./test/interactive/configuration.nix
 | |
|                   ./test/interactive/vm.nix
 | |
|                   ./test/interactive/hakurei.nix
 | |
|                   ./test/interactive/trace.nix
 | |
| 
 | |
|                   self.nixosModules.hakurei
 | |
|                   self.inputs.home-manager.nixosModules.home-manager
 | |
|                 ];
 | |
|               };
 | |
|             in
 | |
|             pkgs.mkShell {
 | |
|               buildInputs = [ nixos.config.system.build.vm ];
 | |
|               shellHook = "exec run-nixos-vm $@";
 | |
|             };
 | |
| 
 | |
|           generateDoc =
 | |
|             let
 | |
|               inherit (pkgs) lib;
 | |
| 
 | |
|               doc =
 | |
|                 let
 | |
|                   eval = lib.evalModules {
 | |
|                     specialArgs = {
 | |
|                       inherit pkgs;
 | |
|                     };
 | |
|                     modules = [ (import ./options.nix self.packages) ];
 | |
|                   };
 | |
|                   cleanEval = lib.filterAttrsRecursive (n: _: n != "_module") eval;
 | |
|                 in
 | |
|                 pkgs.nixosOptionsDoc { inherit (cleanEval) options; };
 | |
|               docText = pkgs.runCommand "hakurei-module-docs.md" { } ''
 | |
|                 cat ${doc.optionsCommonMark} > $out
 | |
|                 sed -i '/*Declared by:*/,+1 d' $out
 | |
|               '';
 | |
|             in
 | |
|             pkgs.mkShell {
 | |
|               shellHook = ''
 | |
|                 exec cat ${docText} > options.md
 | |
|               '';
 | |
|             };
 | |
| 
 | |
|           generateSyscallTable =
 | |
|             let
 | |
|               GOARCH = {
 | |
|                 x86_64-linux = "amd64";
 | |
|                 aarch64-linux = "arm64";
 | |
|               };
 | |
|             in
 | |
|             pkgs.mkShell {
 | |
|               shellHook = "exec ${pkgs.writeShellScript "generate-syscall-table" ''
 | |
|                 set -e
 | |
|                 ${pkgs.perl}/bin/perl \
 | |
|                   container/seccomp/mksysnum_linux.pl \
 | |
|                   ${pkgs.linuxHeaders}/include/asm/unistd_64.h | \
 | |
|                   ${pkgs.go}/bin/gofmt > \
 | |
|                   container/seccomp/syscall_linux_${GOARCH.${system}}.go
 | |
|               ''}";
 | |
|             };
 | |
|         }
 | |
|       );
 | |
|     };
 | |
| }
 |