feat: added zig loaders for unix and refactor

This commit is contained in:
Andrew Rioux 2025-01-21 00:41:42 -05:00
parent 5ee8802607
commit 489b1d380f
Signed by: andrew.rioux
GPG Key ID: 9B8BAC47C17ABB94
15 changed files with 225 additions and 21 deletions

3
.gitignore vendored
View File

@ -2,3 +2,6 @@
.direnv .direnv
/result /result
.sass-cache .sass-cache
zig-out
.zig-cache
freebsd.txt

View File

@ -35,8 +35,6 @@
url = "https://download.freebsd.org/releases/amd64/14.1-RELEASE/base.txz"; url = "https://download.freebsd.org/releases/amd64/14.1-RELEASE/base.txz";
flake = false; flake = false;
}; };
# command for later:
# echo '000007: 09' | xxd -r - target/x86_64-unknown-freebsd/debug/sparse-beacon
}; };
outputs = { self, nixpkgs, flake-utils, crane, rust-overlay, advisory-db outputs = { self, nixpkgs, flake-utils, crane, rust-overlay, advisory-db
@ -54,7 +52,7 @@
freebsd-libs-packed; freebsd-libs-packed;
}; };
inherit (system-libs) inherit (system-libs)
bsd-toolchain winpcap-drivers freebsd-libs libnl libpcap-linux-gnu freebsd-toolchain winpcap-drivers freebsd-libs libnl libpcap-linux-gnu
libpcap-linux-musl libpcap-freebsd; libpcap-linux-musl libpcap-freebsd;
buildTools = with pkgs; [ buildTools = with pkgs; [
@ -77,10 +75,13 @@
]; ];
devShellTools = with pkgs; [ devShellTools = with pkgs; [
# Language servers
rust-analyzer rust-analyzer
zls
# Cargo lint tools
taplo taplo
cargo-deny cargo-deny
cargo-generate
]; ];
craneLib = (crane.mkLib pkgs).overrideToolchain (p: craneLib = (crane.mkLib pkgs).overrideToolchain (p:
@ -111,6 +112,10 @@
inherit pkgs buildTools buildEnvironment craneLib advisory-db inherit pkgs buildTools buildEnvironment craneLib advisory-db
winpcap-libs; winpcap-libs;
} // system-libs); } // system-libs);
setup-zig-freebsd = pkgs.writeScriptBin "setup-zig-freebsd" ''
cp ${outputs.packages.freebsd-zig-libc} $(${pkgs.git}/bin/git rev-parse --show-toplevel)/unix-loader/freebsd.txt
'';
in { in {
packages = outputs.packages; packages = outputs.packages;
checks = outputs.checks; checks = outputs.checks;
@ -119,7 +124,7 @@
default = craneLib.devShell (buildEnvironment // { default = craneLib.devShell (buildEnvironment // {
name = "sparse-default"; name = "sparse-default";
packages = buildTools ++ devShellTools; packages = buildTools ++ devShellTools ++ [ setup-zig-freebsd ];
}); });
}; };
}); });

View File

