|
16 | 16 | pkgs = import nixpkgs {inherit system;}; |
17 | 17 | lib = pkgs.lib; |
18 | 18 | fenix = fenix-pkg.packages.${system}; |
| 19 | + architectures = import ./architectures.nix; |
19 | 20 |
|
20 | 21 | rustToolchainDef = { |
21 | 22 | channel = "1.88.0"; |
|
49 | 50 | wasm-pack |
50 | 51 | ]; |
51 | 52 |
|
52 | | - appPkg = (pkgs.makeRustPlatform { |
| 53 | + mkPackage = { os, ... } @ variant: let |
| 54 | + crossPkgs = mkCrossPkgs variant; |
| 55 | + in (pkgs.makeRustPlatform { |
53 | 56 | inherit (toolchain) cargo rustc; |
54 | 57 | }).buildRustPackage (finalAttrs: { |
55 | 58 | doCheck = false; |
|
61 | 64 | src = ./.; |
62 | 65 | cargoLock.lockFile = ./Cargo.lock; |
63 | 66 |
|
64 | | - env.OPENSSL_NO_VENDOR = 1; |
| 67 | + env = { |
| 68 | + OPENSSL_NO_VENDOR = 1; |
| 69 | + HOST_CC = lib.optionalString (os != "windows") "${pkgs.stdenv.cc.nativePrefix}cc"; |
| 70 | + TARGET_CC = lib.optionalString (os != "windows") "${crossPkgs.stdenv.cc.targetPrefix}cc"; |
| 71 | + }; |
65 | 72 |
|
66 | 73 | nativeBuildInputs = [pkgs.pkg-config]; |
67 | 74 |
|
|
73 | 80 | ]; |
74 | 81 | }); |
75 | 82 |
|
76 | | - containerPkg = pkgs.dockerTools.buildLayeredImage { |
| 83 | + mkCrossPkgs = { arch, os, ... }: let |
| 84 | + cross = arch + "-" + os; |
| 85 | + crossSystem = lib.systems.elaborate cross; |
| 86 | + in import nixpkgs { |
| 87 | + crossSystem = if cross != "x86_64-linux" then crossSystem else null; |
| 88 | + localSystem = system; |
| 89 | + }; |
| 90 | + |
| 91 | + containerPkg = { arch, os, ... } @ variant: let |
| 92 | + appPkg = mkPackage variant; |
| 93 | + dockerPlatform = |
| 94 | + if arch == "x86_64" then "amd64" |
| 95 | + else if arch == "aarch64" then "arm64" |
| 96 | + else if arch == "armv7l" then "arm" |
| 97 | + else if arch == "armv6l" then "arm" |
| 98 | + else if arch == "i686" then "386" |
| 99 | + else throw "Unsupported arch: ${arch}"; |
| 100 | + in pkgs.dockerTools.buildLayeredImage { |
| 101 | + inherit os; |
| 102 | + created = "now"; |
77 | 103 | name = "rsground"; |
78 | 104 | tag = cargoManifest.package.version; |
79 | | - created = "now"; |
80 | | - architecture = "amd64"; |
| 105 | + architecture = dockerPlatform; |
81 | 106 |
|
82 | 107 | contents = [ appPkg ]; |
83 | 108 | config.Cmd = ["/bin/backend"]; |
84 | 109 | }; |
| 110 | + |
| 111 | + generatedMatrixJson = builtins.toJSON (lib.flatten (map ({ arch, os, ... }: { |
| 112 | + inherit os arch; |
| 113 | + package = "${os}-${arch}"; |
| 114 | + version = cargoManifest.package.version; |
| 115 | + }) architectures)); |
85 | 116 | in { |
86 | | - packages.${system} = { |
87 | | - default = appPkg; |
88 | | - image = containerPkg; |
| 117 | + apps.${system}.matrix = { |
| 118 | + type = "app"; |
| 119 | + program = toString (pkgs.writeScript "generate-matrix" '' |
| 120 | + #!/bin/sh |
| 121 | + echo '${generatedMatrixJson}' |
| 122 | + ''); |
89 | 123 | }; |
| 124 | + |
| 125 | + packages.${system} = |
| 126 | + let |
| 127 | + perArch = |
| 128 | + lib.listToAttrs (map (variant: { |
| 129 | + name = "image-${variant.os}-${variant.arch}"; |
| 130 | + value = containerPkg variant; |
| 131 | + }) architectures); |
| 132 | + |
| 133 | + perArchPkgs = |
| 134 | + lib.listToAttrs (map (variant: { |
| 135 | + name = "backend-${variant.os}-${variant.arch}"; |
| 136 | + value = mkPackage variant; |
| 137 | + }) architectures); |
| 138 | + in |
| 139 | + perArch // perArchPkgs // { |
| 140 | + docker-manifest = pkgs.writeShellScriptBin "docker-manifest" '' |
| 141 | + set -euo pipefail |
| 142 | + VERSION=${cargoManifest.package.version} |
| 143 | + IMAGE="ghcr.io/$REPOSITORY:$VERSION" |
| 144 | +
|
| 145 | + docker manifest create "$IMAGE" ${lib.concatMapStringsSep " " (variant: |
| 146 | + "--amend ghcr.io/$REPOSITORY:$VERSION-${variant.os}-${variant.arch}" |
| 147 | + ) architectures} |
| 148 | + docker manifest push "$IMAGE" |
| 149 | + ''; |
| 150 | + }; |
| 151 | + |
90 | 152 | devShells.${system}.default = pkgs.mkShell { |
91 | 153 | buildInputs = |
92 | 154 | commonBuildInputs |
|
0 commit comments