DISCLAIMER: this guide works for SDK version 1.7.2. If you have another version, verify file/URL names in the following.
You need the edison cross-compile toolchain from Intel website (main page is here). Download it from there or proceed as follows:
$ curl -O http://downloadmirror.intel.com/25028/eng/edison-sdk-macosx-ww25.5-15.zip
$ unzip edison-sdk-macosx-ww25.5-15.zip
$ cd edison-sdk-macosx-ww25.5-15
$ sudo mkdir -p /opt/poky-edison/1.7.2/
$ sudo tar -xvf poky-edison-eglibc-i386-edison-image-core2-32-toolchain-1.7.2.tar -C /opt/poky-edison/1.7.2/This sets up the x-compiling file structure. For actually using it, you have to issue source /opt/poky-edison/1.7.2/environment-setup-core2-32-poky-linux in your terminal, so that the appropriate env variables and paths get set.
Warning: I suspect that the script /opt/poky-edison/1.7.2/environment-setup-core2-32-poky-linux has at least one error at line 27, since all the LDFLAGS there reported are unsupported by the gcc cross-compiler. I have changed the line to export LDFLAGS="" and got no issues til now. Attached there is a patch for this (apply it with patch /opt/poky-edison/1.7.2/environment-setup-core2-32-poky-linux environment-setup.diff).
Warning 2: Another suspect: if you try to compile a C++ program, it will probably fail complaining about missing <iostream> (or any other C++ header). For fixing it, I replaced line 11 of environment-setup-core2-32-poky-linux with the following line (adding two include dirs):
export CXX="i586-poky-linux-g++ -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -mstackrealign -fno-omit-frame-pointer --sysroot=$SDKTARGETSYSROOT -I${SDKTARGETSYSROOT}/usr/include/c++/4.9.1 -I${SDKTARGETSYSROOT}/usr/include/c++/4.9.1/i586-poky-linux"Unfortunately version 1.7.2 of Intel toolkit is broken, and the ar command won't run complaining about the missing libfl.2.dylib. This is part of the Flex lexer. To fix this issue, download the flex library from sourceforge, then configure and compile it as follows:
$ bunzip flex-2.6.0.tar.bz2 && tar xvf flex-2.6.0.tar
$ cd flex-2.6.0
$ ./configure --prefix=/opt/poky-edison/1.7.2/sysroots/i386-pokysdk-darwin/usr/ CFLAGS='-arch i386'
$ make -j8
$ sudo make installNote the CFLAGS switch: by default, on OS X gcc compiles for the 64-bit architecture, but the rest of the SDK commands are in i386 32-bit format. So you have to provide i586-poky-linux-ar an i386 shared library to link against, and thus that CFLAGS switch is mandatory.
From now on, just remember to:
$ source /opt/poky-edison/1.7.2/environment-setup-core2-32-poky-linuxbefore start compiling. Now x-compiling GCC suite of commands are in path as i586-poky-linux-[gcc|g++|ar|ld|nm|...].
In the following I am reporting a few examples of cross-compiling of useful libraries and commands. For a clean approach, I suggest to install every custom dynamic library on /usr/local/lib on your Edison. Note though, that /usr/local/lib is not in the list the system search paths for the dynamic object loader (ld), so the best you can do is probably:
$ echo "/usr/local/lib" >> /etc/ld.so.conf
$ ldconfigLuckily enough, networking is pretty well arranged by default on Edison. In order to simplify file transfer between your desktop and the Edison, I found the following setup very convenient.
- Use ssh config file and the USB-based ethernet connection. Wnen you plug in the Edison, it exposes an Ethernet connection with the address 192.168.2.15. Setup a static IP on your machine on the same subnet, install your public
id_rsa.pubkey on the Edison, and configure the.ssh/configfile so that you only have to typessh edisonto connect via fast and stable USB-tunneled secure shell. - Use
sshfs: I have an empty$HOME/mntmountpoint that I use as:sshfs edison:/home/root mnt. This way I have the whole content of my home folder on the Edison available on my machine as~/mnt. Very handy. - Now you can use
$HOME/mnt/localas prefix path when youmake installin your cross-compilations: after that, you'll find the binaries, libraries, and headers straight on the Edison on~/local. Move to the Edison shell andcp -av ~/local/* /usrto install the products under/usr/. - Even better, you can
sshfs edison:/usr/local mnt, and then use as installation prefix$HOME/mntin the recipes above. All the built products of your cross-compilation will be automatically put on the Edison in/usr/local/. Even more handy. - Type
umount mntwhen you are done with it.
Note: these hints work on a Mac, provided that you have OSXFuse and sshfs installed. On Linux, they should probably work as fine, although the fuse SSH filesystem commands have some minor differences. If you are on Windows, I am not even spending time to explain why you should switch to another platform :p
Hereafter you find some guides for cross-compiling pretty useful and common packages, notably missing on OPKG. Before proceding, though, I suggest you to have a look at the hints section. In particular, installation commands are assuming that you have a working FuseFS sshfs command and that you mount the Edison /usr/local dir on $HOME/mnt. The install operations are then performed twice: first for installing the libs in your local (host) SDK tree, then for installing them on the Edison filesystem.
I successfully compiled libyaml with the following commands:
$ curl -O http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
$ tar xzvf yaml-0.1.5.tar.gz && cd yaml-0.1.5
$ ./configure --host=i586-poky-linux --prefix=/your/absolute/path/to/usr
$ make -j8
$ sudo make installPLEASE NOTE: These commands install the library and its headers under /your/absolute/path/to/usr/local/[lib|include], so that you can easily copy them on your Edison filesystem. If you rather need libYAML for x-compiling other software, you probably want to install the stuff on the local SDK, so that the configure line should read as follows:
$ ./configure --host=i586-poky-linux --prefix=$SDKTARGETSYSROOT/usr/localAnd then remember to copy the shared library (if you are using it!) on the Edison. After copying, You probably want to check the LIBDIR stuff. I suggest you to have a look athe the GNU libtool page.
Some small changes for libUV:
$ curl -O http://dist.libuv.org/dist/v1.8.0/libuv-v1.8.0.tar.gz
$ tar xzvf libuv-v1.8.0.tar.gz && cd libuv-v1.8.0
# Perhaps you also need brew install libtoolize
$ LIBTOOLIZE=libtoolize sh ./autogen.sh
$ ./configure --host=i586-poky-linux --prefix=$SDKTARGETSYSROOT/usr/local
$ make -j8
$ sudo make install
# only if needed/possible:
$ sshfs edison:/usr/local $HOME/mnt
$ ./configure --host=i586-poky-linux --prefix=$HOME/mnt
$ make install$ curl -O http://mirrors.muzzy.it/gnu/gsl/gsl-latest.tar.gz
$ tar xzvf gsl-latest.tar.gz && cd gsl-2.1
./configure --host=i586-poky-linux --prefix=$SDKTARGETSYSROOT/usr/local
make -j8
sudo make install
# only if needed/possible:
$ sshfs edison:/usr/local $HOME/mnt
$ ./configure --host=i586-poky-linux --prefix=$HOME/mnt
$ make installFor compiling base Lua interpreter and compiler (lua and luac) proceed as follows:
$ source /opt/poky-edison/1.7.2/environment-setup-core2-32-poky-linux
$ curl -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
$ tar xzvf lua-5.3.0.tar.gz && cd lua-5.3.0
$ make -j8 CC=i586-poky-linux-gcc RANLIB=i586-poky-linux-ranlib AR="i586-poky-linux-ar rcu" linux
$ sudo make install INSTALL_TOP=$SDKTARGETSYSROOT/usr/local
# only if needed/possible:
$ sshfs edison:/usr/local $HOME/mnt
$ make install INSTALL_TOP=$HOME/mnt$ source /opt/poky-edison/1.7.2/environment-setup-core2-32-poky-linux
$ curl -O http://luajit.org/download/LuaJIT-2.0.4.tar.gz
$ tar xzvf LuaJIT-2.0.4.tar.gz && cd LuaJIT-2.0.4
$ make -j8 HOST_CC="gcc -m32" CROSS=$TARGET_PREFIX TARGET_SYS=Linux
$ sudo make install PREFIX=$SDKTARGETSYSROOT/usr/local
# only if needed/possible:
$ sshfs edison:/usr/local $HOME/mnt
$ make install PREFIX=$HOME/mntWatch out: when cross-building on OS X, the current LuaJIT makefile incorrectly installs the shared library files with the .dylib extension rather than the .so one. After installing the libraries, I suggest to move to /usr/local/lib on the Edison and do the followings:
$ cd /usr/local/lib
$ mv libluajit-5.1.2.0.4.dylib libluajit-5.1.2.0.4.so
$ ldconfig -n .
$ rm *.dylibAdd the following package sources to /etc/opkg/base-feeds.conf for more sources:
src all http://iotdk.intel.com/repos/2.0/iotdk/all
src x86 http://iotdk.intel.com/repos/2.0/iotdk/x86
src i586 http://iotdk.intel.com/repos/2.0/iotdk/i586
then opkg update.
Now you can for example install git: opkg install git
Turbo is a Lua framework for creating ReST services. Ir relies on LuaJIT rather than plain Lua (see above). In details, its requirements are:
- LuaJIT: cross compile it and install as above.
- git:
opkg update && opkg install git - coreutils:
opkg install coreutils - luarocks: It is much easier to build it natively on your Edison: downoald the tarball,
./configure --lua-suffix=jit --with-lua-include=/usr/include/luajit-2.0, thenmake && make install - finally:
luarocks install turbo
Started from https://gist.github.com/darylposnett/f11088a0ded82484a47e#file-intel-edison-cmdline-md