@ -19,6 +19,15 @@ let
}; };
patch-freebsd-elf = patch-elf 9; patch-freebsd-elf = patch-elf 9;
freebsd-zig-libc = pkgs.writeText "freebsd-libc.txt" ''
include_dir=${freebsd-libs}/usr/include
sys_include_dir=${freebsd-libs}/usr/include
sys_include_dir=${freebsd-libs}/usr/lib
msvc_lib_dir=
kernel32_lib_dir=
gcc_dir=
'';
src = craneLib.cleanCargoSource ./.; src = craneLib.cleanCargoSource ./.;
commonArgs = buildEnvironment // { commonArgs = buildEnvironment // {
@ -45,6 +54,22 @@ let
]; ];
}; };
fileSetForInstallerCrate = pkgs.lib.fileset.toSource {
root = ./.;
fileset = pkgs.lib.fileset.unions [
./.cargo/config.toml
./Cargo.toml
./Cargo.lock
./build_common.rs
(craneLib.fileset.commonCargoSources ./sparse-actions)
(craneLib.fileset.commonCargoSources ./pcap-sys)
(craneLib.fileset.commonCargoSources ./nl-sys)
./nl-sys/src/bridge.c
(craneLib.fileset.commonCargoSources ./packets)
(craneLib.fileset.commonCargoSources ./sparse-installer)
];
};
fileSetForWebCrate = pkgs.lib.fileset.toSource { fileSetForWebCrate = pkgs.lib.fileset.toSource {
root = ./.; root = ./.;
fileset = pkgs.lib.fileset.unions [ fileset = pkgs.lib.fileset.unions [
@ -97,7 +122,7 @@ let
sparse-beacon-linux = craneLib.buildPackage (commonArgs // { sparse-beacon-linux = craneLib.buildPackage (commonArgs // {
cargoArtifacts = linuxCargoArtifacts; cargoArtifacts = linuxCargoArtifacts;
name = "sparse-beacon-linux"; name = "sparse-beacon-linux";
cargoExtraArgs = "-p sparse-beacon"; cargoExtraArgs = "-p sparse-unix-beacon";
src = fileSetForBeaconCrate; src = fileSetForBeaconCrate;
CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl"; CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl";
@ -107,7 +132,7 @@ let
sparse-beacon-freebsd-sysv = craneLib.buildPackage (freebsdArgs // { sparse-beacon-freebsd-sysv = craneLib.buildPackage (freebsdArgs // {
cargoArtifacts = freebsdCargoArtifacts; cargoArtifacts = freebsdCargoArtifacts;
name = "sparse-beacon-freebsd"; name = "sparse-beacon-freebsd";
cargoExtraArgs = "-p sparse-beacon"; cargoExtraArgs = "-p sparse-unix-beacon";
nativeBuildInputs = buildTools; nativeBuildInputs = buildTools;
@ -121,12 +146,81 @@ let
sparse-beacon-windows = craneLib.buildPackage (windowsArgs // { sparse-beacon-windows = craneLib.buildPackage (windowsArgs // {
cargoArtifacts = windowsCargoArtifacts; cargoArtifacts = windowsCargoArtifacts;
name = "sparse-beacon-windows"; name = "sparse-beacon-windows";
cargoExtraArgs = "-p sparse-beacon"; cargoExtraArgs = "-p sparse-windows-beacon";
CARGO_BUILD_TARGET = "x86_64-pc-windows-gnu"; CARGO_BUILD_TARGET = "x86_64-pc-windows-gnu";
CARGO_BUILD_RUSTFLAGS = "-Ctarget-feature=+crt-static"; CARGO_BUILD_RUSTFLAGS = "-Ctarget-feature=+crt-static";
}); });
linux-loader = pkgs.stdenv.mkDerivation {
name = "sparse-linux-loader";
buildInputs = with pkgs; [ zig ];
src = ./unix-loader;
buildPhase = ''
zig build \
-Dtarget=x86_64-linux-musl
'';
installPhase = ''
mkdir -p $out/lib
cp zig-out/lib/libunix-loader.so $out/lib/unix-loader.so
'';
SPARSE_BEACON = "${sparse-beacon-linux}/bin/sparse-beacon";
};
freebsd-loader = pkgs.stdenv.mkDerivation {
name = "sparse-freebsd-loader";
buildInputs = with pkgs; [ zig ];
src = ./unix-loader;
buildPhase = ''
zig build \
-Dtarget=x86_64-freebsd \
--sysroot ${freebsd-libs} \
--libc ${freebsd-zig-libc}
'';
installPhase = ''
mkdir -p $out/lib
cp zig-out/lib/libunix-loader.so $out/lib/unix-loader.so
'';
SPARSE_BEACON = "${sparse-beacon-freebsd}/bin/sparse-beacon";
};
sparse-installer-linux = craneLib.buildPackage (commonArgs // {
cargoArtifacts = linuxCargoArtifacts;
name = "sparse-installer-linux";
cargoExtraArgs = "-p sparse-installer";
src = fileSetForInstallerCrate;
CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl";
CARGO_BUILD_RUSTFLAGS = "-Ctarget-feature=+crt-static";
SPARSE_INSTALLER_LINUX = "${linux-loader}/lib/unix-loader.so";
});
sparse-installer-freebsd-sysv = craneLib.buildPackage (commonArgs // {
cargoArtifacts = linuxCargoArtifacts;
name = "sparse-installer-linux";
cargoExtraArgs = "-p sparse-installer";
src = fileSetForInstallerCrate;
CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl";
CARGO_BUILD_RUSTFLAGS = "-Ctarget-feature=+crt-static";
SPARSE_INSTALLER_FREEBSD = "${freebsd-loader}/lib/unix-loader.so";
});
sparse-installer-freebsd =
patch-freebsd-elf sparse-installer-freebsd-sysv "bin/sparse-installer";
sparse-server = craneLib.buildPackage (commonArgs // { sparse-server = craneLib.buildPackage (commonArgs // {
src = fileSetForWebCrate; src = fileSetForWebCrate;
@ -145,15 +239,20 @@ let
cp target/x86_64-unknown-linux-musl/release/sparse-server $out/bin cp target/x86_64-unknown-linux-musl/release/sparse-server $out/bin
''; '';
SPARSE_BEACON_LINUX = "${sparse-beacon-linux}/bin/sparse-beacon"; SPARSE_INSTALLER_LINUX = "${sparse-installer-linux}/bin/sparse-installer";
SPARSE_INSTALLER_FREEBSD =
"${sparse-installer-freebsd}/bin/sparse-installer";
SPARSE_BEACON_WINDOWS = "${sparse-beacon-windows}/bin/sparse-beacon.exe"; SPARSE_BEACON_WINDOWS = "${sparse-beacon-windows}/bin/sparse-beacon.exe";
SPARSE_BEACON_FREEBSD = "${sparse-beacon-freebsd}/bin/sparse-beacon";
}); });
outputs = rec { outputs = rec {
packages = { packages = {
inherit sparse-beacon-linux sparse-beacon-windows sparse-beacon-freebsd inherit sparse-server sparse-beacon-linux sparse-beacon-windows
sparse-server; linux-loader freebsd-loader sparse-beacon-freebsd;
inherit freebsd-zig-libc;
default = sparse-server;
}; };
checks = outputs.packages // { checks = outputs.packages // {
rs-fmt = craneLib.cargoFmt { inherit src; }; rs-fmt = craneLib.cargoFmt { inherit src; };
@ -166,6 +265,16 @@ let
cargoArtifacts = linuxCargoArtifacts; cargoArtifacts = linuxCargoArtifacts;
cargoClippyExtraArgs = "--all-targets -- --deny warnings"; cargoClippyExtraArgs = "--all-targets -- --deny warnings";
}); });
zig-fmt = pkgs.stdenv.mkDerivation {
name = "zig-fmt-check";
src = ./.;
checkPhase = ''
zig fmt --check
'';
};
}; };
}; };
in outputs in outputs

