Packages
nerves_system_br
0.16.0-2017-11
1.34.0
1.33.9
1.33.8
1.33.7
1.33.6
1.33.5
1.33.4
1.33.3
1.33.2
1.33.1
1.33.0
1.32.5
1.32.4
1.32.3
1.32.2
1.32.1
1.32.0
1.31.7
1.31.6
1.31.5
1.31.4
1.31.3
1.31.2
1.31.1
1.31.0
1.30.1
1.30.0
1.29.3
1.29.2
1.29.1
1.29.0
1.28.3
1.28.2
1.28.1
1.28.0
1.27.3
1.27.2
1.27.1
1.27.0
1.26.1
1.26.0
1.25.3
1.25.2
1.25.1
1.25.0
1.24.1
1.24.0
1.23.3
1.23.2
1.23.1
1.23.0
1.22.8
1.22.7
1.22.6
1.22.5
1.22.4
1.22.3
1.22.2
1.22.1
1.22.0
1.21.6
1.21.5
1.21.4
1.21.3
1.21.2
1.21.1
1.21.0
1.20.6
1.20.5
1.20.4
1.20.3
1.20.2
1.20.1
1.20.0
1.19.1
1.19.0
1.18.6
1.18.5
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.5
1.16.4
1.16.3
1.16.2
1.16.1
1.16.0
1.15.2
1.15.1
1.15.0
1.14.5
1.14.4
1.14.3
1.14.2
1.14.1
1.14.0
1.13.8
1.13.7
1.13.6
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
1.13.0
1.12.4
1.12.3
1.12.2
1.12.1
1.12.0
1.12.0-rc.0
1.11.4
1.11.3
1.11.2
1.11.1
1.11.0
1.10.3
1.10.2
1.10.1
1.10.0
1.9.5
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.7.3
1.7.2
1.7.1
1.7.0
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.2
1.2.1
1.2.0
1.1.0
1.0.1
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1-2017-11
0.16.0-2017-11
0.15.1
0.15.0
0.14.1
0.14.0
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
retired
0.13.3
0.13.2
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.2
0.4.1
Nerves System BR - Buildroot based build platform for Nerves Systems
Current section
Files
Jump to
Current section
Files
nerves_system_br
README.md
README.md
# Nerves System BR[](https://travis-ci.org/nerves-project/nerves_system_br)[](https://hex.pm/packages/nerves_system_br)## IMPORTANT: Configuring builds has changed since the 0.3.3 release. Please reread this document.Nerves is a collection of projects for building Elixir and Erlang-based software for embedded devices.This project is responsible for the core C/C++ libraries, Linux kernel, and baseroot filesystem as highlighted in the following diagram:For most development with Nerves, you may not even need to build this.The new `mix` integration (updated docs coming...) downloadspre-built versions for you. If you are porting Nerves to a new platform,require a special Linux device driver or need to include a C/C++ programin your image, this is the project. Once you have made your Nerves system imageupdates,development returns to Erlang and Elixir.Nerves is under active development. For discussion and questions, please Join us on the \#nerves channel on the [elixir-langSlack](https://elixir-slackin.herokuapp.com/) and see the [\#nerves channel log](http://slack.elixirhq.com/nerves/).## Supported hardwareWe supply base system configurations for the following platforms(follow links for notes): * [Raspberry Pi Zero, A+, B and B+](https://github.com/nerves-project/nerves_system_rpi) * [Raspberry Pi 2 Model B](https://github.com/nerves-project/nerves_system_rpi2) * [Raspberry Pi 3 Model B](https://github.com/nerves-project/nerves_system_rpi3) * [Beaglebone Black](https://github.com/nerves-project/nerves_system_bbb) * [Lego Mindstorms EV3](https://github.com/nerves-project/nerves_system_ev3) * [Logic Supply AG150 (x86)](https://github.com/nerves-project/nerves_system_ag150) * [Intel Galileo Gen 2](https://github.com/nerves-project/nerves_system_galileo) * [Qemu ARM](https://github.com/nerves-project/nerves_system_qemu_arm)This project uses [Buildroot](http://buildroot.net/) to do all of thehard work of building the Linux kernel, various tools and libraries, and thebase root filesystem - hence the 'BR', for Buildroot, in the name of theproject. As a result, if a platform is supported by Buildroot, but not byNerves, it is usually not too difficult to add.## How it worksThe main idea behind Nerves is to use the normal Erlang or Elixir build tools and thencombine their output with a small Linux system that will automatically launch yourapplication. The twist is that everything is cross-compiled. That means that you writecode and build your applications on your laptop or desktop. Nerves packages up the resultso that it can be run on hardware like a Raspberry Pi.If you program in Erlang, you can still use `rebar` and `erlang.mk`. If you programin Elixir, you'll be using `mix`. Before you build your program, though,you'll need to source a set of environment variables from a file called `nerves-env.sh`. (If you'reusing the Nerves `mix` integration, it will do it automatically for you.) The environment variables will makesure that all of the Erlang build tools do the right thing. The most important of theseis to compile for the target hardware rather than your PC.At this point it's useful to see one of the [examples](https://github.com/nerves-project/nerves-examples).If you'd like to see something boot to an Erlang or Elixir prompt on your board, downloada firmware image (.fw) file on the [releases tab](https://github.com/nerves-project/nerves_system_br/releases).Then, 1. Install the [fwup](https://github.com/fhunleth/fwup) utility 2. Plug in a MicroSD card to your computer (via a USB card reader or an internal slot) 3. Run `fwup -a -f <firmware.fw> -t complete`If you're familiar with programming SDCards using `dd(1)`, this is similar.## First time buildBefore you start, you may not need to do this! Check out the `mix` [integration](https://hexdocs.pm/nerves/getting-started.html)if you're an Elixir programmer. In fact, the following WILL confuse you ifyou're new to Nerves. Only read on if you're interested in the mechanics of howNerves works.First, make sure your system has a base set of packages needed to build `nerves_system_br`.On Ubuntu, run the following: sudo apt-get install git g++ libssl-dev libncurses5-dev bc m4 make unzip cmake pythonOn CentOS/RHEL, run the following: sudo yum install git wget patch gcc-c++ ncurses-devel bc openssl-devel bzip2 flex bison perl-Data-Dumper perl-Thread-Queue pythonNerves downloads a large number of files to build the toolchain, Linux kernel, Erlang, and other tools. Nerves will download these files to the location specified by setting the environment variable `NERVES_BR_DL_DIR`. If you do not set this variable it will default to creating a directory at `$HOME/.nerves/cache/buildroot`.Next, you will need to choose an initial platform and configuration. If your desiredplatform doesn't exist, we recommend that you try out Nerves on a supported platformto learn how it works, then port Buildroot to that platform, and then modifya supported configuration for the new board.Change to the nerves_system_br directory and run following to create a build directoryfor your configuration: ./create-build.sh <path to defconfig> <build directory>For example, if you're interested in a Raspberry Pi Model A+, B+ or Zero configuration, checkout the [nerves_system_rpi](https://github.com/nerves-project/nerves_system_rpi)project, since it has the default configuration for those platforms. In your`nerves_system_rpi` directory, run the following: ../nerves_system_br/create-build.sh nerves_config buildTo build, type: cd build makeThe first time build takes a long time since it has to download andbuild lot of code. For the most part, you will not need to rebuildNerves unless you switch platforms or need to add libraries and applicationsthat cannot be pulled in by `rebar`, `mix` or `erlang.mk`.Assuming that your platform supports running from an SDCard, insert an SDCardinto a USB SDCard reader or built-in slot, and run the following: make burnIt should automatically find the SDCard. If it doesn't, you may have to run`fwup` manually. The `fwup` invocation that it tries is displayed for help.For more options, run `make help` or `make buildroot-help`. Also see the configurationsection below. Since Nerves System images are built usingBuildroot, the [Buildroot documentation](https://buildroot.org/docs.html) is an additional resource if you receive an error.## Using NervesNow that you've built a Nerves System, you'll need to activate it before runningany Erlang build tools on your application. source build/nerves-env.shIn the above line, substitute `build` for whatever directory was used to buildthe Nerve System. If you downloaded a pre-built Nerves System, source the `nerves-env.sh`inside of it. When using a rebuilt system, the crosscompiler toolchain must alsobe downloaded. See the [nerves-toolchain project](https://github.com/nerves-project/nerves-toolchain).As stated before, the Nerves `mix` integration takes care of this for you.This step has to be done each time you launch a shell. The key environment settingsupdated by the script are the `PATH` variable and a set of variables that directbuild tools such as `rebar`, `mix`, `relx`, and other `Makefiles` to invoke thecross-compiler.## ConfigurationNerves comes with several configurations out of the box. These can beused directly or just as an examples for your own custom configuration.Nerves configurations are each stored in their own directory. If you'refamiliar with Buildroot, configurations are normally split between the`boards` and `configs` directory. In Nerves, the `boards` directory onlycontains generic information. All information in the `boards` directorycould be duplicated or overridden in the `configs` directory. The main ideas are the same, but theThe expected use case is that most configurations will be stored in separate projectsfrom this one.### Enabling a native library or applicationBuildroot comes with support for a zillion C libraries and applications. Nervesenables the minimum number of packages to keep the base system image small. Examples ofpackages that you may want to add are things like graphics and UI frameworks, commandline utilities, databases, and file system utilities. To browse available packages, go to yourbuild directory and run: make menuconfigIf you can't find a package, try typing `/` to search for it. After you have enableda package, save your changes and exit menuconfig. The changes are saved to the `.config` filein your build directory. To save them to your platform's `_defconfig` file, run `make savedefconfig`.Enabling an application or library is only part of the process to getting it to work. Ifthat package needs to write to the filesystem, it may need to be configured towrite to `/root` or another location since Nerves keeps the root filesystem readonly.This is done on purpose to avoid corrupting the root filesystem.Be aware that Buildroot caches the root filesystem between buildsand that when you deselect a configuration option, it will notdisappear from the Nerves root file system image until a cleanbuild.### Enabling a Linux kernel driverIf you have a piece of hardware that requires a special Linux driver that isn'tenabled by default, run: make linux-menuconfigThis will let you config kernel options. When done, save and exit. Like before,the configuration is saved to your build directory. To make the change permanent,run `make linux-savedefconfig` and copy the defconfig (see `build/linux-*/defconfig`)to your configuration directory. You may need to run `make menuconfig` to updatethe location of the Linux defconfig that should be used.### Enabling simple commandline utilitiesIf you're looking for many standard commandline utilities like `ls(1)`, `dd(1)`,`cat(1)`, etc., they'll be in a package called Busybox. Nerves disables most ofthem since it uses the Erlang, Elixir, or LFE shells. To enable more of them,run: make busybox-menuconfigJust like the other configuration menus, when you exit menuconfig, the optionswill only be stored in your build directory. To make them permanent, run `make busybox-savedefconfig`and save the `.config` (see `build/busybox-*/.config`) to your configurationdirectory. You will need to run `make menuconfig` to update the location ofthe Busybox configuration.## Configuration NotesThe default configurations have two purposes. The first is to generate thesystem images required for the Nerves `mix` integration. The second is as a simple regressiontest for the main platforms on travis (that's why the builds output `.fw` files). For regression testing, some Erlangapplications are enabled to exercise cross-compile scenarios. Rest assured, ifyour application doesn't use these, they won't be included in the firmwareimages that you build.### nerves-configThe `nerves-config` project generates a simple OTP application for the defaultfirmware. It creates a firmware image with the following features: * Almost minimal - Nerves images can be smaller, but these represent a reasonable lower bound on size * Boots to an Erlang/Elixir/LFE prompt * Includes at least on NIF - To test NIF support (`crypto`) * Supports Erlang Distribution (uses sname and `democookie`)