{ inputs, withSystem, ... }: { imports = [ inputs.pre-commit-hooks-nix.flakeModule inputs.hercules-ci-effects.flakeModule inputs.treefmt-nix.flakeModule ]; perSystem = { config, pkgs, inputs', ... }: { nix-bindings-rust.nixPackage = inputs'.nix.packages.default; treefmt = { # Used to find the project root projectRootFile = "flake.lock"; programs.rustfmt = { enable = true; edition = "2021"; }; programs.nixfmt.enable = true; programs.deadnix.enable = true; #programs.clang-format.enable = true; }; pre-commit.settings.hooks.treefmt.enable = true; # Temporarily disable rustfmt due to configuration issues # pre-commit.settings.hooks.rustfmt.enable = true; pre-commit.settings.settings.rust.cargoManifestPath = "./Cargo.toml"; # Check that we're using ///-style doc comments in Rust code. # # Unfortunately, rustfmt won't do this for us yet - at least not # without nightly, and it might do too much. pre-commit.settings.hooks.rust-doc-comments = { enable = true; files = "\\.rs$"; entry = "${pkgs.writeScript "rust-doc-comments" '' #!${pkgs.runtimeShell} set -uxo pipefail grep -n -C3 --color=always -F '/**' "$@" r=$? set -e if [ $r -eq 0 ]; then echo "Please replace /**-style comments by /// style comments in Rust code." exit 1 fi ''}"; }; # Combined rustdoc for all crates with cross-linking. # NOTE: nci.outputs.nix-bindings.docs uses doc-merge which doesn't support # rustdoc's new sharded search index format (Rust 1.78+). # See https://github.com/90-008/nix-cargo-integration/issues/198 # Instead, we build all workspace crates together so rustdoc can link them. packages.docs = let # Use nix-bindings-flake (has most transitive deps) as base base = config.nci.outputs.nix-bindings-flake.packages.release; crates = [ "nix-bindings-bdwgc-sys" "nix-bindings-util-sys" "nix-bindings-util" "nix-bindings-store-sys" "nix-bindings-store" "nix-bindings-expr-sys" "nix-bindings-expr" "nix-bindings-fetchers-sys" "nix-bindings-fetchers" "nix-bindings-flake-sys" "nix-bindings-flake" ]; packageFlags = pkgs.lib.concatMapStringsSep " " (c: "-p ${c}") crates; in (base.extendModules { modules = [ { mkDerivation = { # Build docs for all crates together (enabling cross-crate linking) buildPhase = pkgs.lib.mkForce '' cargo doc $cargoBuildFlags --no-deps --profile $cargoBuildProfile ${packageFlags} ''; checkPhase = pkgs.lib.mkForce ":"; installPhase = pkgs.lib.mkForce '' mv target/$CARGO_BUILD_TARGET/doc $out # Find rustdoc assets (have hashes in filenames) find_asset() { local pattern="$1" local matches=($out/static.files/$pattern) if [[ ''${#matches[@]} -ne 1 || ! -e "''${matches[0]}" ]]; then echo "Expected exactly one match for $pattern, found: ''${matches[*]}" >&2 exit 1 fi basename "''${matches[0]}" } rustdoc_css=$(find_asset 'rustdoc-*.css') normalize_css=$(find_asset 'normalize-*.css') storage_js=$(find_asset 'storage-*.js') cat > $out/index.html < nix-bindings-rust

nix-bindings-rust

Rust bindings for the Nix C API

Crates

Low-level bindings

These -sys crates provide raw FFI bindings generated by bindgen. They expose the C API directly without safety wrappers. Most users should prefer the high-level crates above.

EOF ''; }; } ]; }).config.public; devShells.default = pkgs.mkShell { name = "nix-bindings-devshell"; strictDeps = true; inputsFrom = [ config.nci.outputs.nix-bindings.devShell ]; inherit (config.nci.outputs.nix-bindings.devShell.env) LIBCLANG_PATH NIX_CC_UNWRAPPED ; NIX_DEBUG_INFO_DIRS = let # TODO: add to Nixpkgs lib getDebug = pkg: if pkg ? debug then pkg.debug else if pkg ? lib then pkg.lib else pkg; in "${getDebug config.packages.nix}/lib/debug"; buildInputs = [ config.packages.nix ]; nativeBuildInputs = [ config.treefmt.build.wrapper pkgs.rust-analyzer pkgs.nixfmt pkgs.rustfmt pkgs.pkg-config pkgs.clang-tools # clangd pkgs.valgrind pkgs.gdb pkgs.hci # TODO: set up cargo-valgrind in shell and build # currently both this and `cargo install cargo-valgrind` # produce a binary that says ENOENT. # pkgs.cargo-valgrind ]; shellHook = '' ${config.pre-commit.shellHook} echo 1>&2 "Welcome to the development shell!" ''; # rust-analyzer needs a NIX_PATH for some reason NIX_PATH = "nixpkgs=${inputs.nixpkgs}"; }; }; herculesCI = hci@{ lib, ... }: { ciSystems = [ "x86_64-linux" ]; onPush.default.outputs = { effects.pushDocs = lib.optionalAttrs (hci.config.repo.branch == "main") ( withSystem "x86_64-linux" ( { config, hci-effects, ... }: hci-effects.gitWriteBranch { git.checkout.remote.url = hci.config.repo.remoteHttpUrl; git.checkout.forgeType = "github"; git.checkout.user = "x-access-token"; git.update.branch = "gh-pages"; contents = config.packages.docs; destination = "development"; # directory } ) ); }; }; hercules-ci.flake-update = { enable = true; baseMerge.enable = true; autoMergeMethod = "merge"; when = { dayOfMonth = 1; }; flakes = { "." = { }; "dev" = { }; }; }; hercules-ci.cargo-publish = { enable = true; secretName = "crates-io"; assertVersions = true; }; flake = { }; }