2014-06-24 17:24:54 +01:00
Building libmraa {#building }
2014-05-29 14:51:38 +01:00
===============
2015-11-17 21:33:04 +01:00
libmraa uses cmake in order to make compilation relatively painless. CMake runs
build out of tree so the recommended way is to clone from git and make a `build/`
2015-02-09 16:40:47 +00:00
directory inside the clone directory.
2014-05-29 14:51:38 +01:00
2016-03-28 14:03:39 +02:00
For building imraa check [building imraa ](./imraa.md )
2015-01-16 14:01:43 +00:00
## Build dependencies
Not all these are required but if you're unsure of what you're doing this is
what you'll need:
2015-02-09 16:40:47 +00:00
* [SWIG ](http://swig.org ) 3.0.5+
* [git ](http://git-scm.com )
* [python ](http://python.org ) 2.7 or 3.4+ (you'll need not just the interpreter but python-dev)
2016-08-30 15:53:39 +01:00
* [node.js ](http://nodejs.org ) 4.x recommended (you'll need not just the interpreter but nodejs-dev)
2016-01-23 16:35:20 +03:00
* [CMake ](http://cmake.org ) 2.8.8+ (3.1+ is recommended for node.js version 2+)
2016-08-30 15:53:39 +01:00
* [json-c ](https://github.com/json-c/json-c ) 0.12+ (0.10+ probably works in reality)
2015-03-29 15:45:36 +01:00
2015-11-17 21:19:31 +01:00
For Debian-like distros the below command installs the basic set:
```bash
2016-08-30 15:53:39 +01:00
sudo apt-get install git build-essential swig3.0 python-dev nodejs-dev cmake libjson-c-dev
2015-11-17 21:19:31 +01:00
```
2015-03-29 15:45:36 +01:00
To build the documentation you'll also need:
2015-03-27 16:30:25 +00:00
* [Doxygen ](http://www.stack.nl/~dimitri/doxygen/ ) 1.8.9.1+
2015-11-17 21:33:04 +01:00
* [Graphviz ](http://graphviz.org/ ) 2+ (For Doxygen graph generation)
2015-03-27 16:30:25 +00:00
* [Sphinx ](http://sphinx-doc.org/ ) 1.1.3+ (For Python docs)
2015-01-14 15:56:07 +00:00
2015-04-02 13:54:38 +01:00
2015-01-16 14:01:43 +00:00
## Basic build steps
2014-07-03 09:40:09 +01:00
2014-05-29 14:51:38 +01:00
~~~~~~~~~~~~~{.sh}
mkdir build
cd build
cmake ..
make
~~~~~~~~~~~~~
2015-01-16 14:01:43 +00:00
If this goes wrong and you have all the dependencies installed, then please
file an issue with the full output of `cmake ..` and `make` or however far you
got.
2015-11-17 21:19:31 +01:00
After that you can install built files (into default path) by running:
```bash
sudo make install
```
See flags for adjusting install paths in the section below.
Currently our install logic puts Python bindings into standard paths, which
do not work on Debian due to their
[policy ](http://www.debian.org/doc/packaging-manuals/python-policy/ch-python.html#s-paths ).
2016-08-30 15:53:39 +01:00
We are working on a permanent solution, in the meantime please use this command
after `make install` to link installed modules where Debian's Python expects
them:
2015-11-17 21:19:31 +01:00
```bash
sudo ln -s <your install prefix, e.g. /usr>/lib/python2.7/site-packages/* /usr/lib/python2.7/dist-packages
```
Same approach works for Python 3, you'll just need to adjust the version number
in the path accordingly.
2015-01-16 14:01:43 +00:00
## Configuration flags
2015-11-17 21:33:04 +01:00
Our CMake configuration has a number of options, `cmake-gui` or `ccmake` (`cmake -i` is
2015-01-14 15:56:07 +00:00
no longer with us :() can show you all the options. A few of the more common
2015-11-17 21:33:04 +01:00
ones are listed below. Note that when the option starts with `CMAKE_` it's an
option that is made available by CMake and will be similar in all CMake
projects. You need to add them after `cmake` but before `..`
2014-05-29 14:51:38 +01:00
2015-01-14 15:56:07 +00:00
A few recommended options:
2014-05-29 14:51:38 +01:00
2015-11-17 21:33:04 +01:00
Changing install path from `/usr/local` to `/usr` :
`-DCMAKE_INSTALL_PREFIX:PATH=/usr`
Building debug build - adds `-g` and disables optimisations - this will force a
2015-02-09 16:40:47 +00:00
full rebuild:
2015-11-17 21:33:04 +01:00
`-DCMAKE_BUILD_TYPE=DEBUG`
2014-05-29 14:51:38 +01:00
2015-11-17 21:33:04 +01:00
Using `clang` instead of `gcc` :
`-DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++`
2014-05-29 14:51:38 +01:00
2015-11-17 21:33:04 +01:00
Building with an older version of SWIG (< 3.0.2) requires the disabling of JavaScript:
`-DBUILDSWIGNODE=OFF`
2014-10-03 19:00:45 +01:00
2015-11-17 21:33:04 +01:00
Disabling Python module building:
`-DBUILDSWIGPYTHON=OFF`
2014-11-09 12:26:09 +00:00
2015-02-09 16:40:47 +00:00
Building doc, this will require [SPHINX ](http://sphinx-doc.org ) &
[Doxygen ](http://doxygen.org ):
2015-11-17 21:33:04 +01:00
`-DBUILDDOC=ON`
2016-08-30 15:53:39 +01:00
You will also require clone git submodules from your existing checkout:
`git submodule update --init --recursive`
The from doxygen2jsdoc dir:
`npm install mkdirp commander lodash bluebird pegjs`
2014-11-09 12:26:09 +00:00
2015-11-17 21:33:04 +01:00
Override build architecture (this is useful because on x86 ARM code is not
2015-04-04 19:04:05 +01:00
compiled so use this flag to force the target arch)
2015-11-17 21:33:04 +01:00
`-DBUILDARCH=arm`
2015-04-04 19:04:05 +01:00
2016-09-13 11:20:40 +01:00
You can also enable -Wall for gcc before running cmake by exporting your wanted
CC flags to the CC env var
`export CC="gcc -Wall"`
2017-02-21 17:27:04 +00:00
Sometimes it's nice to build a static libary, on Linux systems just set
`-DBUILD_SHARED_LIBS=OFF`
2015-02-09 16:40:47 +00:00
## Dependencies continued
2015-01-16 14:01:43 +00:00
2015-02-09 16:40:47 +00:00
You'll need at least SWIG version 3.0.2 and we recommend 3.0.5 to build the
2015-11-17 21:33:04 +01:00
JavaScript & Python modules. If your version of SWIG is older than this then
please see above for disabling `SWIGNODE` . Otherwise you will get a weird build
failure when building the JavaScript module. The Python module builds with SWIG
2016-08-30 15:53:39 +01:00
2.x but we don't test it.
2015-01-16 14:01:43 +00:00
2015-02-09 16:40:47 +00:00
During the build, we'll assume you're building from git, note that if you
2016-08-30 15:53:39 +01:00
compile with `git` installed your version of mraa will be versioned with `git
desribe --tag` to make it easy for intentification. You can easily modify
version.c in build/src. If you don't build from a git tree then you will simply
have a version which matches the latest released version of mraa.
2015-01-16 14:01:43 +00:00
2015-11-17 21:33:04 +01:00
## Using a Yocto/OE toolchain
2014-11-10 20:48:27 +00:00
2015-11-17 21:33:04 +01:00
In order to compile with a Yocto/OE toolchain use the following toolchain file.
2015-11-17 21:38:21 +01:00
This works well on the Edison 1.7.2 SDK. First source the environment file, then
2015-11-17 21:33:04 +01:00
use our CMake toolchain file.
2014-11-10 20:48:27 +00:00
~~~~~~~~~~~~~{.sh}
2015-11-17 21:38:21 +01:00
source /opt/poky-edison/1.7.2/environment-setup-core2-32-poky-linux
2014-11-10 20:48:27 +00:00
mkdir build
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchains/oe-sdk_cross.cmake ..
make
~~~~~~~~~~~~~
2015-11-17 21:33:04 +01:00
## Using Coverity
2014-10-03 19:00:45 +01:00
2015-11-17 21:33:04 +01:00
This is the procedure to submit a build to Coverity. You'll need to install
`coverity-submit` for your OS.
2014-10-03 19:00:45 +01:00
~~~~~~~~~~~~~{.sh}
mkdir covbuild/ && cd covbuild
cmake -DBUILDDOC=OFF -DBUILDSWIG=OFF ..
cov-build --dir cov-int make
2014-11-25 13:26:17 +00:00
tar caf mraa.tar.bz2 cov-int
2014-10-03 19:00:45 +01:00
~~~~~~~~~~~~~
2015-04-13 13:23:13 +00:00
## Building Java bindings
2015-11-17 21:33:04 +01:00
Have JAVA_HOME set to JDK install directory. Most distributions set this from `/etc/profile.d/`
and have a way of switching between alternatives. We support both OpenJDK and Oracle's JDK.
On Arch Linux with OpenJDK 8 you'll have to set this yourself like this:
2015-07-16 11:33:03 +01:00
~~~~~~~~~~~~~{.sh}
export JAVA_HOME=/usr/lib/jvm/default/
~~~~~~~~~~~~~
2015-11-17 21:33:04 +01:00
Then use the CMake configuration flag:
`-DBUILDSWIGJAVA=ON`
To compile `Example.java`
2015-04-13 13:23:13 +00:00
~~~~~~~~~~~~~{.sh}
javac -cp $DIR_WHERE_YOU_INSTALLED_MRAA/mraa.jar:. Example.java
~~~~~~~~~~~~~
2015-11-17 21:33:04 +01:00
To run, make sure `libmraajava.so` is in `LD_LIBRARY_PATH`
2015-04-13 13:23:13 +00:00
~~~~~~~~~~~~~{.sh}
jave -cp $DIR_WHERE_YOU_INSTALLED_MRAA/mraa.jar:. Example
~~~~~~~~~~~~~
2015-07-31 15:01:03 +01:00
2016-01-14 16:09:56 +02:00
If you want to add or improve Java bindings for mraa, please follow the [Creating Java Bindings Guide ](https://github.com/intel-iot-devkit/upm/blob/master/docs/creating_java_bindings.md ).
2015-11-17 21:33:04 +01:00
## Building an IPK/RPM package using `cpack`
2015-07-31 15:01:03 +01:00
2015-11-17 21:33:04 +01:00
You can get `cpack` to generate an IPK or RPM package fairly easily if you have
2015-07-31 15:01:03 +01:00
the correct packaging tools
~~~~~~~~~~~~~{.sh}
2016-05-04 17:26:02 +01:00
cmake -DIPK=ON -DCMAKE_INSTALL_PREFIX=/usr ..
2015-07-31 15:01:03 +01:00
make package
~~~~~~~~~~~~~
2015-11-17 21:33:04 +01:00
To use RPM simply enable the RPM option. You'll need `rpmbuild` installed on your
2015-07-31 15:01:03 +01:00
build machine.
~~~~~~~~~~~~~{.sh}
2016-05-04 17:26:02 +01:00
cmake -DRPM=ON -DCMAKE_INSTALL_PREFIX=/usr ..
2015-07-31 15:01:03 +01:00
~~~~~~~~~~~~~
2016-12-23 15:29:25 +00:00
## Building for Peripheralmanager Android Things
~~~~~~~~~~~~~{.sh}
cmake -DBUILDSWIG=OFF -DBUILDARCH=PERIPHERALMAN -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk-r13b/build/cmake/android.toolchain.cmake ..
~~~~~~~~~~~~~