From 4018b987bf471133994105cc175303dceef4d0ce Mon Sep 17 00:00:00 2001 From: Alexander Sosedkin Date: Mon, 30 Dec 2019 02:41:27 +0100 Subject: [PATCH] Add a build script to patch paths and inject proot --- .gitignore | 1 + build.sh | 58 +++++++++++++++++++++++ modules/environment/login/default.nix | 9 ++-- modules/environment/login/login-inner.nix | 11 +++++ 4 files changed, 76 insertions(+), 3 deletions(-) create mode 100755 build.sh diff --git a/.gitignore b/.gitignore index 750baeb..cb3d983 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ result result-* +out diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..ac1d3be --- /dev/null +++ b/build.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +set -e + +repo=${repo:-t184256/nix-on-droid-bootstrap} # set this to your fork! +branch=${branch:-$(git rev-parse --abbrev-ref HEAD)} + +arches='aarch64 i686' +nixOnDroidChannelURL=https://github.com/$repo/archive/$branch.tar.gz + +mkdir -p out +rm -f out/* +for arch in $arches; do + echo $arch: building talloc... + nix build --show-trace -f pkgs --argstr arch $arch tallocStatic -o out/talloc-$arch + talloc=$(realpath out/talloc-$arch) + + echo $arch: building proot... + nix build --show-trace -f pkgs --argstr arch $arch prootTermux -o out/proot-$arch + proot=$(realpath out/proot-$arch) + + echo $arch: patching proot path in modules/environment/login/default.nix... + grep "$arch = \"/nix/store/" modules/environment/login/default.nix + sed -i "s|$arch = \"/nix/store/.*\";|$arch = \"$proot\";|" modules/environment/login/default.nix + grep "$arch = \"/nix/store/" modules/environment/login/default.nix + + echo $arch: building nix-on-droid... + nix build --show-trace -f pkgs --argstr arch $arch --argstr nixOnDroidChannelURL $nixOnDroidChannelURL bootstrapZip -o out/nix-on-droid-$arch + + echo $arch: injecting talloc/proot for initial bootstrap + pwd + + cat out/nix-on-droid-$arch/bootstrap-$arch.zip > out/bootstrap-$arch.zip + nix-store --export --readonly-mode $talloc > out/talloc-$arch.closure + nix-store --export --readonly-mode $proot > out/proot-$arch.closure + + mkdir out/repack-$arch + pushd out/repack-$arch >/dev/null + unzip -q ../bootstrap-$arch.zip + rm ../bootstrap-$arch.zip + cp ../talloc-$arch.closure ./talloc.closure + cp ../proot-$arch.closure ./proot.closure + zip --quiet -r ../bootstrap-$arch.zip . + popd >/dev/null + chmod -R +w out/repack-$arch + rm -rf out/repack-$arch +done + + +if [ -z "$rsync_to" ]; then + echo 'Done. Now put out/bootstrap-*.zip on some HTTP server and point the app to it. Good luck!' +else + if [ $branch == master ]; then + rsync -vP out/bootstrap-*.zip "$rsync_to/bootstrap/" + else + rsync -vP out/bootstrap-*.zip "$rsync_to/bootstrap-$branch/" + fi +fi diff --git a/modules/environment/login/default.nix b/modules/environment/login/default.nix index 70f1380..1e8540a 100644 --- a/modules/environment/login/default.nix +++ b/modules/environment/login/default.nix @@ -84,9 +84,12 @@ in inherit login loginInner; prootStatic = - if config.build.arch == "aarch64" - then "/nix/store/r09n7pp4fwhrld2a1k2al6bgdx2qqfaj-proot-termux-unstable-2019-09-05-aarch64-unknown-linux-android" - else "/nix/store/ccv4y9ndl1w7ksmwnsr9jm2iwnrrbgcq-proot-termux-unstable-2019-09-05-i686-unknown-linux-android"; + let crosscompiled_paths = { + aarch64 = "/nix/store/r09n7pp4fwhrld2a1k2al6bgdx2qqfaj-proot-termux-unstable-2019-09-05-aarch64-unknown-linux-android"; + i686 = "/nix/store/4gpm0rmrq0mm69kl3cb1gjslr7ihhp01-proot-termux-unstable-2019-09-05-i686-unknown-linux-android"; + }; + in + "${crosscompiled_paths.${config.build.arch}}"; }; }; diff --git a/modules/environment/login/login-inner.nix b/modules/environment/login/login-inner.nix index 6a38a15..c0fb3c0 100644 --- a/modules/environment/login/login-inner.nix +++ b/modules/environment/login/login-inner.nix @@ -32,6 +32,17 @@ writeText "login-inner" '' export NIX_SSL_CERT_FILE=${cacert} + if [ -r ${config.build.installationDir}/proot.closure ]; then + echo "Injecting bundled talloc closure..." + ${nix}/bin/nix-store --import < ${config.build.installationDir}/talloc.closure + ${coreutils}/bin/rm -f ${config.build.installationDir}/talloc.closure + echo "Injecting bundled proot closure..." + ${nix}/bin/nix-store --import < ${config.build.installationDir}/proot.closure + ${coreutils}/bin/rm -f ${config.build.installationDir}/proot.closure + else + echo "No bundled talloc/proot closures found, which is OK for official builds..." + fi + echo "Installing and updating nix-channels..." ${nix}/bin/nix-channel --add ${config.build.channel.nixpkgs} nixpkgs ${nix}/bin/nix-channel --update nixpkgs