Compare commits

..

No commits in common. "2919906843a001827610ef6cdcd88eaab321ce29" and "bd09a1ad7bc66ada76cf605bacf13b1fb1c54968" have entirely different histories.

9 changed files with 6572 additions and 68 deletions

6326
Cargo.nix Normal file

File diff suppressed because it is too large Load Diff

View File

@ -6,15 +6,15 @@
features ? null, features ? null,
}: }:
with import ./nix/common.nix;
let let
pkgsSrc = import ./nix/pkgs.nix;
newBuildTarget = { newBuildTarget = {
nixPkgsSystem, nixPkgsSystem,
rustTarget ? nixPkgsSystem, rustTarget ? nixPkgsSystem,
nativeBuildInputs ? pkgsCross: [], depsBuildBuild ? pkgsCross: [],
rustFlags ? pkgsCross: [],
}: { }: {
inherit nixPkgsSystem rustTarget nativeBuildInputs rustFlags; inherit nixPkgsSystem rustTarget depsBuildBuild;
}; };
# centralize per-target configuration in a single place. # centralize per-target configuration in a single place.
@ -31,19 +31,18 @@ let
nixPkgsSystem = "aarch64-unknown-linux-musl"; nixPkgsSystem = "aarch64-unknown-linux-musl";
}; };
# Old Raspberry Pi's (not currently supported due to linking errors with # Old Raspberry Pi's
# libsqlite3 and libsodium "armv6l-linux" = newBuildTarget {
#"armv6l-linux" = newBuildTarget { nixPkgsSystem = "armv6l-unknown-linux-musleabihf";
# nixPkgsSystem = "armv6l-unknown-linux-musleabihf"; rustTarget = "arm-unknown-linux-musleabihf";
# rustTarget = "arm-unknown-linux-musleabihf"; };
#};
"x86_64-windows" = newBuildTarget { "x86_64-windows" = newBuildTarget {
nixPkgsSystem = "x86_64-w64-mingw32"; nixPkgsSystem = "x86_64-w64-mingw32";
rustTarget = "x86_64-pc-windows-gnu"; rustTarget = "x86_64-pc-windows-gnu";
nativeBuildInputs = pkgsCross: [ pkgsCross.windows.pthreads ]; depsBuildBuild = pkgsCross: [
rustFlags = pkgsCross: [ pkgsCross.stdenv.cc
"-C" "link-arg=-L${pkgsCross.windows.pthreads}/lib" pkgsCross.windows.pthreads
]; ];
}; };
}; };
@ -77,7 +76,6 @@ let
(mkToolchain fenix).rustc (mkToolchain fenix).rustc
(mkToolchain fenix).rustfmt (mkToolchain fenix).rustfmt
(mkToolchain fenix).cargo (mkToolchain fenix).cargo
(mkToolchain fenix).clippy
(mkToolchain fenix.targets.${rustTarget}).rust-std (mkToolchain fenix.targets.${rustTarget}).rust-std
]; ];
@ -94,6 +92,28 @@ let
rustc = toolchain; rustc = toolchain;
}; };
# TODO build all of these
#build_debug_and_release = (target: {
# debug = (compile {
# inherit system target gitVersion pkgsSrc cargo2nixOverlay;
# release = false;
# }).workspace.garage { compileMode = "build"; };
# release = (compile {
# inherit system target gitVersion pkgsSrc cargo2nixOverlay;
# release = true;
# }).workspace.garage { compileMode = "build"; };
#});
#test = (rustPkgs:
# pkgs.symlinkJoin {
# name = "garage-tests";
# paths =
# builtins.map (key: rustPkgs.workspace.${key} { compileMode = "test"; })
# (builtins.attrNames rustPkgs.workspace);
# });
builtFeatures = if features != null then builtFeatures = if features != null then
features features
else ( else (
@ -103,6 +123,7 @@ let
"garage/kubernetes-discovery" "garage/kubernetes-discovery"
"garage/metrics" "garage/metrics"
"garage/telemetry-otlp" "garage/telemetry-otlp"
"garage/lmdb"
"garage/sqlite" "garage/sqlite"
] else [ ] ] else [ ]
) )
@ -122,20 +143,21 @@ let
fi fi
''; '';
in rec {
inherit pkgs pkgsCross;
# Exported separately so it can be used from shell.nix
buildEnv = rec { buildEnv = rec {
nativeBuildInputs = (buildTarget.nativeBuildInputs pkgsCross) ++ [ nativeBuildInputs = (buildTarget.depsBuildBuild pkgsCross) ++ [
toolchain toolchain
pkgs.protobuf pkgs.protobuf
# Required for shell because of rust dependency build scripts which must
# run on the build system.
pkgs.stdenv.cc
]; ];
buildInputs = [
pkgsCross.stdenv.cc
pkgsCross.windows.pthreads
];
OPENSSL_STATIC = "1";
OPENSSL_LIB_DIR = "${pkgsCross.pkgsStatic.openssl.out}/lib";
OPENSSL_INCLUDE_DIR = "${pkgsCross.pkgsStatic.openssl.dev}/include";
SODIUM_LIB_DIR = "${libsodium}/lib"; SODIUM_LIB_DIR = "${libsodium}/lib";
# Required because ring crate is special. This also seems to have # Required because ring crate is special. This also seems to have
@ -145,14 +167,21 @@ in rec {
CARGO_BUILD_TARGET = rustTarget; CARGO_BUILD_TARGET = rustTarget;
CARGO_BUILD_RUSTFLAGS = [ CARGO_BUILD_RUSTFLAGS = [
"-C" "target-feature=+crt-static" "-C" "target-feature=+crt-static"
"-C" "link-arg=-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 # https://github.com/rust-lang/cargo/issues/4133
"-C" "linker=${TARGET_CC}" "-C" "linker=${TARGET_CC}"
] ++ (buildTarget.rustFlags pkgsCross); ];
}; };
build = naersk.buildPackage (rec { in {
inherit pkgs pkgsCross;
release = naersk.buildPackage (rec {
inherit release; inherit release;
src = ./.; src = ./.;
@ -163,4 +192,15 @@ in rec {
"--features=${builtins.concatStringsSep "," builtFeatures}" "--features=${builtins.concatStringsSep "," builtFeatures}"
]; ];
} // buildEnv); } // buildEnv);
shell = pkgsCross.mkShell buildEnv;
# TODO
#clippy = {
# amd64 = (compile {
# inherit system gitVersion pkgsSrc cargo2nixOverlay;
# target = "x86_64-unknown-linux-musl";
# compiler = "clippy";
# }).workspace.garage { compileMode = "build"; };
#};
} }

View File

@ -1,5 +1,31 @@
{ {
"nodes": { "nodes": {
"cargo2nix": {
"inputs": {
"flake-compat": [
"flake-compat"
],
"flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs"
],
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1666087781,
"narHash": "sha256-trKVdjMZ8mNkGfLcY5LsJJGtdV3xJDZnMVrkFjErlcs=",
"owner": "Alexis211",
"repo": "cargo2nix",
"rev": "a7a61179b66054904ef6a195d8da736eaaa06c36",
"type": "github"
},
"original": {
"owner": "Alexis211",
"repo": "cargo2nix",
"rev": "a7a61179b66054904ef6a195d8da736eaaa06c36",
"type": "github"
}
},
"flake-compat": { "flake-compat": {
"locked": { "locked": {
"lastModified": 1688025799, "lastModified": 1688025799,
@ -20,19 +46,54 @@
"systems": "systems" "systems": "systems"
}, },
"locked": { "locked": {
"lastModified": 1701680307, "lastModified": 1681202837,
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725", "rev": "cfacdce06f30d2b68473a46042957675eebb3401",
"type": "github" "type": "github"
}, },
"original": { "original": {
"id": "flake-utils", "owner": "numtide",
"type": "indirect" "repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1681202837,
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
} }
}, },
"nixpkgs": { "nixpkgs": {
"locked": {
"lastModified": 1682109806,
"narHash": "sha256-d9g7RKNShMLboTWwukM+RObDWWpHKaqTYXB48clBWXI=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "2362848adf8def2866fabbffc50462e929d7fffb",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1682423271, "lastModified": 1682423271,
"narHash": "sha256-WHhl1GiOij1ob4cTLL+yhqr+vFOUH8E5wAX8Ir8fvjE=", "narHash": "sha256-WHhl1GiOij1ob4cTLL+yhqr+vFOUH8E5wAX8Ir8fvjE=",
@ -50,9 +111,32 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"cargo2nix": "cargo2nix",
"flake-compat": "flake-compat", "flake-compat": "flake-compat",
"flake-utils": "flake-utils", "flake-utils": [
"cargo2nix",
"flake-utils"
],
"nixpkgs": "nixpkgs_2"
}
},
"rust-overlay": {
"inputs": {
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1682389182,
"narHash": "sha256-8t2nmFnH+8V48+IJsf8AK51ebXNlVbOSVYOpiqJKvJE=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "74f1a64dd28faeeb85ef081f32cad2989850322c",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
} }
}, },
"systems": { "systems": {
@ -69,6 +153,21 @@
"repo": "default", "repo": "default",
"type": "github" "type": "github"
} }
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
} }
}, },
"root": "root", "root": "root",

View File

@ -8,23 +8,50 @@
inputs.flake-compat.url = "github:nix-community/flake-compat"; inputs.flake-compat.url = "github:nix-community/flake-compat";
outputs = { self, nixpkgs, flake-utils, ... }: 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";
# Rust overlay as of 2023-04-25
inputs.rust-overlay.url =
"github:oxalica/rust-overlay/74f1a64dd28faeeb85ef081f32cad2989850322c";
inputs.nixpkgs.follows = "nixpkgs";
inputs.flake-compat.follows = "flake-compat";
};
inputs.flake-utils.follows = "cargo2nix/flake-utils";
outputs = { self, nixpkgs, cargo2nix, flake-utils, ... }:
let let
gitVersion = self.lastModifiedDate; git_version = self.lastModifiedDate;
compile = import ./nix/compile.nix; compile = import ./nix/compile.nix;
in in
flake-utils.lib.eachDefaultSystem (system: flake-utils.lib.eachDefaultSystem (system:
let pkgs = nixpkgs.legacyPackages.${system}; let pkgs = nixpkgs.legacyPackages.${system};
in { in {
packages = { packages = {
default = (import ./default.nix { default = (compile {
inherit gitVersion; inherit system git_version;
buildSystem = system; pkgsSrc = nixpkgs;
cargo2nixOverlay = cargo2nix.overlays.default;
release = true; release = true;
}).build; }).workspace.garage { compileMode = "build"; };
}; };
devShell = (import ./shell.nix { devShell = (compile {
buildSystem = system; inherit system git_version;
}).rust; pkgsSrc = nixpkgs;
cargo2nixOverlay = cargo2nix.overlays.default;
release = false;
}).workspaceShell { packages = with pkgs; [
rustfmt
clang
mold
]; };
}); });
} }

