diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..34ed36b --- /dev/null +++ b/build.sh @@ -0,0 +1,153 @@ +#!/usr/bin/env bash + +# Copyright (c) 2019-2020, see AUTHORS. Licensed under MIT License, see LICENSE. + +# If you want to change something in this repo and now you're wondering +# how to recompile Nix-on-Droid with your changes and put it to your device, +# wonder no more! + +# One of the simplest scenarios would be forking it on GitHub: +# * fork it to github.com/YOUR_USERNAME/nix-on-droid +# * change something, commit your changes to some BRANCH +# * push it +# * nix build --show-trace -f pkgs --argstr arch aarch64 \ +# --argstr nixOnDroidChannelURL \ +# https://github.com/YOUR_USERNAME/nix-on-droid/archive/BRANCH.tar.gz \ +# bootstrapZip -o out/nix-on-droid-aarch64 +# * put out/nix-on-droid-aarch64/bootstrap-aarch64.zip to some HTTP server +# * install the app and, on first startup, enter the URL of the directory +# containing the resulting zip file, start the installation + +# The zipfile will be used to provide proot and kickstart the installation, +# it will build what's available from nixOnDroidChannelURL you've specified, +# (i.e., what you've pushed to BRANCH), and the resulting system will be +# subscribed to the updates that you push to the specified BRANCH of your fork. +# But note: this way proot is not updatable without reinstalling, see below. + +# If you just want to change something and test it, this should be enough. +# This probably doesn't warrant a script, you can just run the command above +# and call it a day. If you don't need to maintain a long-term fork, do it. +# You can stop reading here. + +# But, in some cases, you need to be concerned with more things than that. +# Maybe you don't want to use GitHub. +# Maybe you don't want to bother with forking or pushing. +# Maybe you need to maintain a long-term fork and ship updates to proot. +# Maybe you want to automate and streamline the whole process. +# If that's the case, read more to find out what to do and how to do it. + +# --- + +# There are three distinct things built from this repo: +# 1. A zipfile with the installer (zipball), +# which has to be downloaded from some web server during the installation, +# the user is asked for location on the initial app startup. +# (https://nix-on-droid.unboiled.info/bootstrap + /bootstrap-$arch.zip +# for the official builds, the user can override the first part). +# Needed only once, doesn't matter after the installation. +# 2. Sources for building nix-on-droid-specific packages on device, +# which also have to be put somewhere on the web. If you push to GitHub, +# you already have them published in a nix-channel usable form. +# But it's also possible to point to an arbitrary URL. +# The initial location is baked into the installer tarball, +# it's later reconfigurable with 'nix-channel'. +# This is how most updates are shipped. +# 3. Proot binaries. Unfortunately, they can't be built natively and still work +# (and nobody knows why), so the mess above is not enough. +# Installer zipball can be used to deliver the initial proot binary, +# but if you want to deliver updates, you need some third option. +# The official builds address that by having all the installations trust +# `nix-on-droid.cachix.org` and pushing binaries there. +# If you want to maintain a long-term fork, you should create your own +# and do the same, or the only way of updating proot +# would be through reinstallation. + +# That's a lot of stuff, and the developers have come up with workflows +# progressively more rich and twisted than `nix build ... && rsync ...`. +# Feel free to pick up tricks below and/or modify the script to suit your needs. + +set -e + +arches=${arches:-aarch64 i686} +# If you only care about aarch64, run as `arches=aarch64 ./build.sh`. + +# Create/clear the output directory. +mkdir -p out +rm -f out/* + +for arch in $arches; do + + # Build proot for the target architecture. + # We don't really need to compile it separately... + echo $arch: building proot... + nix build --show-trace -f pkgs --argstr arch $arch prootTermux -o out/proot-$arch + proot=$(realpath out/proot-$arch) + + # ... except for the rare case you've advanced pinned nixpkgs + # or changed something regarding proot compilation, + # and now the hashes have changed and we have to update them. + 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 + # Since proot has to be cross-compiled and cannot be built on device, + # it's also a good idea to push it to cachix, or existing installations + # wouldn't be able to pick up the changes. + + if [[ -z $channel_url ]]; then + # It is enough to push your changes to GitHub to + # you have nix-on-droid sources downloadable from there. + # Let's figure out the URL. + branch=${branch:-$(git rev-parse --abbrev-ref HEAD)} # overrideable + tracking=$(git config branch.${branch}.remote) + url=$(git remote get-url $tracking) + if [[ -z "$channel_url" ]]; then + if [[ -z "$github_repository" ]]; then + if [[ $url =~ git@github.com:* ]]; then + autodetected_repository=${url##git@github.com:} + elif [[ $url =~ https://github.com/* ]]; then + autodetected_repository=${url##https://github.com} + fi + if [[ $autodetected_repository =~ *.git ]]; then + autodetected_repository=${autodetected_repository%%.git} + fi + echo $arch: autodetected repository: $autodetected_repository + if [[ $autodetected_repository == 't184256/nix-on-droid' ]]; then + if [[ $USER != 'monk' ]]; then + echo 'Failed to autodetect the URL of your fork.' + echo 'Set either github_repository or channel_url.' + exit 1 + fi + fi + channel_url=${channel_url:-https://github.com/$autodetected_repository/archive/$branch.tar.gz} + echo $arch: autodetected channel URL: $channel_url + fi + fi + else + # Build channel tarball, + # later optionally push it somewhere along with the installation zipball + : + fi + + +### not annotated yet ### + + +nixOnDroidChannelURL=${nixOnDroidChannelURL:-$channel_url} + + 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 + + if [ -z "$rsync_to" ]; then + echo "Done. Now put out/nix-on-droid-$arch/bootstrap-$arch.zip on some HTTP server and point the app to it. Good luck!" + else + if [ $branch == master ]; then + tgt="$rsync_to/bootstrap/" + else + tgt="$rsync_to/bootstrap-$branch/" + fi + echo rsyncing to $tgt... + rsync -vP out/nix-on-droid-$arch/bootstrap-*.zip $tgt + fi +done