1
sparse-beacon/src/lib.rs Normal file
View File

@ -0,0 +1 @@
pub fn run_beacon_step() {}

View File

@ -1,6 +0,0 @@
fn main() {
let interfaces = pcap_sys::PcapDevIterator::new().unwrap();
for interface in interfaces {
println!("Found interface: {interface}");
}
}

View File

@ -0,0 +1,6 @@
[package]
name = "sparse-unix-beacon"
edition = "2024"
version.workspace = true
[dependencies]

View File

@ -0,0 +1,3 @@
fn main() {
println!("Hello, world!");
}

View File

@ -0,0 +1,6 @@
[package]
name = "sparse-windows-beacon"
edition = "2024"
version.workspace = true
[dependencies]

View File

@ -0,0 +1,3 @@
fn main() {
println!("Hello, world!");
}

View File

@ -13,8 +13,8 @@ let
''; '';
}; };
bsd-toolchain = with pkgs.pkgsCross.x86_64-freebsd.buildPackages; freebsd-toolchain = with pkgs.pkgsCross.x86_64-freebsd.buildPackages;
pkgs.writeText "bsd-toolchain.cmake" '' pkgs.writeText "freebsd-toolchain.cmake" ''
set(CMAKE_SYSTEM_NAME FreeBSD) set(CMAKE_SYSTEM_NAME FreeBSD)
set(CMAKE_C_COMPILER ${clang}/bin/x86_64-unknown-freebsd-clang) set(CMAKE_C_COMPILER ${clang}/bin/x86_64-unknown-freebsd-clang)
@ -168,7 +168,7 @@ in {
export CC=x86_64-unknown-freebsd-clang export CC=x86_64-unknown-freebsd-clang
export CXX=x86_64-unknown-freebsd-clang++ export CXX=x86_64-unknown-freebsd-clang++
cmake \ cmake \
-DCMAKE_TOOLCHAIN_FILE=${bsd-toolchain} \ -DCMAKE_TOOLCHAIN_FILE=${freebsd-toolchain} \
-DCMAKE_BUILD_TYPE=MinSizeRel \ -DCMAKE_BUILD_TYPE=MinSizeRel \
-DBUILD_SHARED_LIBS=OFF \ -DBUILD_SHARED_LIBS=OFF \
-DDISABLE_BLUETOOTH=ON \ -DDISABLE_BLUETOOTH=ON \

26
unix-loader/build.zig Normal file
View File

@ -0,0 +1,26 @@
const std = @import("std");
pub fn build(b: *std.Build) !void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const lib = b.addSharedLibrary(.{
.name = "unix-loader",
.root_source_file = b.path("src/loader.zig"),
.target = target,
.optimize = optimize,
});
const exe = b.addExecutable(.{
.name = "unix-loader",
.root_source_file = b.path("src/test_run.zig"),
.target = target,
.optimize = optimize,
});
lib.linkLibC();
b.installArtifact(lib);
exe.linkLibC();
b.installArtifact(exe);
}

