|
|
Line 1: |
Line 1: |
− | = How to use a Linux-to-Linux cross compiling GNU toolchain =
| + | {{CMake/Template/Moved}} |
| | | |
− | Linux is in widespread use in embedded systems and handheld devices. There are many commercial
| + | This page has moved [https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/cross_compiling/Eldk here]. |
− | and non-commercial projects which provide cross compiling toolchains, one of these
| |
− | is [http://www.denx.de Denx], which offer the [http://www.denx.de/wiki/DULG/ELDK Embedded Linux Development Kit],
| |
− | short ELDK. ELDK supports PowerPC, ARM and MIPS as target systems, it consists of the cross compiling toolchains and
| |
− | the quite complete target environment.
| |
− | ELDK shouldn't be much different from other cross compiling toolchains, so the information presented here should be usable also for other Linux-to-Linux cross compiling toolchains.
| |
− | | |
− | == Installing ELDK ==
| |
− | | |
− | You can find installation instructions at http://www.denx.de/wiki/view/DULG/ELDKDownloadPowerPC , the
| |
− | packages are available at ftp://ftp.sunet.se/pub/Linux/distributions/eldk/ .
| |
− | E.g. if your target has a MIPS processor, you will download the files you can find in
| |
− | ftp://ftp.sunet.se/pub/Linux/distributions/eldk/4.1/mips-linux-x86/iso . The easiest way to use them is to mount
| |
− | these ISO files and then install ELDK using the ''install'' executable you will find there:
| |
− | <pre>
| |
− | ~/ $ mkdir mount-iso/
| |
− | ~/ $ sudo mount -tiso9660 mips-2007-01-21.iso mount-iso/ -o loop
| |
− | ~/ $ cd mount-iso/
| |
− | ~/mount-iso/$ ./install -d /home/alex/eldk-mips/
| |
− | ...
| |
− | Preparing... ########################################### [100%]
| |
− | 1:appWeb-mips_4KCle ########################################### [100%]
| |
− | Done
| |
− | ~/mount-iso/$ ls eldk-mips/
| |
− | bin eldk_init etc mips_4KC mips_4KCle usr var version
| |
− | </pre>
| |
− | | |
− | In eldk-mips/mips_4KC/ and eldk-mips/mips_4KCle/ the target environments have been installed, i.e. complete Linux
| |
− | filesystems for the target platforms. In eldk-mips/bin/, eldk-mips/usr/ etc. host side tools
| |
− | have been installed, so the cross compiler can be found in eldk-mips/usr/bin/mips-linux-gcc.
| |
− | | |
− | | |
− | == Writing a CMake toolchain file ==
| |
− | | |
− | For CMake to be able to crosscompile software, it requires you to write a toolchain file, which tells CMake
| |
− | some information about the toolchain.
| |
− | With the examples used above it will look like:
| |
− | <pre>
| |
− | # the name of the target operating system
| |
− | SET(CMAKE_SYSTEM_NAME Linux)
| |
− | | |
− | # which C and C++ compiler to use
| |
− | SET(CMAKE_C_COMPILER /home/alex/eldk-mips/usr/bin/mips_4KC-gcc)
| |
− | SET(CMAKE_CXX_COMPILER /home/alex/eldk-mips/usr/bin/mips_4KC-g++)
| |
− | | |
− | # here is the target environment located
| |
− | SET(CMAKE_FIND_ROOT_PATH /home/alex/eldk-mips/mips_4KC /home/alex/eldk-mips-extra-install )
| |
− | | |
− | # adjust the default behaviour of the FIND_XXX() commands:
| |
− | # search headers and libraries in the target environment, search
| |
− | # programs in the host environment
| |
− | set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
| |
− | set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
| |
− | set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
| |
− | </pre>
| |
− | | |
− | Save this file as Toolchain-eldk-mips4KC.cmake to some location where you will put
| |
− | all your toolchain files, e.g. $HOME.
| |
− | | |
− | == Building the software for ELDK ==
| |
− | | |
− | Let's say you have the classical hello world software with a CMake based buildsystem and want to build this for ELDK.
| |
− | main.c:
| |
− | <pre>
| |
− | include <stdio.h>
| |
− | | |
− | int main()
| |
− | {
| |
− | printf("Hello world\n");
| |
− | return 0;
| |
− | }
| |
− | </pre>
| |
− | | |
− | CMakeLists.txt:
| |
− | <pre>
| |
− | ADD_EXECUTABLE(hello main.c)
| |
− | INSTALL(TARGETS hello DESTINATION bin)
| |
− | </pre>
| |
− | | |
− | Then run CMake on it to generate the buildfiles, the important point is that you tell it to use the toochain file you just wrote:
| |
− | <pre>
| |
− | ~/src/helloworld/ $ mkdir build
| |
− | ~/src/helloworld/ $ cd build
| |
− | ~/src/helloworld/build/ $ cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-eldk-mips4KC.cmake -DCMAKE_INSTALL_PREFIX=/home/alex/eldk-mips-extra-install ..
| |
− | -- Configuring done
| |
− | -- Generating done
| |
− | -- Build files have been written to: /home/alex/src/helloworld/build
| |
− | ~/src/helloworld/build/ $ make
| |
− | Scanning dependencies of target hello
| |
− | [100%] Building C object CMakeFiles/hello.dir/main.o
| |
− | Linking C executable hello
| |
− | [100%] Built target hello
| |
− | ~/src/helloworld/build/ $ make install
| |
− | ...
| |
− | -- Installing /home/alex/eldk-mips-extra-install/bin/hello
| |
− | </pre>
| |
− | | |
− | So that's all. It actually doesn't matter whether it's just a "hello world" or some complex piece of software,
| |
− | the only difference is the usage of the toolchain file. If the software has all required configure checks, it should just
| |
− | build also for ELDK.
| |
− | | |
− | {{CMake/Template/Footer}}
| |