View File

@ -1,6 +1,6 @@
{ path ? "/../aws-list.txt", }: { path ? "/../aws-list.txt", }:
with import ./pkgs.nix; with import ./common.nix;
let let
pkgs = import pkgsSrc { }; pkgs = import pkgsSrc { };
lib = pkgs.lib; lib = pkgs.lib;

17
nix/common.nix Normal file
View File

@ -0,0 +1,17 @@
let
lock = builtins.fromJSON (builtins.readFile ../flake.lock);
inherit (lock.nodes.flake-compat.locked) owner repo rev narHash;
flake-compat = fetchTarball {
url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz";
sha256 = narHash;
};
flake = (import flake-compat { system = builtins.currentSystem; src = ../.; });
in
rec {
pkgsSrc = flake.defaultNix.inputs.nixpkgs;
cargo2nix = flake.defaultNix.inputs.cargo2nix;
cargo2nixOverlay = cargo2nix.overlays.default;
}

View File

@ -1,8 +0,0 @@
let
lock = builtins.fromJSON (builtins.readFile ../flake.lock);
inherit (lock.nodes.nixpkgs.locked) owner repo rev narHash;
in
fetchTarball {
url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz";
sha256 = narHash;
}

View File

@ -1,12 +1,12 @@
{ { system ? builtins.currentSystem, }:
buildSystem ? builtins.currentSystem,
targetSystem ? buildSystem,
}:
with import ./nix/pkgs.nix; with import ./nix/common.nix;
let let
inherit (import ./default.nix { inherit buildSystem targetSystem; }) pkgs pkgsCross buildEnv; pkgs = import pkgsSrc {
inherit system;
overlays = [ cargo2nixOverlay ];
};
kaniko = (import ./nix/kaniko.nix) pkgs; kaniko = (import ./nix/kaniko.nix) pkgs;
manifest-tool = (import ./nix/manifest-tool.nix) pkgs; manifest-tool = (import ./nix/manifest-tool.nix) pkgs;
winscp = (import ./nix/winscp.nix) pkgs; winscp = (import ./nix/winscp.nix) pkgs;
@ -14,13 +14,22 @@ let
in { in {
# --- Rust Shell --- # --- Rust Shell ---
# Use it to compile Garage # Use it to compile Garage
rust = pkgsCross.mkShell (buildEnv // { rust = pkgs.mkShell {
inputsFrom = [ nativeBuildInputs = with pkgs; [
kaniko #rustPlatform.rust.rustc
manifest-tool rustPlatform.rust.cargo
winscp clang
mold
#clippy
rustfmt
#perl
#protobuf
#pkg-config
#openssl
file
#cargo2nix.packages.x86_64-linux.cargo2nix
]; ];
}); };
# --- Integration shell --- # --- Integration shell ---
# Use it to test Garage with common S3 clients # Use it to test Garage with common S3 clients

View File

@ -978,7 +978,6 @@ impl NodeStatus {
} }
} }
#[cfg(not(windows))]
fn get_default_ip() -> Option<IpAddr> { fn get_default_ip() -> Option<IpAddr> {
pnet_datalink::interfaces() pnet_datalink::interfaces()
.iter() .iter()
@ -987,11 +986,6 @@ fn get_default_ip() -> Option<IpAddr> {
.map(|a| a.ip()) .map(|a| a.ip())
} }
#[cfg(windows)]
fn get_default_ip() -> Option<IpAddr> {
None
}
async fn resolve_peers(peers: &[String]) -> Vec<(NodeID, SocketAddr)> { async fn resolve_peers(peers: &[String]) -> Vec<(NodeID, SocketAddr)> {
let mut ret = vec![]; let mut ret = vec![];