From d98aec63b0b7be95623f4d914fc9870614647ad4 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Mon, 2 Jun 2025 17:22:38 +0200 Subject: [PATCH] examples work as packages in flake --- devShells.nix | 70 ++++++++++++++++++++++++++++----------------------- flake.lock | 16 ++++++++++++ flake.nix | 4 ++- packages.nix | 60 ++++++++++++++++++++++++++++++++++++++----- 4 files changed, 112 insertions(+), 38 deletions(-) diff --git a/devShells.nix b/devShells.nix index 367faf4..498b51b 100644 --- a/devShells.nix +++ b/devShells.nix @@ -4,47 +4,55 @@ selfPkgs, ... }: +let + defaultAdditionalPkgs = with pkgs; [ + rustfmt + clippy + cargo-expand + cargo-tarpaulin + gdb + ]; +in (builtins.mapAttrs ( packageName: package: pkgs.mkShell { inputsFrom = [ package ]; - packages = with pkgs; [ - rustfmt - clippy - cargo-expand - cargo-tarpaulin - gdb - ]; - + packages = defaultAdditionalPkgs; RUST_BACKTRACE = 1; RUST_LOG = "all"; } ) selfPkgs) // { - test = pkgs.mkShell { - packages = with pkgs; [ - (pkgs.symlinkJoin { - name = "rust-toolchain"; - paths = with pkgs; [ - rustc - cargo - rustPlatform.rustcSrc - rustPlatform.rustLibSrc - rustfmt - clippy - cargo-expand - cargo-tarpaulin - ]; - }) - gcc - gnumake - xe - libgcc - libunwind - pkgsStatic.gcc - pkgsStatic.libgcc - pkgsStatic.musl + default = pkgs.mkShell { + inputsFrom = [ + selfPkgs.servicepoint-binding-c + selfPkgs.announce ]; + packages = + defaultAdditionalPkgs + ++ (with pkgs; [ + (pkgs.symlinkJoin { + name = "rust-toolchain"; + paths = with pkgs; [ + rustc + cargo + rustPlatform.rustcSrc + rustPlatform.rustLibSrc + rustfmt + clippy + cargo-expand + cargo-tarpaulin + ]; + }) + gcc + gnumake + xe + libgcc + libunwind + pkgsStatic.gcc + pkgsStatic.libgcc + pkgsStatic.musl + ]); RUST_SRC_PATH = "${pkgs.rustPlatform.rustLibSrc}"; }; diff --git a/flake.lock b/flake.lock index 07ccbb6..873e7c3 100644 --- a/flake.lock +++ b/flake.lock @@ -21,6 +21,21 @@ "type": "github" } }, + "nix-filter": { + "locked": { + "lastModified": 1731533336, + "narHash": "sha256-oRam5PS1vcrr5UPgALW0eo1m/5/pls27Z/pabHNy2Ms=", + "owner": "numtide", + "repo": "nix-filter", + "rev": "f7653272fd234696ae94229839a99b73c9ab7de0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nix-filter", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1748302896, @@ -40,6 +55,7 @@ "root": { "inputs": { "fenix": "fenix", + "nix-filter": "nix-filter", "nixpkgs": "nixpkgs" } }, diff --git a/flake.nix b/flake.nix index d35dbd2..1501caa 100644 --- a/flake.nix +++ b/flake.nix @@ -3,6 +3,7 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; + nix-filter.url = "github:numtide/nix-filter"; fenix = { url = "github:nix-community/fenix"; inputs.nixpkgs.follows = "nixpkgs"; @@ -14,6 +15,7 @@ self, nixpkgs, fenix, + nix-filter }: let supported-systems = [ @@ -29,7 +31,7 @@ f rec { inherit system self; pkgs = nixpkgs.legacyPackages.${system}; - lib = pkgs.lib; + lib = pkgs.lib // nix-filter.lib; fenix = inputs.fenix.packages.${system}; selfPkgs = self.packages.${system}; } diff --git a/packages.nix b/packages.nix index 02eb540..1716250 100644 --- a/packages.nix +++ b/packages.nix @@ -2,20 +2,31 @@ pkgs, lib, fenix, + selfPkgs, ... }: let - mkServicepointBindingC = + version = "0.15.0"; + mkServicepoint = { rustPlatform, buildType, }: rustPlatform.buildRustPackage (finalAttrs: { - inherit buildType; + inherit buildType version; pname = "servicepoint-binding-c"; - version = "0.15.0"; - src = ./.; + src = lib.filter { + root = ./.; + include = [ + ./Cargo.lock + ./Cargo.toml + ./src + ./build.rs + ./LICENSE + ./cbindgen.toml + ]; + }; cargoLock.lockFile = ./Cargo.lock; meta = { description = "C bindings for the servicepoint crate."; @@ -40,20 +51,57 @@ let sed "s:\$out:$out:g" ${./servicepoint.pc.in} | sed "s:\$version:$version:g" > $out/lib/pkgconfig/servicepoint.pc ''; }); + mkExample = + { name, servicepointBinding }: + pkgs.stdenv.mkDerivation { + inherit version; + pname = "servicepoint-c-example-${name}"; + + nativeBuildInputs = with pkgs; [ pkg-config ]; + buildInputs = [ servicepointBinding ]; + src = ./example/src; + + #dontUnpack = true; + buildPhase = '' + mkdir -p $out/bin + + gcc ${name}.c $(pkg-config --libs servicepoint --cflags) -o $out/bin/${name} + ''; + }; rustPlatform-stable = pkgs.rustPlatform; rustPlatform-unstable = pkgs.makeRustPlatform { cargo = fenix.minimal.cargo; rustc = fenix.minimal.rustc; }; + examples = [ + "announce" + "brightness_tester" + "header_logger" + "moving_line" + "random_stuff" + "wiping_clear" + ]; in rec { - servicepoint-binding-c-release = mkServicepointBindingC { + servicepoint-binding-c-release = mkServicepoint { buildType = "release"; rustPlatform = rustPlatform-stable; }; - servicepoint-binding-c-size-optimized = mkServicepointBindingC { + servicepoint-binding-c-size-optimized = mkServicepoint { buildType = "size_optimized"; rustPlatform = rustPlatform-unstable; }; servicepoint-binding-c = servicepoint-binding-c-release; + + all-examples = pkgs.symlinkJoin { + name = "servicepoint-all-examples"; + paths = builtins.map (e: selfPkgs.${e}) examples; + }; } +// (lib.genAttrs examples ( + name: + mkExample { + inherit name; + servicepointBinding = selfPkgs.servicepoint-binding-c; + } +))