aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cargo/config.toml.old (renamed from .cargo/config.toml)0
-rw-r--r--flake.lock109
-rw-r--r--flake.nix221
3 files changed, 205 insertions, 125 deletions
diff --git a/.cargo/config.toml b/.cargo/config.toml.old
index d29d6c33..d29d6c33 100644
--- a/.cargo/config.toml
+++ b/.cargo/config.toml.old
diff --git a/flake.lock b/flake.lock
index 2c7be871..196a59b0 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1,28 +1,21 @@
{
"nodes": {
- "cargo2nix": {
+ "fenix": {
"inputs": {
- "flake-compat": [
- "flake-compat"
- ],
- "flake-utils": "flake-utils",
- "nixpkgs": [
- "nixpkgs"
- ],
- "rust-overlay": "rust-overlay"
+ "nixpkgs": "nixpkgs",
+ "rust-analyzer-src": "rust-analyzer-src"
},
"locked": {
- "lastModified": 1705129117,
- "narHash": "sha256-LgdDHibvimzYhxBK3kxCk2gAL7k4Hyigl5KI0X9cijA=",
- "owner": "cargo2nix",
- "repo": "cargo2nix",
- "rev": "ae19a9e1f8f0880c088ea155ab66cee1fa001f59",
+ "lastModified": 1736836313,
+ "narHash": "sha256-zdZ7/T6yG0/hzoVOiNpDiR/sW3zR6oSMrfIFJK2BrrE=",
+ "owner": "nix-community",
+ "repo": "fenix",
+ "rev": "056c9393c821a4df356df6ce7f14c722dc8717ec",
"type": "github"
},
"original": {
- "owner": "cargo2nix",
- "repo": "cargo2nix",
- "rev": "ae19a9e1f8f0880c088ea155ab66cee1fa001f59",
+ "owner": "nix-community",
+ "repo": "fenix",
"type": "github"
}
},
@@ -41,23 +34,55 @@
"type": "github"
}
},
- "flake-utils": {
+ "naersk": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_2"
+ },
"locked": {
- "lastModified": 1659877975,
- "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
- "owner": "numtide",
- "repo": "flake-utils",
- "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+ "lastModified": 1736429655,
+ "narHash": "sha256-BwMekRuVlSB9C0QgwKMICiJ5EVbLGjfe4qyueyNQyGI=",
+ "owner": "nix-community",
+ "repo": "naersk",
+ "rev": "0621e47bd95542b8e1ce2ee2d65d6a1f887a13ce",
"type": "github"
},
"original": {
- "owner": "numtide",
- "repo": "flake-utils",
+ "owner": "nix-community",
+ "ref": "master",
+ "repo": "naersk",
"type": "github"
}
},
"nixpkgs": {
"locked": {
+ "lastModified": 1736701207,
+ "narHash": "sha256-jG/+MvjVY7SlTakzZ2fJ5dC3V1PrKKrUEOEE30jrOKA=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "ed4a395ea001367c1f13d34b1e01aa10290f67d6",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_2": {
+ "locked": {
+ "lastModified": 0,
+ "narHash": "sha256-Pzyb+YNG5u3zP79zoi8HXYMs15Q5dfjDgwCdUI5B0nY=",
+ "path": "/nix/store/4hpdrd3qvj7nks3rrimqm2jdmcga8isc-source",
+ "type": "path"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_3": {
+ "locked": {
"lastModified": 1736692550,
"narHash": "sha256-7tk8xH+g0sJkKLTJFOxphJxxOjMDFMWv24nXslaU2ro=",
"owner": "NixOS",
@@ -74,34 +99,26 @@
},
"root": {
"inputs": {
- "cargo2nix": "cargo2nix",
+ "fenix": "fenix",
"flake-compat": "flake-compat",
- "flake-utils": [
- "cargo2nix",
- "flake-utils"
- ],
- "nixpkgs": "nixpkgs"
+ "naersk": "naersk",
+ "nixpkgs": "nixpkgs_3"
}
},
- "rust-overlay": {
- "inputs": {
- "nixpkgs": [
- "cargo2nix",
- "nixpkgs"
- ]
- },
+ "rust-analyzer-src": {
+ "flake": false,
"locked": {
- "lastModified": 1736649126,
- "narHash": "sha256-XCw5sv/ePsroqiF3lJM6Y2X9EhPdHeE47gr3Q8b0UQw=",
- "owner": "oxalica",
- "repo": "rust-overlay",
- "rev": "162ab0edc2936508470199b2e8e6c444a2535019",
+ "lastModified": 1736690231,
+ "narHash": "sha256-g9gyxX+F6CrkT5gRIMKPnCPom0o9ZDzYnzzeNF86D6Q=",
+ "owner": "rust-lang",
+ "repo": "rust-analyzer",
+ "rev": "8364ef299790cb6ec22b9e09e873c97dbe9f2cb5",
"type": "github"
},
"original": {
- "owner": "oxalica",
- "repo": "rust-overlay",
- "rev": "162ab0edc2936508470199b2e8e6c444a2535019",
+ "owner": "rust-lang",
+ "ref": "nightly",
+ "repo": "rust-analyzer",
"type": "github"
}
}
diff --git a/flake.nix b/flake.nix
index b1cb7dbb..014898a3 100644
--- a/flake.nix
+++ b/flake.nix
@@ -2,92 +2,155 @@
description =
"Garage, an S3-compatible distributed object store for self-hosted deployments";
+ # Cross-compilation logic from here:
+ # https://mediocregopher.com/posts/x-compiling-rust-with-nix
+ # Thank you so much!!
+
# Nixpkgs 24.11 as of 2025-01-12 has rustc v1.82
inputs.nixpkgs.url =
"github:NixOS/nixpkgs/7c4869c47090dd7f9f1bdfb49a22aea026996815";
inputs.flake-compat.url = "github:nix-community/flake-compat";
- inputs.cargo2nix = {
- # As of 2022-10-18: two small patches over unstable branch, one for clippy and one to fix feature detection
- #url = "github:Alexis211/cargo2nix/a7a61179b66054904ef6a195d8da736eaaa06c36";
-
- # As of 2023-04-25:
- # - my two patches were merged into unstable (one for clippy and one to "fix" feature detection)
- # - rustc v1.66
- # url = "github:cargo2nix/cargo2nix/8fb57a670f7993bfc24099c33eb9c5abb51f29a2";
-
- # Mainline cargo2nix as of of 2025-01-12 (branch release-0.11.0)
- url = "github:cargo2nix/cargo2nix/ae19a9e1f8f0880c088ea155ab66cee1fa001f59";
-
- # Rust overlay as of 2025-01-12
- inputs.rust-overlay.url =
- "github:oxalica/rust-overlay/162ab0edc2936508470199b2e8e6c444a2535019";
-
- inputs.nixpkgs.follows = "nixpkgs";
- inputs.flake-compat.follows = "flake-compat";
- };
-
- inputs.flake-utils.follows = "cargo2nix/flake-utils";
-
- outputs = { self, nixpkgs, cargo2nix, flake-utils, ... }:
- let
- git_version = self.lastModifiedDate;
- compile = import ./nix/compile.nix;
- in
- flake-utils.lib.eachDefaultSystem (system:
- let
- pkgs = nixpkgs.legacyPackages.${system};
- in
- {
- packages =
- let
- packageFor = target: (compile {
- inherit system git_version target;
- pkgsSrc = nixpkgs;
- cargo2nixOverlay = cargo2nix.overlays.default;
- release = true;
- }).workspace.garage { compileMode = "build"; };
- in
- {
- # default = native release build
- default = packageFor null;
- # other = cross-compiled, statically-linked builds
- amd64 = packageFor "x86_64-unknown-linux-musl";
- i386 = packageFor "i686-unknown-linux-musl";
- arm64 = packageFor "aarch64-unknown-linux-musl";
- arm = packageFor "armv6l-unknown-linux-musl";
+ inputs.fenix.url = "github:nix-community/fenix";
+ inputs.naersk.url = "github:nix-community/naersk/master";
+
+ outputs = { self, nixpkgs, fenix, naersk, ... }:
+ let
+ buildTargets = {
+ "x86_64-linux" = {
+ crossSystemConfig = "x86_64-unknown-linux-musl";
+ rustTarget = "x86_64-unknown-linux-musl";
+ };
+
+ "i686-linux" = {
+ crossSystemConfig = "i686-unknown-linux-musl";
+ rustTarget = "i686-unknown-linux-musl";
+ };
+
+ "aarch64-linux" = {
+ crossSystemConfig = "aarch64-unknown-linux-musl";
+ rustTarget = "aarch64-unknown-linux-musl";
+ };
+
+ # Old Raspberry Pi's
+ "armv6l-linux" = {
+ crossSystemConfig = "armv6l-unknown-linux-musleabihf";
+ rustTarget = "arm-unknown-linux-musleabihf";
+ };
+ };
+
+ # eachSystem [system] (system: ...)
+ #
+ # Returns an attrset with a key for every system in the given array, with
+ # the key's value being the result of calling the callback with that key.
+ eachSystem = supportedSystems: callback: builtins.foldl'
+ (overall: system: overall // { ${system} = callback system; })
+ {}
+ supportedSystems;
+
+ # eachCrossSystem [system] (buildSystem: targetSystem: ...)
+ #
+ # Returns an attrset with a key "$buildSystem.cross-$targetSystem" for
+ # every combination of the elements of the array of system strings. The
+ # value of the attrs will be the result of calling the callback with each
+ # combination.
+ #
+ # There will also be keys "$system.default", which are aliases of
+ # "$system.cross-$system" for every system.
+ #
+ eachCrossSystem = supportedSystems: callback:
+ eachSystem supportedSystems (buildSystem: builtins.foldl'
+ (inner: targetSystem: inner // {
+ "cross-${targetSystem}" = callback buildSystem targetSystem;
+ })
+ { default = callback buildSystem buildSystem; }
+ supportedSystems
+ );
+
+ mkPkgs = buildSystem: targetSystem: import nixpkgs ({
+ system = buildSystem;
+ } // (if targetSystem == null then {} else {
+ # The nixpkgs cache doesn't have any packages where cross-compiling has
+ # been enabled, even if the target platform is actually the same as the
+ # build platform (and therefore it's not really cross-compiling). So we
+ # only set up the cross-compiling config if the target platform is
+ # different.
+ crossSystem.config = buildTargets.${targetSystem}.crossSystemConfig;
+ }));
+
+ in {
+ packages = eachCrossSystem
+ (builtins.attrNames buildTargets)
+ (buildSystem: targetSystem: let
+ pkgs = mkPkgs buildSystem null;
+ pkgsCross = mkPkgs buildSystem targetSystem;
+ rustTarget = buildTargets.${targetSystem}.rustTarget;
+
+ # TODO I'd prefer to use the toolchain file
+ # https://github.com/nix-community/fenix/issues/123
+ #toolchain = fenix.packages.${buildSystem}.fromToolchainFile {
+ # file = ./rust-toolchain.toml;
+ # sha256 = "sha256-LU4C/i+maIOqBZagUaXpFyWZyOVfQ3Ah5/JTz7v6CG4=";
+ #};
+
+ fenixPkgs = fenix.packages.${buildSystem};
+
+ mkToolchain = fenixPkgs: fenixPkgs.toolchainOf {
+ # TODO change compiler to stable
+ channel = "1.77";
+ sha256 = "sha256-7QfkHty6hSrgNM0fspycYkRcB82eEqYa4CoAJ9qA3tU=";
};
- # ---- developpment shell, for making native builds only ----
- devShells =
- let
- shellWithPackages = (packages: (compile {
- inherit system git_version;
- pkgsSrc = nixpkgs;
- cargo2nixOverlay = cargo2nix.overlays.default;
- }).workspaceShell { inherit packages; });
- in
- {
- default = shellWithPackages
- (with pkgs; [
- rustfmt
- clang
- mold
- ]);
-
- # import the full shell using `nix develop .#full`
- full = shellWithPackages (with pkgs; [
- rustfmt
- rust-analyzer
- clang
- mold
- # ---- extra packages for dev tasks ----
- cargo-audit
- cargo-outdated
- cargo-machete
- nixpkgs-fmt
- ]);
+ toolchain = fenixPkgs.combine [
+ (mkToolchain fenixPkgs).rustc
+ (mkToolchain fenixPkgs).cargo
+ (mkToolchain fenixPkgs.targets.${rustTarget}).rust-std
+ ];
+
+ buildPackageAttrs = if
+ builtins.hasAttr "makeBuildPackageAttrs" buildTargets.${targetSystem}
+ then
+ buildTargets.${targetSystem}.makeBuildPackageAttrs pkgsCross
+ else
+ {};
+
+ naersk-lib = pkgs.callPackage naersk {
+ cargo = toolchain;
+ rustc = toolchain;
};
- });
+
+ in
+ naersk-lib.buildPackage (buildPackageAttrs // rec {
+ name = "garage";
+ pname = "garage";
+ src = ./.;
+ strictDeps = true;
+ doCheck = false;
+ release = false; # for now
+
+ # TODO co uld be removed ?
+ OPENSSL_STATIC = "1";
+ OPENSSL_LIB_DIR = "${pkgsCross.pkgsStatic.openssl.out}/lib";
+ OPENSSL_INCLUDE_DIR = "${pkgsCross.pkgsStatic.openssl.dev}/include";
+
+ # TODO co uld be removed ?
+ # Required because ring crate is special. This also seems to have
+ # fixed some issues with the x86_64-windows cross-compile :shrug:
+ TARGET_CC = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc";
+
+ CARGO_BUILD_TARGET = rustTarget;
+ CARGO_BUILD_RUSTFLAGS = [
+ "-C" "target-feature=+crt-static"
+
+ # -latomic is required to build openssl-sys for armv6l-linux, but
+ # it doesn't seem to hurt any other builds.
+ "-C" "link-args=-static -latomic"
+
+ # https://github.com/rust-lang/cargo/issues/4133
+ "-C" "linker=${TARGET_CC}"
+ ];
+ })
+ );
+ };
}