mirror of
https://github.com/RGBCube/crash
synced 2025-05-30 20:48:12 +00:00
Initial commit
This commit is contained in:
commit
5d7802cdfd
8 changed files with 189 additions and 0 deletions
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
*
|
||||||
|
|
||||||
|
!src/
|
||||||
|
|
||||||
|
!.gitignore
|
||||||
|
|
||||||
|
!*.lock
|
||||||
|
!*.nix
|
||||||
|
!*.zig
|
||||||
|
!*.zon
|
41
build.zig
Normal file
41
build.zig
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
pub fn build(b: *std.Build) void {
|
||||||
|
const target = b.standardTargetOptions(.{});
|
||||||
|
const optimize = b.standardOptimizeOption(.{});
|
||||||
|
|
||||||
|
const exe = b.addExecutable(.{
|
||||||
|
.name = "crash",
|
||||||
|
.root_source_file = b.path("src/main.zig"),
|
||||||
|
.target = target,
|
||||||
|
.optimize = optimize,
|
||||||
|
});
|
||||||
|
|
||||||
|
const opts = b.addOptions();
|
||||||
|
opts.addOption(?[]const u8, "fallback_shell", b.option([]const u8, "fallback_shell", "The fallback shell crash will use if it can't read the environment or the variable isn't found"));
|
||||||
|
exe.root_module.addOptions("build_options", opts);
|
||||||
|
|
||||||
|
b.installArtifact(exe);
|
||||||
|
|
||||||
|
const run_cmd = b.addRunArtifact(exe);
|
||||||
|
|
||||||
|
run_cmd.step.dependOn(b.getInstallStep());
|
||||||
|
|
||||||
|
if (b.args) |args| {
|
||||||
|
run_cmd.addArgs(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
const run_step = b.step("run", "Run the program");
|
||||||
|
run_step.dependOn(&run_cmd.step);
|
||||||
|
|
||||||
|
const exe_unit_tests = b.addTest(.{
|
||||||
|
.root_source_file = b.path("src/main.zig"),
|
||||||
|
.target = target,
|
||||||
|
.optimize = optimize,
|
||||||
|
});
|
||||||
|
|
||||||
|
const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
|
||||||
|
|
||||||
|
const test_step = b.step("test", "Run unit tests");
|
||||||
|
test_step.dependOn(&run_exe_unit_tests.step);
|
||||||
|
}
|
10
build.zig.zon
Normal file
10
build.zig.zon
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
.{
|
||||||
|
.name = "crash",
|
||||||
|
.version = "0.0.1",
|
||||||
|
|
||||||
|
.minimum_zig_version = "0.12.0",
|
||||||
|
|
||||||
|
.paths = .{
|
||||||
|
"",
|
||||||
|
},
|
||||||
|
}
|
6
build.zig.zon.nix
Normal file
6
build.zig.zon.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# generated by zon2nix (https://github.com/nix-community/zon2nix)
|
||||||
|
|
||||||
|
{ linkFarm, fetchzip }:
|
||||||
|
|
||||||
|
linkFarm "zig-packages" [
|
||||||
|
]
|
27
flake.lock
generated
Normal file
27
flake.lock
generated
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1715653339,
|
||||||
|
"narHash": "sha256-7lR9tpVXviSccl07GXI0+ve/natd24HAkuy1sQp0OlI=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "abd6d48f8c77bea7dc51beb2adfa6ed3950d2585",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
28
flake.nix
Normal file
28
flake.nix
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
description = "Crash";
|
||||||
|
|
||||||
|
nixConfig = {
|
||||||
|
extra-substituters = "https://cache.garnix.io/";
|
||||||
|
extra-trusted-public-keys = "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=";
|
||||||
|
};
|
||||||
|
|
||||||
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||||
|
|
||||||
|
outputs = { nixpkgs, ... }: with nixpkgs.lib; foldl' recursiveUpdate {} (map (system: let
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
in {
|
||||||
|
devShell.${system} = pkgs.mkShell {
|
||||||
|
packages = with pkgs; [
|
||||||
|
zig_0_12
|
||||||
|
zls
|
||||||
|
zon2nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
packages.${system} = rec {
|
||||||
|
crash = pkgs.callPackage ./package.nix {};
|
||||||
|
default = crash;
|
||||||
|
};
|
||||||
|
|
||||||
|
}) [ "x86_64-linux" "aarch64-linux" "riscv64-linux" ]);
|
||||||
|
}
|
41
package.nix
Normal file
41
package.nix
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
stdenvNoCC,
|
||||||
|
callPackage,
|
||||||
|
|
||||||
|
zig_0_12,
|
||||||
|
optimize ? "ReleaseFast",
|
||||||
|
|
||||||
|
bash,
|
||||||
|
fallbackShell ? bash,
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenvNoCC.mkDerivation {
|
||||||
|
name = "crash";
|
||||||
|
version = lib.head (lib.strings.match ''.*\.version = "([^"]*)".*'' (lib.readFile ./build.zig.zon));
|
||||||
|
|
||||||
|
src = ./.;
|
||||||
|
|
||||||
|
nativeBuildInputs = [ zig_0_12 ];
|
||||||
|
|
||||||
|
dontConfigure = true;
|
||||||
|
dontInstall = true;
|
||||||
|
|
||||||
|
preBuild = ''
|
||||||
|
mkdir -p .cache
|
||||||
|
ln -s ${callPackage ./build.zig.zon.nix {}} .cache/p
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
runHook preBuild
|
||||||
|
|
||||||
|
zig build install \
|
||||||
|
--cache-dir $(pwd)/zig-cache \
|
||||||
|
--global-cache-dir $(pwd)/.cache \
|
||||||
|
--prefix $out \
|
||||||
|
-Doptimize=${optimize} \
|
||||||
|
-Dfallback_shell=${lib.getExe fallbackShell}
|
||||||
|
|
||||||
|
runHook postBuild
|
||||||
|
'';
|
||||||
|
}
|
26
src/main.zig
Normal file
26
src/main.zig
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
const std = @import("std");
|
||||||
|
const fallback_shell = @import("build_options").fallback_shell orelse @compileError("fallback shell was not specified");
|
||||||
|
|
||||||
|
pub fn fallback(alloc: std.mem.Allocator) noreturn {
|
||||||
|
const err = std.process.execv(alloc, &[_][]const u8{fallback_shell});
|
||||||
|
std.process.exit(@intCast(@intFromError(err)));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() noreturn {
|
||||||
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||||
|
const alloc = gpa.allocator();
|
||||||
|
|
||||||
|
const shells = std.posix.getenv("SHELLS") orelse fallback(alloc);
|
||||||
|
|
||||||
|
var it = std.mem.split(u8, shells, ":");
|
||||||
|
while (it.next()) |shell| {
|
||||||
|
var child = std.process.Child.init(&[_][]const u8{shell}, alloc);
|
||||||
|
|
||||||
|
switch (child.spawnAndWait() catch fallback(alloc)) {
|
||||||
|
std.process.Child.Term.Exited => |exit_code| if (exit_code == 0) std.process.exit(0),
|
||||||
|
else => continue,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fallback(alloc);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue