summaryrefslogtreecommitdiff
path: root/parts
diff options
context:
space:
mode:
authorseth <[email protected]>2023-11-15 03:37:38 -0500
committerseth <[email protected]>2023-11-16 00:15:23 +0000
commitea3b523a37d22e67eaf5019bb8a661a60e82cc31 (patch)
treea8a43a617f5a815ad56f81a89578fe5fc05bfcc1 /parts
parent928d1ab5caa5ad1f6e22a869686c77626e53e7e0 (diff)
flake: use naersk to build cross arch docker images
Diffstat (limited to 'parts')
-rw-r--r--parts/deployment.nix97
-rw-r--r--parts/derivation.nix12
-rw-r--r--parts/packages.nix18
3 files changed, 104 insertions, 23 deletions
diff --git a/parts/deployment.nix b/parts/deployment.nix
index 0aeea7b..1549c77 100644
--- a/parts/deployment.nix
+++ b/parts/deployment.nix
@@ -1,19 +1,94 @@
-{self, ...}: {
+{
+ inputs,
+ self,
+ ...
+}: {
+ flake.nixosModules.default = import ./module.nix self;
+
perSystem = {
lib,
pkgs,
- self',
+ system,
+ config,
+ inputs',
...
- }: {
- packages = {
- container = pkgs.dockerTools.buildLayeredImage {
- name = "teawiebot";
- tag = "latest";
- contents = [pkgs.dockerTools.caCertificates];
- config.Cmd = [(lib.getExe self'.packages.teawiebot-smol)];
+ }: let
+ name = "getchoo/teawieBot";
+
+ crossPkgsFor = lib.fix (finalAttrs: {
+ "x86_64-linux" = {
+ "amd64" = pkgs.pkgsStatic;
+ "arm64v8" = pkgs.pkgsCross.aarch64-multiplatform.pkgsStatic;
+ };
+
+ "aarch64-linux" = {
+ "amd64" = pkgs.pkgsCross.musl64;
+ "arm64v8" = pkgs.pkgsStatic;
};
+
+ "x86_64-darwin" = {
+ "amd64" = pkgs.pkgsCross.musl64;
+ "arm64v8" = pkgs.pkgsCross.aarch64-multiplatform.pkgsStatic;
+ };
+
+ "aarch64-darwin" = finalAttrs."x86_64-darwin";
+ });
+
+ nativeArchFor = {
+ "amd64" = "x86_64";
+ "arm64v8" = "aarch64";
};
- };
- flake.nixosModules.default = import ./module.nix self;
+ wieFor = arch: let
+ target = "${nativeArchFor.${arch}}-unknown-linux-musl";
+ target' = builtins.replaceStrings ["-"] ["_"] target;
+ targetUpper = lib.toUpper target';
+
+ toolchain = with inputs'.fenix.packages;
+ combine [
+ minimal.cargo
+ minimal.rustc
+ targets.${target}.latest.rust-std
+ ];
+
+ naersk' = inputs.naersk.lib.${system}.override {
+ cargo = toolchain;
+ rustc = toolchain;
+ };
+
+ teawiebot = config.packages.teawiebot.override {
+ naersk = naersk';
+ optimizeSize = true;
+ };
+
+ inherit (crossPkgsFor.${system}.${arch}.stdenv) cc;
+ in
+ lib.getExe (
+ teawiebot.overrideAttrs (_:
+ lib.fix (finalAttrs: {
+ CARGO_BUILD_TARGET = target;
+ "CC_${target'}" = "${cc}/bin/${cc.targetPrefix}cc";
+ "CARGO_TARGET_${targetUpper}_RUSTFLAGS" = "-C target-feature=+crt-static";
+ "CARGO_TARGET_${targetUpper}_LINKER" = finalAttrs."CC_${target'}";
+ }))
+ );
+
+ toContainer = arch:
+ assert lib.assertMsg (
+ arch == "arch64" -> pkgs.stdenv.isLinux
+ ) "aarch64 images are only supported on linux!";
+ pkgs.dockerTools.buildLayeredImage {
+ inherit name;
+ tag = "latest-${arch}";
+ contents = [pkgs.dockerTools.caCertificates];
+ config.Cmd = [(wieFor arch)];
+
+ architecture = crossPkgsFor.${system}.${arch}.go.GOARCH;
+ };
+ in {
+ packages = {
+ container-amd64 = toContainer "amd64";
+ container-arm64v8 = toContainer "arm64v8";
+ };
+ };
}
diff --git a/parts/derivation.nix b/parts/derivation.nix
index 8fc5bd8..57cf647 100644
--- a/parts/derivation.nix
+++ b/parts/derivation.nix
@@ -1,7 +1,7 @@
{
lib,
- rustPlatform,
- self,
+ naersk,
+ version,
lto ? true,
optimizeSize ? false,
}: let
@@ -25,13 +25,11 @@
inherit filter;
};
in
- rustPlatform.buildRustPackage {
+ naersk.buildPackage {
pname = "teawiebot";
- version = builtins.substring 0 8 self.lastModifiedDate or "dirty";
+ inherit version;
- src = filterSource self;
-
- cargoLock.lockFile = ../Cargo.lock;
+ src = filterSource ../.;
RUSTFLAGS =
lib.optionalString lto " -C lto=thin -C embed-bitcode=yes"
diff --git a/parts/packages.nix b/parts/packages.nix
index 852db09..c4113c1 100644
--- a/parts/packages.nix
+++ b/parts/packages.nix
@@ -1,13 +1,21 @@
-{self, ...}: {
+{
+ self,
+ inputs,
+ ...
+}: {
perSystem = {
pkgs,
- self',
+ system,
+ config,
...
}: {
packages = {
- teawiebot = pkgs.callPackage ./derivation.nix {inherit self;};
- teawiebot-smol = self'.packages.teawiebot.override {optimizeSize = true;};
- default = self'.packages.teawiebot;
+ teawiebot = pkgs.callPackage ./derivation.nix {
+ version = builtins.substring 0 8 self.lastModifiedDate or "dirty";
+ naersk = inputs.naersk.lib.${system};
+ };
+
+ default = config.packages.teawiebot;
};
};
}