User Tools

Site Tools


doc:devel:crosscompile

Differences

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]
uvray313
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.
 +