From d72ab2a167b9716878cd88f58ff9b7efad9917cc Mon Sep 17 00:00:00 2001 From: Alexander Sosedkin Date: Sat, 15 Jun 2024 14:35:28 +0200 Subject: [PATCH] add x86_64 arch --- .github/workflows/cachix.yml | 2 +- README.md | 3 +- flake.nix | 34 +++++++++++++------- modules/build/config.nix | 6 ++-- modules/environment/login/default.nix | 11 +++++-- modules/environment/login/login-inner.nix | 5 +-- pkgs/default.nix | 5 ++- pkgs/nix-directory.nix | 9 +++++- scripts/deploy.sh | 37 ++++++++++++++-------- templates/minimal/flake.nix | 1 + tests/on-device/config-flake-default.nix | 1 + tests/on-device/config-flake-h-m.bats | 2 +- tests/on-device/config-flake-h-m.flake.nix | 1 + tests/on-device/config-flake-hosts.bats | 4 +-- tests/on-device/config-flake.bats | 2 +- tests/on-device/config-flake.nix | 1 + tests/on-device/lib.bash | 5 +++ 17 files changed, 89 insertions(+), 40 deletions(-) diff --git a/.github/workflows/cachix.yml b/.github/workflows/cachix.yml index b899801..58796c3 100644 --- a/.github/workflows/cachix.yml +++ b/.github/workflows/cachix.yml @@ -27,5 +27,5 @@ jobs: --log-format bar-with-logs \ --option keep-going true \ --show-trace \ - build .#bootstrapZip \ + build .#bootstrapZip-aarch64 .#bootstrapZip-x86_64 \ --impure diff --git a/README.md b/README.md index 2f3077a..b8c3659 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,7 @@ Get an x86_64 computer with flake-enabled Nix. Run ```sh -nix build ".#bootstrapZip" --impure +nix build ".#bootstrapZip-aarch64" --impure ``` Put the zip file from `result` on some HTTP server @@ -192,6 +192,7 @@ A minimal example could look like the following: outputs = { self, nixpkgs, nix-on-droid }: { nixOnDroidConfigurations.default = nix-on-droid.lib.nixOnDroidConfiguration { + system = "aarch64-linux"; modules = [ ./nix-on-droid.nix ]; }; diff --git a/flake.nix b/flake.nix index ce327b6..8b18d20 100644 --- a/flake.nix +++ b/flake.nix @@ -33,8 +33,8 @@ overlay = nixpkgs.lib.composeManyExtensions (import ./overlays); - pkgs' = import nixpkgs { - system = "aarch64-linux"; + pkgsPerSystem = system: import nixpkgs { + inherit system; overlays = [ overlay ]; }; @@ -75,16 +75,18 @@ lib.nixOnDroidConfiguration = { modules ? [ ] + , system ? "aarch64-linux" , extraSpecialArgs ? { } - , pkgs ? pkgs' + , pkgs ? pkgsPerSystem system , home-manager-path ? home-manager.outPath # deprecated: , config ? null , extraModules ? null - , system ? null }: - if pkgs.system != "aarch64-linux" then - throw "aarch64-linux is the only currently supported system type" + if ! (builtins.elem system [ "aarch64-linux" "x86_64-linux" ]) then + throw + ("${system} is not supported; aarch64-linux / x86_64-linux " + + "are the only currently supported system types") else pkgs.lib.throwIf (config != null || extraModules != null) @@ -102,6 +104,8 @@ (import ./modules { inherit extraSpecialArgs home-manager-path pkgs; config.imports = modules; + config.build.arch = + nixpkgs.lib.strings.removeSuffix "-linux" system; isFlake = true; }); @@ -109,10 +113,17 @@ packages = forEachSystem (system: let - nixOnDroidPkgs = import ./pkgs { - inherit system; - nixpkgs = nixpkgs-for-bootstrap; - }; + flattenArch = arch: derivationAttrset: + nixpkgs.lib.attrsets.mapAttrs' + (name: drv: + nixpkgs.lib.attrsets.nameValuePair (name + "-" + arch) drv + ) + derivationAttrset; + perArchCustomPkgs = arch: flattenArch arch + (import ./pkgs { + inherit system arch; + nixpkgs = nixpkgs-for-bootstrap; + }).customPkgs; docs = import ./docs { inherit home-manager; @@ -123,7 +134,8 @@ { nix-on-droid = nixpkgs.legacyPackages.${system}.callPackage ./nix-on-droid { }; } - // nixOnDroidPkgs.customPkgs + // (perArchCustomPkgs "aarch64") + // (perArchCustomPkgs "x86_64") // docs ); diff --git a/modules/build/config.nix b/modules/build/config.nix index bb3432d..751be14 100644 --- a/modules/build/config.nix +++ b/modules/build/config.nix @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2023, see AUTHORS. Licensed under MIT License, see LICENSE. +# Copyright (c) 2019-2024, see AUTHORS. Licensed under MIT License, see LICENSE. { config, lib, pkgs, ... }: @@ -12,8 +12,8 @@ with lib; build = { arch = mkOption { - type = types.enum [ "aarch64" ]; - default = "aarch64"; + type = types.enum [ "aarch64" "x86_64" ]; + default = strings.removeSuffix "-linux" builtins.currentSystem; internal = true; description = "Destination arch."; }; diff --git a/modules/environment/login/default.nix b/modules/environment/login/default.nix index 9409c4c..78348cd 100644 --- a/modules/environment/login/default.nix +++ b/modules/environment/login/default.nix @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2023, see AUTHORS. Licensed under MIT License, see LICENSE. +# Copyright (c) 2019-2024, see AUTHORS. Licensed under MIT License, see LICENSE. { config, lib, pkgs, initialPackageInfo, ... }: @@ -82,7 +82,14 @@ in environment.files = { inherit login loginInner; - prootStatic = "/nix/store/7w09z1kw62wg7nv3q3z2p6kxf1ihk178-proot-termux-static-aarch64-unknown-linux-android-unstable-2023-11-11"; + prootStatic = + let + crossCompiledPaths = { + aarch64 = "/nix/store/7w09z1kw62wg7nv3q3z2p6kxf1ihk178-proot-termux-static-aarch64-unknown-linux-android-unstable-2023-11-11"; + x86_64 = "/nix/store/i6jppi627sakbgm5x2a8jjdfyv8571zc-proot-termux-static-x86_64-unknown-linux-android-unstable-2023-11-11"; + }; + in + "${crossCompiledPaths.${config.build.arch}}"; }; }; diff --git a/modules/environment/login/login-inner.nix b/modules/environment/login/login-inner.nix index 92a4ee5..e1bddee 100644 --- a/modules/environment/login/login-inner.nix +++ b/modules/environment/login/login-inner.nix @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2023, see AUTHORS. Licensed under MIT License, see LICENSE. +# Copyright (c) 2019-2024, see AUTHORS. Licensed under MIT License, see LICENSE. { config, lib, initialPackageInfo, writeText }: @@ -80,9 +80,10 @@ writeText "login-inner" '' ${nixCmd} flake new ${config.user.home}/.config/nix-on-droid --template ${config.build.flake.nix-on-droid} ${lib.optionalString config.build.flake.inputOverrides '' - echo "Overriding input urls in flake..." + echo "Overriding input urls / arch in flake..." ${nixCmd} run nixpkgs#gnused -- \ -i \ + -e 's,\"aarch64-linux",\"${config.build.arch}-linux\",' \ -e 's,\"github:NixOS/nixpkgs.*\",\"${config.build.flake.nixpkgs}\",' \ -e 's,\"github:nix-community/nix-on-droid.*\",\"${config.build.flake.nix-on-droid}\",' \ "${config.user.home}/.config/nix-on-droid/flake.nix" diff --git a/pkgs/default.nix b/pkgs/default.nix index 0f9a891..b5353f5 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -41,7 +41,10 @@ let user.shell = "${initialPackageInfo.bash}/bin/bash"; build = { - inherit arch; + arch = + if arch != null + then arch + else nixpkgs.lib.strings.removeSuffix "-linux" builtins.currentSystem; channel = { nixpkgs = urlOptionValue nixpkgsChannelURL "NIXPKGS_CHANNEL_URL"; diff --git a/pkgs/nix-directory.nix b/pkgs/nix-directory.nix index e1a551a..03e9fd8 100644 --- a/pkgs/nix-directory.nix +++ b/pkgs/nix-directory.nix @@ -25,7 +25,14 @@ stdenv.mkDerivation { src = builtins.fetchurl { url = "https://nixos.org/releases/nix/nix-2.20.5/nix-2.20.5-${config.build.arch}-linux.tar.xz"; - sha256 = "sha256:168wjfj3xsc8hq1y6cq59iipjp1g9hmj4n5wdn9c47ad9gbc9cvh"; + sha256 = + let + archShas = { + aarch64 = "sha256:168wjfj3xsc8hq1y6cq59iipjp1g9hmj4n5wdn9c47ad9gbc9cvh"; + x86_64 = "sha256:0dax9n562ldj53ap6lz0cwwsfx4d8j1267g9s6lg3zs237yyzw61"; + }; + in + archShas.${config.build.arch}; }; PROOT_NO_SECCOMP = 1; # see https://github.com/proot-me/PRoot/issues/106 diff --git a/scripts/deploy.sh b/scripts/deploy.sh index dc75e46..fbda16a 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -23,6 +23,7 @@ fi PUBLIC_URL="$1" RSYNC_TARGET="$2" +: ${ARCHES:=aarch64 x86_64} # this allows to run this script from every place in this git repo REPO_DIR="$(git rev-parse --show-toplevel)" @@ -54,27 +55,35 @@ log "NIX_ON_DROID_CHANNEL_URL=$NIX_ON_DROID_CHANNEL_URL" log "NIX_ON_DROID_FLAKE_URL=$NIX_ON_DROID_FLAKE_URL" -log "building proot..." -PROOT="$(nix build --no-link --print-out-paths ".#prootTermux")" - - PROOT_HASH_FILE="modules/environment/login/default.nix" -log "patching proot path in $PROOT_HASH_FILE..." -grep "prootStatic = \"/nix/store/" "$PROOT_HASH_FILE" -sed -i "s|prootStatic = \"/nix/store/.*\";|prootStatic = \"$PROOT\";|" "$PROOT_HASH_FILE" -grep "prootStatic = \"/nix/store/" "$PROOT_HASH_FILE" +UPLOADS=() +for arch in $ARCHES; do + log "building $arch proot..." + proot="$(nix build --no-link --print-out-paths ".#prootTermux-${arch}")" + if grep -q "$arch = \"$proot\";" "$PROOT_HASH_FILE"; then + log "keeping $arch proot path in $PROOT_HASH_FILE" + elif grep -q "$arch = \"/nix/store/" "$PROOT_HASH_FILE"; then + log "patching $arch proot path in $PROOT_HASH_FILE..." + grep "$arch = \"/nix/store/" "$PROOT_HASH_FILE" + sed -i "s|$arch = \"/nix/store/.*\";|$arch = \"$proot\";|" "$PROOT_HASH_FILE" + log " ->" + grep "$arch = \"/nix/store/" "$PROOT_HASH_FILE" + else + log "no $arch proot hash found in $PROOT_HASH_FILE!" + exit 1 + fi -log "building bootstrapZip..." -BOOTSTRAP_ZIP="$(nix build --no-link --print-out-paths --impure ".#bootstrapZip")" + log "building $arch bootstrapZip..." + BOOTSTRAP_ZIP="$(nix build --no-link --print-out-paths --impure ".#bootstrapZip-${arch}")" + UPLOADS+=($BOOTSTRAP_ZIP/bootstrap-$arch.zip) +done log "creating tar ball of current HEAD..." git archive --prefix nix-on-droid/ --output "$SOURCE_FILE" HEAD +UPLOADS+=($SOURCE_FILE) log "uploading artifacts..." -rsync --progress \ - "$SOURCE_FILE" \ - "$BOOTSTRAP_ZIP/bootstrap-aarch64.zip" \ - "$RSYNC_TARGET" +rsync --progress "${UPLOADS[@]}" "$RSYNC_TARGET" diff --git a/templates/minimal/flake.nix b/templates/minimal/flake.nix index 422e490..ab4da67 100644 --- a/templates/minimal/flake.nix +++ b/templates/minimal/flake.nix @@ -13,6 +13,7 @@ outputs = { self, nixpkgs, nix-on-droid }: { nixOnDroidConfigurations.default = nix-on-droid.lib.nixOnDroidConfiguration { + system = "aarch64-linux"; modules = [ ./nix-on-droid.nix ]; }; diff --git a/tests/on-device/config-flake-default.nix b/tests/on-device/config-flake-default.nix index 52d9f82..a3a7d24 100644 --- a/tests/on-device/config-flake-default.nix +++ b/tests/on-device/config-flake-default.nix @@ -10,6 +10,7 @@ outputs = { nix-on-droid, ... }: { nixOnDroidConfigurations = { default = nix-on-droid.lib.nixOnDroidConfiguration { + system = "<>"; modules = [ ./nix-on-droid.nix ]; }; }; diff --git a/tests/on-device/config-flake-h-m.bats b/tests/on-device/config-flake-h-m.bats index aaa54b1..a467731 100644 --- a/tests/on-device/config-flake-h-m.bats +++ b/tests/on-device/config-flake-h-m.bats @@ -10,7 +10,7 @@ load lib # set up / build / activate the configuration cat "$ON_DEVICE_TESTS_DIR/config-flake-h-m.cfg.nix" \ > ~/.config/nixpkgs/nix-on-droid.nix - _sed "s|<>|$FLAKE_URL|g" \ + _sed -e "s|<>|$FLAKE_URL|g" -e "s|<>|$(detect_system)|g" \ "$ON_DEVICE_TESTS_DIR/config-flake-h-m.flake.nix" \ > ~/.config/nixpkgs/flake.nix diff --git a/tests/on-device/config-flake-h-m.flake.nix b/tests/on-device/config-flake-h-m.flake.nix index 8a2f3e2..fa98ad0 100644 --- a/tests/on-device/config-flake-h-m.flake.nix +++ b/tests/on-device/config-flake-h-m.flake.nix @@ -14,6 +14,7 @@ outputs = { nix-on-droid, ... }: { nixOnDroidConfigurations = { device = nix-on-droid.lib.nixOnDroidConfiguration { + system = "<>"; modules = [ ./nix-on-droid.nix ]; }; }; diff --git a/tests/on-device/config-flake-hosts.bats b/tests/on-device/config-flake-hosts.bats index 4625927..394e496 100644 --- a/tests/on-device/config-flake-hosts.bats +++ b/tests/on-device/config-flake-hosts.bats @@ -6,7 +6,7 @@ load lib # set up / build / activate the configuration cat "$ON_DEVICE_TESTS_DIR/config-flake-hosts.cfg.nix" \ > ~/.config/nixpkgs/nix-on-droid.nix - _sed "s|<>|$FLAKE_URL|g" \ + _sed -e "s|<>|$FLAKE_URL|g" -e "s|<>|$(detect_system)|g" \ "$ON_DEVICE_TESTS_DIR/config-flake.nix" \ > ~/.config/nixpkgs/flake.nix @@ -27,7 +27,7 @@ load lib # set up / build / activate the configuration cat "$ON_DEVICE_TESTS_DIR/config-flake-hosts-localhost.cfg.nix" \ > ~/.config/nixpkgs/nix-on-droid.nix - _sed "s|<>|$FLAKE_URL|g" \ + _sed -e "s|<>|$FLAKE_URL|g" -e "s|<>|$(detect_system)|g" \ "$ON_DEVICE_TESTS_DIR/config-flake.nix" \ > ~/.config/nixpkgs/flake.nix diff --git a/tests/on-device/config-flake.bats b/tests/on-device/config-flake.bats index 3a0b2ae..fabfda9 100644 --- a/tests/on-device/config-flake.bats +++ b/tests/on-device/config-flake.bats @@ -17,7 +17,7 @@ function flake_example() { "$CHANNEL_DIR/modules/environment/login/nix-on-droid.nix.default" \ > ~/.config/nixpkgs/nix-on-droid.nix - _sed "s|<>|$FLAKE_URL|g" \ + _sed -e "s|<>|$FLAKE_URL|g" -e "s|<>|$(detect_system)|g" \ "$ON_DEVICE_TESTS_DIR/$flake_file_name" \ > ~/.config/nixpkgs/flake.nix diff --git a/tests/on-device/config-flake.nix b/tests/on-device/config-flake.nix index 31bf1f5..1caa8a6 100644 --- a/tests/on-device/config-flake.nix +++ b/tests/on-device/config-flake.nix @@ -10,6 +10,7 @@ outputs = { nix-on-droid, ... }: { nixOnDroidConfigurations = { device = nix-on-droid.lib.nixOnDroidConfiguration { + system = "<>"; modules = [ ./nix-on-droid.nix ]; }; }; diff --git a/tests/on-device/lib.bash b/tests/on-device/lib.bash index 6654958..7b56ee6 100644 --- a/tests/on-device/lib.bash +++ b/tests/on-device/lib.bash @@ -71,3 +71,8 @@ _diff() { storePath="$(nix-build "" --no-out-link --attr diffutils)" "${storePath}/bin/diff" "$@" } + +detect_system() { + nix --experimental-features nix-command \ + eval --impure --raw --expr 'builtins.currentSystem' +}