Cross-compiling NDN projects for home routers » History » Version 1
Mathias Gibbens, 05/12/2014 02:21 PM
1 | 1 | Mathias Gibbens | Cross-compiling NDN projects for home routers |
---|---|---|---|
2 | ============================================= |
||
3 | |||
4 | Contents |
||
5 | -------- |
||
6 | |||
7 | * [Introduction](#Introduction) |
||
8 | * [Setting up the build host](#Setting-up-the-build-host) |
||
9 | * [OpenWRT source and toolchain](#OpenWRT-source-and-toolchain) |
||
10 | * [DD-WRT source and toolchain](#DD-WRT-source-and-toolchain) |
||
11 | * [Compiling ndn-cxx](#Compiling-ndn-cxx) |
||
12 | * [Using the ndn-cxx library with other NDN projects](#Using-the-ndn-cxx-library-with-other-NDN-projects) |
||
13 | * [Concluding remarks](#Concluding-remarks) |
||
14 | |||
15 | Introduction |
||
16 | ------------ |
||
17 | |||
18 | This page describes how to cross compile the NDN projects to run on wireless home routers that are supported by various open source firmwares, such as [OpenWRT](https://openwrt.org/) and [DD-WRT](http://dd-wrt.com/). It's a fairly straight forward process, but it is assumed that you are familiar with basic software development in a Linux environment, have some familiarity with cross compilation in general, and aren't afraid to get your hands dirty! There are also a couple considerations that need to be addressed when targeting smaller/embedded devices, especially concerning the limited flash storage typically available on routers. |
||
19 | |||
20 | The process of setting up the build host and actually compiling the NDN project will be the same regardless of the hardware/firmware you wish to target. Follow the corresponding section that matches your firmware to get the proper cross compile environment. |
||
21 | |||
22 | Setting up the build host |
||
23 | ------------------------- |
||
24 | |||
25 | Steps in this guide were tested on a system running Debian 7 (wheezy). Distribution specific commands, like installing packages, may have to be modified to suit your setup, but on the whole this guide should be applicable to any modern Linux system. All commands should be run as a normal user -- never run as root! |
||
26 | |||
27 | Make sure you have the needed packages on the host system to compile the cross compile toolchain, libraries, and resulting firmware: |
||
28 | |||
29 | sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk unzip |
||
30 | |||
31 | Finally, before we actually begin the compilation process, be aware that the paths given below which reference a specific build target (like "mipsel\_mips32_uClibc-0.9.33.2") very well could be different for you. Make sure to make the appropriate adjustments to match your setup. |
||
32 | |||
33 | OpenWRT source and toolchain |
||
34 | ---------------------------- |
||
35 | |||
36 | Begin by fetching the current code for OpenWRT. Additional instructions are available on their wiki at [OpenWrt Buildroot - Installation](http://wiki.openwrt.org/doc/howto/buildroot.exigence). This guide assumes you checked out the source to your home directory. |
||
37 | |||
38 | git clone git://git.openwrt.org/openwrt.git |
||
39 | cd ~/openwrt/ |
||
40 | ./scripts/feeds update -a |
||
41 | ./scripts/feeds install -a |
||
42 | |||
43 | We need to fetch the current feed information, as that is where we get the boost, libcrypto++, and libsqlite3 libraries to run in OpenWRT. |
||
44 | |||
45 | Now, run the configuration interface and adjust the settings as you need to match your device, etc. |
||
46 | |||
47 | cd ~/openwrt/ |
||
48 | make menuconfig |
||
49 | |||
50 | Additionally, make sure the following libraries are selected so we can compile the NDN software. (Additional libraries might be required for projects that go beyond ndn-cxx, like `libpcap` for NDF.) |
||
51 | |||
52 | Libraries ---> |
||
53 | SSL ---> |
||
54 | libopenssl |
||
55 | database ---> |
||
56 | libsqlite3 |
||
57 | boost-chrono |
||
58 | boost-date_time |
||
59 | boost-filesystem |
||
60 | boost-iostreams |
||
61 | boost-program_options |
||
62 | boost-regex |
||
63 | boost-system |
||
64 | boost-test |
||
65 | libcryptoxx |
||
66 | |||
67 | After you have the configuration to your liking, we need to compile the toolchain and libraries. This will take a while. |
||
68 | |||
69 | make |
||
70 | |||
71 | Once the OpenWRT cross compile environment is compiled, we need to create two temporary symlinks so the later `./waf configure` stage will properly detect `libcrypto++`: (Again, remember that the target part of the path names may be different for you.) |
||
72 | |||
73 | ln -s ~/openwrt/staging_dir/target-mipsel_mips32_uClibc-0.9.33.2/usr/include/crypto++ ~/openwrt/staging_dir/target-mipsel_mips32_uClibc-0.9.33.2/usr/include/cryptopp |
||
74 | ln -s ~/openwrt/staging_dir/target-mipsel_mips32_uClibc-0.9.33.2/usr/lib/libcrypto++.so ~/openwrt/staging_dir/target-mipsel_mips32_uClibc-0.9.33.2/usr/lib/libcryptopp.so |
||
75 | |||
76 | Now the cross compile environment is ready for you to use. Proceed to [Compiling ndn-cxx](#Compiling-ndn-cxx). |
||
77 | |||
78 | DD-WRT source and toolchain |
||
79 | --------------------------- |
||
80 | |||
81 | WIP |
||
82 | |||
83 | Compiling ndn-cxx |
||
84 | ----------------- |
||
85 | |||
86 | In this section we will compile the ndn-cxx code. Other NDN projects should compile in a similar manner. |
||
87 | |||
88 | As mentioned in the introduction, compiling for an embedded device can present issues not normally encountered. Chief among these for us is the very limited disk space to copy files to on the router. Normal compilation of NDN projects by default includes debug symbols. This can add an order of magnitude to the resulting binary size, making in infeasible to run on a router. Therefore we will overwrite the default compiler flags with the `CXXFLAGS` variable. Additionally, the compilation process produces a statically linked library which is several megabytes in size. Unless it is specifically needed, there's no reason to copy it to the router where it will just waste space. |
||
89 | |||
90 | Begin by fetching the current release of ndn-cxx, 0.1.0 as of this writing: |
||
91 | |||
92 | cd |
||
93 | wget https://github.com/named-data/ndn-cxx/archive/ndn-cxx-0.1.0.tar.gz |
||
94 | tar xf ndn-cxx-0.1.0.tar.gz |
||
95 | cd ndn-cxx-ndn-cxx-0.1.0/ |
||
96 | |||
97 | Now, set the needed environment variables so the configuration and compilation process use the cross compile environment we have setup. |
||
98 | |||
99 | *FIXME* this is currently specific to OpenWRT |
||
100 | |||
101 | export TOOLCHAIN_PATH=$HOME/openwrt/staging_dir/toolchain-mipsel_mips32_gcc-4.8-linaro_uClibc-0.9.33.2/bin |
||
102 | export CROSSCOMPILE_PATH=$HOME/openwrt/staging_dir/target-mipsel_mips32_uClibc-0.9.33.2/usr |
||
103 | export CXX=$TOOLCHAIN_PATH/mipsel-openwrt-linux-uclibc-g++ |
||
104 | export AR=$TOOLCHAIN_PATH/mipsel-openwrt-linux-uclibc-ar |
||
105 | export CXXFLAGS="-O2" |
||
106 | export CFLAGS="-I$CROSSCOMPILE_PATH/include" |
||
107 | export LDFLAGS="-L$CROSSCOMPILE_PATH/lib -lz" |
||
108 | |||
109 | Finally, configure and build the library. We will install the resulting binaries and source files into a folder within our home directory so we don't accidentally contaminate our host system with non-native binaries. |
||
110 | |||
111 | ./waf configure --prefix=/usr --sysconfdir=/etc --with-openssl=$CROSSCOMPILE_PATH --with-cryptopp=$CROSSCOMPILE_PATH --with-sqlite3=$CROSSCOMPILE_PATH --boost-includes=$CROSSCOMPILE_PATH/include --boost-libs=$CROSSCOMPILE_PATH/lib |
||
112 | |||
113 | ./waf |
||
114 | |||
115 | DESTDIR=$HOME/ndn-cxx-crosscompile ./waf install |
||
116 | |||
117 | You can now find the cross compiled binaries in `~/ndn-cxx-crosscompile`. |
||
118 | |||
119 | Using the ndn-cxx library with other NDN projects |
||
120 | ------------------------------------------------- |
||
121 | |||
122 | WIP |
||
123 | |||
124 | Concluding remarks |
||
125 | ------------------ |