13
unix-loader/build.zig.zon Normal file
View File

@ -0,0 +1,13 @@
.{
.name = "linux-loader",
.version = "2.0.0",
.dependencies = .{},
.paths = .{
"build.zig",
"build.zig.zon",
"src",
},
}

View File

View File

@ -0,0 +1,10 @@
const std = @import("std");
const testing = std.testing;
export fn add(a: i32, b: i32) i32 {
return a + b;
}
test "basic add functionality" {
try testing.expect(add(3, 7) == 10);
}

View File

@ -0,0 +1,25 @@
const std = @import("std");
pub fn main() !void {
// Prints to stderr (it's a shortcut based on `std.io.getStdErr()`)
std.debug.print("All your {s} are belong to us.\n", .{"codebase"});
// stdout is for the actual output of your application, for example if you
// are implementing gzip, then only the compressed bytes should be sent to
// stdout, not any debugging messages.
const stdout_file = std.io.getStdOut().writer();
var bw = std.io.bufferedWriter(stdout_file);
const stdout = bw.writer();
try stdout.print("Run `zig build test` to run the tests.\n", .{});
try bw.flush(); // don't forget to flush!
}
test "simple test" {
var list = std.ArrayList(i32).init(std.testing.allocator);
defer list.deinit(); // try commenting this out and see if zig detects the memory leak!
try list.append(42);
try std.testing.expectEqual(@as(i32, 42), list.pop());
}