diff --git a/devShells.nix b/devShells.nix new file mode 100644 index 0000000..367faf4 --- /dev/null +++ b/devShells.nix @@ -0,0 +1,51 @@ +{ + pkgs, + fenix, + selfPkgs, + ... +}: +(builtins.mapAttrs ( + packageName: package: + pkgs.mkShell { + inputsFrom = [ package ]; + packages = with pkgs; [ + rustfmt + clippy + cargo-expand + cargo-tarpaulin + gdb + ]; + + 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 + ]; + + RUST_SRC_PATH = "${pkgs.rustPlatform.rustLibSrc}"; + }; +} diff --git a/flake.lock b/flake.lock index 9091d9f..07ccbb6 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,26 @@ { "nodes": { + "fenix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1748759782, + "narHash": "sha256-MJNhEBsAbxRp/53qsXv6/eaWkGS8zMGX9LuCz1BLeck=", + "owner": "nix-community", + "repo": "fenix", + "rev": "9be40ad995bac282160ff374a47eed67c74f9c2a", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1748302896, @@ -18,8 +39,26 @@ }, "root": { "inputs": { + "fenix": "fenix", "nixpkgs": "nixpkgs" } + }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1748695646, + "narHash": "sha256-VwSuuRF4NvAoeHZJRRlX8zAFZ+nZyuiIvmVqBAX0Bcg=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "2a388d1103450d814a84eda98efe89c01b158343", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 2adaa88..d35dbd2 100644 --- a/flake.nix +++ b/flake.nix @@ -3,15 +3,19 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; + fenix = { + url = "github:nix-community/fenix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = inputs@{ self, nixpkgs, + fenix, }: let - lib = nixpkgs.lib; supported-systems = [ "x86_64-linux" "aarch64-linux" @@ -20,56 +24,20 @@ ]; forAllSystems = f: - lib.genAttrs supported-systems ( + nixpkgs.lib.genAttrs supported-systems ( system: f rec { + inherit system self; pkgs = nixpkgs.legacyPackages.${system}; - inherit system; + lib = pkgs.lib; + fenix = inputs.fenix.packages.${system}; + selfPkgs = self.packages.${system}; } ); in { - devShells = forAllSystems ( - { pkgs, system }: - let - toolchain = pkgs.symlinkJoin { - name = "rust-toolchain"; - paths = with pkgs; [ - rustc - cargo - rustPlatform.rustcSrc - rustPlatform.rustLibSrc - rustfmt - clippy - cargo-expand - cargo-tarpaulin - ]; - }; - in - { - default = pkgs.mkShell rec { - packages = with pkgs; [ - toolchain - gcc - gdb - gnumake - pkg-config - xe - xz - libgcc - libunwind - pkgsStatic.gcc - pkgsStatic.libgcc - pkgsStatic.musl - ]; - - RUST_SRC_PATH = "${pkgs.rustPlatform.rustLibSrc}"; - RUST_BACKTRACE = 1; - RUST_LOG = "all"; - }; - } - ); - + packages = forAllSystems (import ./packages.nix); + devShells = forAllSystems (import ./devShells.nix); formatter = forAllSystems ({ pkgs, ... }: pkgs.nixfmt-rfc-style); }; } diff --git a/packages.nix b/packages.nix new file mode 100644 index 0000000..02eb540 --- /dev/null +++ b/packages.nix @@ -0,0 +1,59 @@ +{ + pkgs, + lib, + fenix, + ... +}: +let + mkServicepointBindingC = + { + rustPlatform, + buildType, + }: + rustPlatform.buildRustPackage (finalAttrs: { + inherit buildType; + + pname = "servicepoint-binding-c"; + version = "0.15.0"; + src = ./.; + cargoLock.lockFile = ./Cargo.lock; + meta = { + description = "C bindings for the servicepoint crate."; + homepage = "https://git.berlin.ccc.de/servicepoint/servicepoint-binding-c"; + license = lib.licenses.gpl3Plus; + pkgConfigModules = [ "servicepoint" ]; + }; + nativeBuildInputs = with pkgs; [ pkg-config ]; + buildInputs = with pkgs; [ xz ]; + + preBuild = '' + mkdir -p include + export SERVICEPOINT_HEADER_OUT=$(realpath "include") + + echo "Rust version: $(rustc --version)" + echo "preBuild hook: set SERVICEPOINT_HEADER_OUT to $SERVICEPOINT_HEADER_OUT" + ''; + postInstall = '' + cp -r include $out + + mkdir -p $out/lib/pkgconfig + sed "s:\$out:$out:g" ${./servicepoint.pc.in} | sed "s:\$version:$version:g" > $out/lib/pkgconfig/servicepoint.pc + ''; + }); + rustPlatform-stable = pkgs.rustPlatform; + rustPlatform-unstable = pkgs.makeRustPlatform { + cargo = fenix.minimal.cargo; + rustc = fenix.minimal.rustc; + }; +in +rec { + servicepoint-binding-c-release = mkServicepointBindingC { + buildType = "release"; + rustPlatform = rustPlatform-stable; + }; + servicepoint-binding-c-size-optimized = mkServicepointBindingC { + buildType = "size_optimized"; + rustPlatform = rustPlatform-unstable; + }; + servicepoint-binding-c = servicepoint-binding-c-release; +} diff --git a/servicepoint.pc.in b/servicepoint.pc.in new file mode 100644 index 0000000..5f474e7 --- /dev/null +++ b/servicepoint.pc.in @@ -0,0 +1,6 @@ +Name: servicepoint +Description: C bindings for the servicepoint library +Version: $version +URL: https://git.berlin.ccc.de/servicepoint/servicepoint-binding-c +Libs: -L$out/lib -lservicepoint_binding_c +Cflags: -I$out/include