Monthly Archives: July 2017

Cross-compiling with snapcraft: iota

Last week I snapped iota, a small editor with emacs and vi modes.

I decided I wanted to try it out on a Raspberry Pi before pushing it to the snappy store, for that I need to cross-compile. Conveniently I recently implemented support for that in snapcraft.

If you didn’t follow the previous step from my previous blog post, to try what I’m about to do, you’ll need a fresh clone of my iota branch.

git clone git@github.com:kalikiana/iota.git
cd iota
git checkout snapcraft

If on the other hand, like me, you built a snap for another architecture before, in my case amd64, I need to clean the build files.

snapcraft clean

Now on to the most difficult step:

snapcraft --target=arch=armhf

Time for a cup of coffee!

Once it’s done, you can use SSH (or whatever your preferred method is) to copy the snap to your Raspberry Pi 2 or 3 running Ubuntu Core.

snapcraft install --dangerous --classic iota_0+git.67643b3_armhf.snap

Now I can use iota as my editor on the Raspberry Pi!

iota

Packaging rust with snapcraft: iota

Iota is a small editor for your terminal, with support for emacs hotkeys or vi-style commands, syntax highlighting, and easily hackable, written in Rust… now wouldn’t it be awesome if I could install it easily as a snap? So I figured I’d contribute a snapcraft YAML in my lunch break. Here’s how I did it.

Head to https://github.com/gchp/iota and hit Fork on the top right. Let GitHub work its magic. Once it’s done I can checkout the code.

git clone git@github.com:kalikiana/iota.git
cd iota
snapcraft init

At this stage I’ve got a local copy of iota and a snap/snapcraft.yaml that was automatically created for me. Some editing is needed.

name: iota
summary: Iota is a terminal-based text-editor written in Rust
description: |
  100% open source
  highly extensible/customisable/scriptable
  fast & efficient - designed with modern hardware in mind
  cross platform - it should work anywhere
  developer friendly - it should just "get out of the way"
  Rust tooling integration

The fields name, summary and description are pretty self-explanatory, especially given the template snapcraft init creates. I just picked some wording from iota’s README.md.

version: git
grade: devel
confinement: classic

I used version: git here because it just picks up the tag or commit hash, and it’s good enough for an unstable build anyway. confinement: classic is much more interesting here because this is an editor, and I want to be able to edit all the files on my system. confinement: strict wouldn’t allow that as it restricts access to specific folders only used by the snap itself.

apps:
  iota:
    command: bin/iota

Note how I’m specifying bin here explicitly. Classic snaps don’t get any path magic unlike their strict counterparts.

parts:
  iota:
    plugin: rust
    rust-channel: nightly

Now as for the actual build instructions I don’t really have to do much. iota specifies all its dependencies in its Cargo.toml so no build-packages or stage-packages are necessary. The only thing I need to specify here is the nightly channel since iota requires unstable rust features.

snapcraft

This takes a while as rustup downloads the toolchain and crates needed behind the scenes. High time to grab that lunch my break is meant for.

Fast-forward, I’m installing the result of that build.

snapcraft install --dangerous --classic iota_0+git.67643b3_amd64.snap

Now I can use iota as my editor!

Last but not least, after some testing:

git add snap/snapcraft.yaml
git commit -p -v
git checkout -B snapcraft
git push origin snapcraft

Finally, I’m opening a pull request on GitHub.