Project

General

Profile

Cross-compiling NDN projects for home routers » History » Version 15

Junxiao Shi, 01/31/2021 08:13 PM

1 15 Junxiao Shi
# NDN Packages for OpenWrt 19.07
2 1 Mathias Gibbens
3 15 Junxiao Shi
## Important Notice
4
5 1 Mathias Gibbens
Please build packages from <https://github.com/yoursunny/OpenWrt-packages> feed.
6 15 Junxiao Shi
7
Original content of this page is retained for historical purpose. It does not work on recent OpenWrt versions.
8 14 Junxiao Shi
9
---
10
11 1 Mathias Gibbens
Cross-compiling NDN projects for home routers
12
=============================================
13
14
Contents
15
--------
16
17
*  [Introduction](#Introduction)
18
*  [Setting up the build host](#Setting-up-the-build-host)
19
*  [OpenWRT source and toolchain](#OpenWRT-source-and-toolchain)
20
*  [DD-WRT source and toolchain](#DD-WRT-source-and-toolchain)
21
*  [Compiling ndn-cxx](#Compiling-ndn-cxx)
22
*  [Using the ndn-cxx library with other NDN projects](#Using-the-ndn-cxx-library-with-other-NDN-projects)
23
*  [Concluding remarks](#Concluding-remarks)
24
25
Introduction
26
------------
27
28 5 Mathias Gibbens
This page describes how to cross compile 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/). Currently, it is easier to use OpenWRT. Building NDN projects to run on a router is 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 compiling 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.
29 1 Mathias Gibbens
30
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.
31
32
Setting up the build host
33
-------------------------
34
35 9 Mathias Gibbens
Steps in this guide were tested on a system running Debian 8 (jessie). 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 as root!
36 1 Mathias Gibbens
37
Make sure you have the needed packages on the host system to compile the cross compile toolchain, libraries, and resulting firmware:
38
39 2 Mathias Gibbens
    sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk unzip pkg-config
40 1 Mathias Gibbens
41 2 Mathias Gibbens
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. Be sure to make the appropriate adjustments to match your setup.
42 1 Mathias Gibbens
43
OpenWRT source and toolchain
44
----------------------------
45
46 2 Mathias Gibbens
Begin by fetching the current code for OpenWRT. Additional instructions are available on that project's wiki: [OpenWrt Buildroot - Installation](http://wiki.openwrt.org/doc/howto/buildroot.exigence). This guide assumes you checked out the source to your home directory.
47 1 Mathias Gibbens
48
    git clone git://git.openwrt.org/openwrt.git
49
    cd ~/openwrt/
50 4 Mathias Gibbens
51 13 Mathias Gibbens
You will need to edit the feed configuration file `feeds.conf.default` to re-enable the "oldpackages" repository so we can compile the `libcrypto++` library. Simply find that line, and remove the leading `#`. Once done, the line should look like `src-git oldpackages http://git.openwrt.org/packages.git`. Now, fetch the current feed information and populate the package choices for the next step.
52 4 Mathias Gibbens
53 1 Mathias Gibbens
    ./scripts/feeds update -a
54
    ./scripts/feeds install -a
55
56
We need to fetch the current feed information, as that is where we get the boost, libcrypto++, and libsqlite3 libraries to run in OpenWRT.
57
58
Now, run the configuration interface and adjust the settings as you need to match your device, etc.
59
60
    cd ~/openwrt/
61
    make menuconfig
62
63 10 Mathias Gibbens
**IMPORTANT** As of June 2015, the OpenWRT project has [switched to a new C library](https://lists.openwrt.org/pipermail/openwrt-devel/2015-June/033702.html) called musl. If you are running OpenWRT 15.05 (Chaos Calmer) or earlier, you must change the C library that the toolchain will use back to uClib, otherwise your cross compiled code _will not run_ on the router. If you are running a development version of OpenWRT compiled from code after June 16, 2015, it will use the musl C library and you do not have to change anything.
64
65 13 Mathias Gibbens
If you are running an old version of OpenWRT, follow these options in the menuconfig to change the C library. (Note that you will have to first enable the options before actually selecting them.)
66 10 Mathias Gibbens
67
    Advanced configuration options (for developers) --->
68
        Toolchain Options --->
69
            C Library implementation (use musl) --->
70
                Use uClib
71
72 13 Mathias Gibbens
Before compiling the firmware image, 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 [NFD](http://redmine.named-data.net/projects/NFD).)
73 1 Mathias Gibbens
74
    Libraries --->
75
        database --->
76
            libsqlite3
77
        boost --->
78 13 Mathias Gibbens
            Select Boost Libraries --->
79
                Boost test package
80
                Boost atomic library
81
                Boost chrono library
82
                Boost date_time library
83
                Boost filesystem library
84
                Boost iostreams library
85
                Boost program_options library
86
                Boost random library
87
                Boost regex library
88
                Boost system library
89
                Boost thread library
90 1 Mathias Gibbens
        libcryptoxx
91
92
After you have the configuration to your liking, we need to compile the toolchain and libraries. This will take a while.
93
94
    make
95
96
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.)
97
98
    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
99
    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
100
101
Now the cross compile environment is ready for you to use. Proceed to [Compiling ndn-cxx](#Compiling-ndn-cxx).
102
103
DD-WRT source and toolchain
104 3 Mathias Gibbens
---------------------------
105
106
Configuring DD-WRT is a little more complicated than OpenWRT's setup. Begin by fetching the current code for DD-WRT. Additional instructions are available on that project's wiki: [Development - DD-WRT Wiki](http://www.dd-wrt.com/wiki/index.php/Development#Building_DD-WRT_from_Source). This guide assumes you checked out the source to your home directory.
107
108
    svn co svn://svn.dd-wrt.com/DD-WRT
109
    cd ~/DD-WRT/
110
111 5 Mathias Gibbens
Next, download the current cross compile toolchain for DD-WRT (note that the link on DD-WRT's wiki is broken, this is the correct one):
112 1 Mathias Gibbens
113 5 Mathias Gibbens
    wget ftp://ftp.dd-wrt.com/toolchains/toolchains.tar.gz
114 1 Mathias Gibbens
115 5 Mathias Gibbens
**FIXME** Need to complete this section. As of early 2015, it is easier to use the OpenWRT build system. I was able to cross-compile ndn-cxx and NFD using OpenWRT's system and then run the binaries on a DD-WRT flashed router. YMMV.
116 3 Mathias Gibbens
117
Now the cross compile environment is ready for you to use. Proceed to [Compiling ndn-cxx](#Compiling-ndn-cxx).
118 1 Mathias Gibbens
119
Compiling ndn-cxx
120
-----------------
121
122 2 Mathias Gibbens
In this section we will compile the [ndn-cxx](http://redmine.named-data.net/projects/ndn-cxx) library. Other NDN projects should compile in a similar manner.
123 1 Mathias Gibbens
124 2 Mathias Gibbens
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 a NDN project will by default produce binaries that include debug symbols. This can add an order of magnitude to the resulting binary size (101MB vs 15MB total), making it 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.
125 1 Mathias Gibbens
126 12 Mathias Gibbens
Begin by fetching the current release of ndn-cxx, 0.4.1 as of this writing:
127 1 Mathias Gibbens
128
    cd
129 12 Mathias Gibbens
    wget https://github.com/named-data/ndn-cxx/archive/ndn-cxx-0.4.1.tar.gz
130 1 Mathias Gibbens
    tar xf ndn-cxx-0.4.1.tar.gz
131 12 Mathias Gibbens
    cd ndn-cxx-ndn-cxx-0.4.1/
132 11 Mathias Gibbens
133 1 Mathias Gibbens
Now, set the needed environment variables so the configuration and compilation process use the cross compile environment we have setup.
134
135 2 Mathias Gibbens
**FIXME** this is currently specific to OpenWRT
136 1 Mathias Gibbens
137
    export TOOLCHAIN_PATH=$HOME/openwrt/staging_dir/toolchain-mipsel_mips32_gcc-4.8-linaro_uClibc-0.9.33.2/bin
138
    export CROSSCOMPILE_PATH=$HOME/openwrt/staging_dir/target-mipsel_mips32_uClibc-0.9.33.2/usr
139
    export CXX=$TOOLCHAIN_PATH/mipsel-openwrt-linux-uclibc-g++
140
    export AR=$TOOLCHAIN_PATH/mipsel-openwrt-linux-uclibc-ar
141
    export CXXFLAGS="-O2"
142
    export CFLAGS="-I$CROSSCOMPILE_PATH/include"
143
    export LDFLAGS="-L$CROSSCOMPILE_PATH/lib -lz"
144
145 13 Mathias Gibbens
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. If you are using the OpenWRT buildchain, you will see warnings during compilation that the STAGING_DIR environment variable is not set. This is a harmless warning that can be ignored.
146 1 Mathias Gibbens
147 6 Mathias Gibbens
    ./waf configure --prefix=/usr --sysconfdir=/etc --with-cryptopp=$CROSSCOMPILE_PATH --with-sqlite3=$CROSSCOMPILE_PATH --boost-includes=$CROSSCOMPILE_PATH/include --boost-libs=$CROSSCOMPILE_PATH/lib
148 1 Mathias Gibbens
    
149
    ./waf
150
    
151
    DESTDIR=$HOME/ndn-cxx-crosscompile ./waf install
152
153
You can now find the cross compiled binaries in `~/ndn-cxx-crosscompile`.
154
155
Using the ndn-cxx library with other NDN projects
156
-------------------------------------------------
157
158
Well, now that you've got the library cross compiled, you'll likely want to use it! Because it is both cross compiled as well as installed locally in your home directory, whatever project wants to use it will have to be told where to look. As a simple example, this section will show cross compiling [NFD](http://redmine.named-data.net/projects/NFD).
159
160 5 Mathias Gibbens
NFD requires the `libpcap` library, so make sure you've selected it when compiling your firmware and cross compile environment. (If you haven't, go back and do so, then rerun `make`. The second time should be much faster, as only the parts affected by configuration changes will have to be compiled.)
161 2 Mathias Gibbens
162 12 Mathias Gibbens
Similar to ndn-cxx, we will get the current release of NFD, 0.4.1 as of this writing:
163 5 Mathias Gibbens
164
    cd
165 12 Mathias Gibbens
    wget https://github.com/named-data/NFD/archive/NFD-0.4.1.tar.gz
166
    tar xf NFD-0.4.1.tar.gz
167
    cd NFD-NFD-0.4.1/
168 7 Mathias Gibbens
169 2 Mathias Gibbens
If the environment variables from the previous section aren't still set, reset them before proceeding.
170
171
NDN projects that use ndn-cxx assume they can get the necessary include directories and linking information via pkg-config. Because ndn-cxx isn't in the standard search path, we need to add it:
172
173
    export PKG_CONFIG_PATH=$HOME/ndn-cxx-crosscompile/usr/lib/pkgconfig:$PKG_CONFIG_PATH
174 1 Mathias Gibbens
175 6 Mathias Gibbens
Additionally, we need to tweak the configuration file for ndn-cxx so it includes the correct directories, since when the pkg-config file was generated, it assumed final installation based off the supplied `--prefix` option. Edit `~/ndn-cxx-crosscompile/usr/lib/pkgconfig/libndn-cxx.pc` and append the lib and include paths (the last arguments below) to the last two lines to (make sure to change the username part of the paths!):
176 2 Mathias Gibbens
177 6 Mathias Gibbens
    Libs: -L${libdir} [...snip...] -L/home/USER/ndn-cxx-crosscompile/usr/lib
178
    Cflags: -I${includedir} [...snip...] -I/home/USER/ndn-cxx-crosscompile/usr/include
179 2 Mathias Gibbens
180
Now, configure and compile NFD:
181
182 6 Mathias Gibbens
    ./waf configure --prefix=/usr --sysconfdir=/etc --with-libpcap=$CROSSCOMPILE_PATH --boost-includes=$CROSSCOMPILE_PATH/include --boost-libs=$CROSSCOMPILE_PATH/lib --without-websocket
183 2 Mathias Gibbens
    
184
    ./waf
185
    
186
    DESTDIR=$HOME/NFD-crosscompile ./waf install
187
188
Like before, the cross compiled binaries will be in `~/NFD-crosscompile`.
189
190
191 1 Mathias Gibbens
Concluding remarks
192
------------------
193 2 Mathias Gibbens
194
Hopefully this walk through has been helpful to you in your quest to cross compile a NDN project.
195
196 5 Mathias Gibbens
I have chosen not to talk about actually copying the resulting binaries to the router, as there are many ways to do so: package managers, tarballs, by hand, etc. There are plenty of better tutorials online that are easy to find if you need pointers doing this.