Skip to content

Commit

Permalink
Merge pull request #486 from phil-opp/building-on-android
Browse files Browse the repository at this point in the history
Add extra post about building on Android
  • Loading branch information
phil-opp committed Oct 24, 2018
2 parents bf59190 + 8330447 commit 7df441c
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 0 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
107 changes: 107 additions & 0 deletions blog/content/second-edition/extra/building-on-android/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
+++
title = "Building on Android"
order = 3
template = "second-edition/extra.html"
+++

I finally managed to get `blog_os` building on my Android phone using [termux](https://termux.com/). This post explains the necessary steps to set it up.

<img src="building-on-android.png" alt="Screenshot of the compilation output from android" style="height: 50rem;" >


### Install Termux and Nightly Rust

First, install [termux](https://termux.com/) from the [Google Play Store](https://play.google.com/store/apps/details?id=com.termux) or from [F-Droid](https://f-droid.org/packages/com.termux/). After installing, open it and perform the following steps:

- Install fish shell, set as default shell, and launch it:
```
pkg install fish
chsh -s fish
fish
```

This step is of course optional. However, if you continue with bash you will need to adjust some of the following commands to bash syntax.

- Install some basic tools:
```
pkg install wget tar
```

- Add the [community repository by its-pointless](https://wiki.termux.com/wiki/Package_Management#By_its-pointless_.28live_the_dream.29:):
```
wget https://its-pointless.github.io/setup-pointless-repo.sh
bash setup-pointless-repo.sh
```

- Install cargo and a nightly version of rustc:
```
pkg install rustc cargo rustc-nightly
```

- Prepend the nightly rustc path to your `PATH` in order to use nightly (fish syntax):
```
set -U fish_user_paths $PREFIX/opt/rust-nightly/bin/ $fish_user_paths
```

Now `rustc --version` should work and output a nightly version number.

### Install Git and Clone blog_os

We need something to compile, so let's download the `blog_os` repository:

- Install git:
```
pkg install git
```

- Clone the `blog_os` repository:
```
git clone https://github.com/phil-opp/blog_os.git
```

If you want to clone/push via SSH, you need to install the `openssh` package: `pkg install openssh`.

### Install Xbuild and Bootimage

Now we're ready to install `cargo xbuild` and `bootimage`

- Run `cargo install`:
```
cargo install cargo-xbuild bootimage
```

- Add the cargo bin directory to your `PATH` (fish syntax):
```
set -U fish_user_paths ~/.cargo/bin/ $fish_user_paths
```

Now `cargo xbuild` and `bootimage` should be available. It does not work yet because `cargo xbuild` needs access to the rust source code. By default it tries to use rustup for this, but we have no rustup support so we need a different way.

### Providing the Rust Source Code

The Rust source code corresponding to our installed nightly is available in the [`its-pointless` repository](https://github.com/its-pointless/its-pointless.github.io):

- Download a tar containing the source code:
```
wget https://github.com/its-pointless/its-pointless.github.io/raw/master/rust-src-nightly.tar.xz
```

- Extract it:
```
tar xf rust-src-nightly.tar.xz
```

- Set the `XARGO_RUST_SRC` environment variable to tell cargo-xbuild the source path (fish syntax):
```
set -Ux XARGO_RUST_SRC ~/rust-src-nightly/rust-src/lib/rustlib/src/rust/src
```

Now cargo-xbuild should no longer complain about a missing `rust-src` component. However it will throw an I/O error after building the sysroot. The problem is that the downloaded Rust source code has a different structure than the source provided by rustup. We can fix this by adding a symbolic link:

```
ln -s ~/../usr/opt/rust-nightly/bin ~/../usr/opt/rust-nightly/lib/rustlib/aarch64-linux-android/bin
```

Now `cargo xbuild --target x86_64-blog_os.json` and `bootimage build` should both work!

I couldn't get QEMU to run yet, so you won't be able to run your kernel. If you manage to get it working, please tell me :).
12 changes: 12 additions & 0 deletions blog/templates/second-edition/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,18 @@ <h2 class="post-title">First Edition</h2>
You are viewing the second edition of “Writing an OS in Rust”, which is still in progress. The <a href="{{ get_url(path = "/first-edition") }}">first edition</a> has more content, but is no longer updated. We try our best to incorporate the missing content soon.
</div>

<hr>
{% set extra = get_section(path = "second-edition/extra/_index.md") %}
<h1>{{ extra.title }}</h1>
<ul>
{% for subsection in extra.subsections|reverse %}
<li><a href="/{{ subsection.path | safe }}">{{ subsection.title }}</a></li>
{% endfor %}
{% for page in extra.pages|reverse %}
<li><a href="/{{ page.path | safe }}">{{ page.title }}</a></li>
{% endfor %}
</ul>

<aside id="recent-updates">
<h2>Recent Updates</h2>
{% include "recent-updates.html" %}
Expand Down

0 comments on commit 7df441c

Please sign in to comment.