User Tools

Site Tools



This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
doc:devel:crosscompile [2012/12/18 18:13]
doc:devel:crosscompile [2016/02/28 12:09] (current)
haydent [Procedure] n
Line 1: Line 1:
 +====== Cross Compile ======
 +If you want to use a [[wp>​Computer_program|program]],​ currently not contained in the OpenWrt repository, you probably won't find a binary compiled for your CPU.
 +Provided that it is released as open source, you can download the code and compile it using the [[about:​toolchain|OpenWrt Buildroot]].
 +Note that not every code is compilable for every CPU architecture. Also performance on embedded systems is limited compared to ordinary computers.
 +===== Procedure =====
 +  * Follow the build instructions outlined in [[doc:​howto:​build|OpenWrt Buildroot – Usage]]
 +  * Locate the toolchain binaries in the ''​staging_dir/​toolchain-//​architecture//​_gcc-//​compilerver//​_uClibc-//​libcver///​bin/''​ directory
 +  * Add that directory to the ''​PATH''​ environment variable:
 +    * ''​PATH=$PATH:​(your toolchain/​bin directory here)''​
 +    * ''​export PATH''​
 +  * Set the ''​STAGING_DIR''​ environment variable to the above toolchain dir and export it:
 +    * ''​STAGING_DIR=(your toolchain directory here)''​
 +    * ''​export STAGING_DIR''​
 +  * Download and unpack the code to be compiled, change into the unpacked directory
 +  * Pass the //host// and //build// to the build system of the package to trigger cross-compile
 +    * For GNU configure, use ''​%%--build=%%//​architecture//​-unknown-linux-gnu %%--host=%%//​architecture//​-openwrt-linux-uclibc''​ (for example: ''​./​configure %%--build=%%x86_64-unknown-linux-gnu ​ --host=mips-openwrt-linux-uclibc''​)
 +      * Run ''​./​config.guess''​ to get the ''​%%--build=%%''​ option.
 +      * Check the output and ensure that '''​checking whether we are cross compiling... yes'''​ is yes.
 +    * For GNU make, override the ''​CC''​ and ''​LD''​ environment variables (usually not needed if GNU configure was used)
 +       * ''​make CC=//​architecture//​-openwrt-linux-uclibc-gcc''​ ''​LD=//​architecture//​-openwrt-linux-uclibc-ld''​
 +  * The compiled program will be somewhere inside the folder your run ./configure and make from, try doing ''​find -iname *program*''​
 +  * Run ''​file program''​ to confirm cross-compiling was successful. ​
 +  * If compilation aborts due to missing header files or shared objects, you might need to override ''​CFLAGS''​ and ''​LDFLAGS''​ to point to the ''​staging_dir/​target-//​architecture//​_uClibc-//​libcver///​usr/​include''​ and ''​.../​usr/​lib''​ directories
 +  * Debugging requires gdb in the toolchain. Default config does not include it. Include using ''​make menuconfig''​. [Advanced configuration options->​Toolchain Options->​Build gdb]
 +  * Remote debugging can be done using script ''​.///​scripts///​remote-gdb''​
 +When compilation is finished, copy the resulting binary and related libraries to the target device to test it. It might be necessary to set ''​LD_LIBRARY_PATH''​ on the target to point the binary to libraries in non-standard locations.
 +If the program works well enough, you maybe want to build a real package for the opkg package manager and make it easily accessible for everyone out there.
 +See [[packages|Creating your own packages]] and [[dependencies|Using Dependencies]] for further information on that.