109209eecSAndrew Geissler.. SPDX-License-Identifier: CC-BY-SA-2.0-UK 209209eecSAndrew Geissler 309209eecSAndrew Geissler******************************** 409209eecSAndrew GeisslerUsing the SDK Toolchain Directly 509209eecSAndrew Geissler******************************** 609209eecSAndrew Geissler 709209eecSAndrew GeisslerYou can use the SDK toolchain directly with Makefile and Autotools-based 809209eecSAndrew Geisslerprojects. 909209eecSAndrew Geissler 1009209eecSAndrew GeisslerAutotools-Based Projects 1109209eecSAndrew Geissler======================== 1209209eecSAndrew Geissler 1309209eecSAndrew GeisslerOnce you have a suitable :ref:`sdk-manual/intro:the cross-development toolchain` 1409209eecSAndrew Geisslerinstalled, it is very easy to develop a project using the `GNU 1509209eecSAndrew GeisslerAutotools-based <https://en.wikipedia.org/wiki/GNU_Build_System>`__ 1609209eecSAndrew Geisslerworkflow, which is outside of the :term:`OpenEmbedded Build System`. 1709209eecSAndrew Geissler 1809209eecSAndrew GeisslerThe following figure presents a simple Autotools workflow. 1909209eecSAndrew Geissler 2009209eecSAndrew Geissler.. image:: figures/sdk-autotools-flow.png 2109209eecSAndrew Geissler :align: center 2209209eecSAndrew Geissler 2309209eecSAndrew GeisslerFollow these steps to create a simple Autotools-based "Hello World" 2409209eecSAndrew Geisslerproject: 2509209eecSAndrew Geissler 2609209eecSAndrew Geissler.. note:: 2709209eecSAndrew Geissler 2809209eecSAndrew Geissler For more information on the GNU Autotools workflow, see the same 2909209eecSAndrew Geissler example on the 3009209eecSAndrew Geissler GNOME Developer 3109209eecSAndrew Geissler site. 3209209eecSAndrew Geissler 3309209eecSAndrew Geissler1. *Create a Working Directory and Populate It:* Create a clean 3409209eecSAndrew Geissler directory for your project and then make that directory your working 3509209eecSAndrew Geissler location. 3609209eecSAndrew Geissler :: 3709209eecSAndrew Geissler 3809209eecSAndrew Geissler $ mkdir $HOME/helloworld 3909209eecSAndrew Geissler $ cd $HOME/helloworld 4009209eecSAndrew Geissler 4109209eecSAndrew Geissler After setting up the directory, populate it with files needed for the flow. 4209209eecSAndrew Geissler You need a project source file, a file to help with configuration, 4309209eecSAndrew Geissler and a file to help create the Makefile, and a README file: 4409209eecSAndrew Geissler ``hello.c``, ``configure.ac``, ``Makefile.am``, and ``README``, 4509209eecSAndrew Geissler respectively. 4609209eecSAndrew Geissler 4709209eecSAndrew Geissler Use the following command to create an empty README file, which is 4809209eecSAndrew Geissler required by GNU Coding Standards: 4909209eecSAndrew Geissler :: 5009209eecSAndrew Geissler 5109209eecSAndrew Geissler $ touch README 5209209eecSAndrew Geissler 5309209eecSAndrew Geissler Create the remaining 5409209eecSAndrew Geissler three files as follows: 5509209eecSAndrew Geissler 5609209eecSAndrew Geissler - ``hello.c``: 5709209eecSAndrew Geissler :: 5809209eecSAndrew Geissler 5909209eecSAndrew Geissler #include <stdio.h> 6009209eecSAndrew Geissler 6109209eecSAndrew Geissler main() 6209209eecSAndrew Geissler { 6309209eecSAndrew Geissler printf("Hello World!\n"); 6409209eecSAndrew Geissler } 6509209eecSAndrew Geissler 6609209eecSAndrew Geissler - ``configure.ac``: 6709209eecSAndrew Geissler :: 6809209eecSAndrew Geissler 6909209eecSAndrew Geissler AC_INIT(hello,0.1) 7009209eecSAndrew Geissler AM_INIT_AUTOMAKE([foreign]) 7109209eecSAndrew Geissler AC_PROG_CC 7209209eecSAndrew Geissler AC_CONFIG_FILES(Makefile) 7309209eecSAndrew Geissler AC_OUTPUT 7409209eecSAndrew Geissler 7509209eecSAndrew Geissler - ``Makefile.am``: 7609209eecSAndrew Geissler :: 7709209eecSAndrew Geissler 7809209eecSAndrew Geissler bin_PROGRAMS = hello 7909209eecSAndrew Geissler hello_SOURCES = hello.c 8009209eecSAndrew Geissler 8109209eecSAndrew Geissler2. *Source the Cross-Toolchain Environment Setup File:* As described 8209209eecSAndrew Geissler earlier in the manual, installing the cross-toolchain creates a 8309209eecSAndrew Geissler cross-toolchain environment setup script in the directory that the 8409209eecSAndrew Geissler SDK was installed. Before you can use the tools to develop your 8509209eecSAndrew Geissler project, you must source this setup script. The script begins with 8609209eecSAndrew Geissler the string "environment-setup" and contains the machine architecture, 8709209eecSAndrew Geissler which is followed by the string "poky-linux". For this example, the 8809209eecSAndrew Geissler command sources a script from the default SDK installation directory 8909209eecSAndrew Geissler that uses the 32-bit Intel x86 Architecture and the &DISTRO; Yocto 9009209eecSAndrew Geissler Project release: 9109209eecSAndrew Geissler :: 9209209eecSAndrew Geissler 9309209eecSAndrew Geissler $ source /opt/poky/&DISTRO;/environment-setup-i586-poky-linux 9409209eecSAndrew Geissler 9509209eecSAndrew Geissler3. *Create the configure Script:* Use the ``autoreconf`` command to 9609209eecSAndrew Geissler generate the ``configure`` script. 9709209eecSAndrew Geissler :: 9809209eecSAndrew Geissler 9909209eecSAndrew Geissler $ autoreconf 10009209eecSAndrew Geissler 10109209eecSAndrew Geissler The ``autoreconf`` 10209209eecSAndrew Geissler tool takes care of running the other Autotools such as ``aclocal``, 10309209eecSAndrew Geissler ``autoconf``, and ``automake``. 10409209eecSAndrew Geissler 10509209eecSAndrew Geissler .. note:: 10609209eecSAndrew Geissler 10709209eecSAndrew Geissler If you get errors from 10809209eecSAndrew Geissler configure.ac 10909209eecSAndrew Geissler , which 11009209eecSAndrew Geissler autoreconf 11109209eecSAndrew Geissler runs, that indicate missing files, you can use the "-i" option, 11209209eecSAndrew Geissler which ensures missing auxiliary files are copied to the build 11309209eecSAndrew Geissler host. 11409209eecSAndrew Geissler 11509209eecSAndrew Geissler4. *Cross-Compile the Project:* This command compiles the project using 11609209eecSAndrew Geissler the cross-compiler. The 11709209eecSAndrew Geissler :term:`CONFIGURE_FLAGS` 11809209eecSAndrew Geissler environment variable provides the minimal arguments for GNU 11909209eecSAndrew Geissler configure: 12009209eecSAndrew Geissler :: 12109209eecSAndrew Geissler 12209209eecSAndrew Geissler $ ./configure ${CONFIGURE_FLAGS} 12309209eecSAndrew Geissler 12409209eecSAndrew Geissler For an Autotools-based 12509209eecSAndrew Geissler project, you can use the cross-toolchain by just passing the 12609209eecSAndrew Geissler appropriate host option to ``configure.sh``. The host option you use 12709209eecSAndrew Geissler is derived from the name of the environment setup script found in the 12809209eecSAndrew Geissler directory in which you installed the cross-toolchain. For example, 12909209eecSAndrew Geissler the host option for an ARM-based target that uses the GNU EABI is 13009209eecSAndrew Geissler ``armv5te-poky-linux-gnueabi``. You will notice that the name of the 13109209eecSAndrew Geissler script is ``environment-setup-armv5te-poky-linux-gnueabi``. Thus, the 13209209eecSAndrew Geissler following command works to update your project and rebuild it using 13309209eecSAndrew Geissler the appropriate cross-toolchain tools: 13409209eecSAndrew Geissler :: 13509209eecSAndrew Geissler 13609209eecSAndrew Geissler $ ./configure --host=armv5te-poky-linux-gnueabi --with-libtool-sysroot=sysroot_dir 13709209eecSAndrew Geissler 13809209eecSAndrew Geissler5. *Make and Install the Project:* These two commands generate and 13909209eecSAndrew Geissler install the project into the destination directory: 14009209eecSAndrew Geissler :: 14109209eecSAndrew Geissler 14209209eecSAndrew Geissler $ make 14309209eecSAndrew Geissler $ make install DESTDIR=./tmp 14409209eecSAndrew Geissler 14509209eecSAndrew Geissler .. note:: 14609209eecSAndrew Geissler 14709209eecSAndrew Geissler To learn about environment variables established when you run the 14809209eecSAndrew Geissler cross-toolchain environment setup script and how they are used or 14909209eecSAndrew Geissler overridden when the Makefile, see the " 15009209eecSAndrew Geissler Makefile-Based Projects 15109209eecSAndrew Geissler " section. 15209209eecSAndrew Geissler 15309209eecSAndrew Geissler This next command is a simple way to verify the installation of your 15409209eecSAndrew Geissler project. Running the command prints the architecture on which the 15509209eecSAndrew Geissler binary file can run. This architecture should be the same 15609209eecSAndrew Geissler architecture that the installed cross-toolchain supports. 15709209eecSAndrew Geissler :: 15809209eecSAndrew Geissler 15909209eecSAndrew Geissler $ file ./tmp/usr/local/bin/hello 16009209eecSAndrew Geissler 16109209eecSAndrew Geissler6. *Execute Your Project:* To execute the project, you would need to run 16209209eecSAndrew Geissler it on your target hardware. If your target hardware happens to be 16309209eecSAndrew Geissler your build host, you could run the project as follows: 16409209eecSAndrew Geissler :: 16509209eecSAndrew Geissler 16609209eecSAndrew Geissler $ ./tmp/usr/local/bin/hello 16709209eecSAndrew Geissler 16809209eecSAndrew Geissler As expected, the project displays the "Hello World!" message. 16909209eecSAndrew Geissler 17009209eecSAndrew GeisslerMakefile-Based Projects 17109209eecSAndrew Geissler======================= 17209209eecSAndrew Geissler 17309209eecSAndrew GeisslerSimple Makefile-based projects use and interact with the cross-toolchain 17409209eecSAndrew Geisslerenvironment variables established when you run the cross-toolchain 17509209eecSAndrew Geisslerenvironment setup script. The environment variables are subject to 17609209eecSAndrew Geisslergeneral ``make`` rules. 17709209eecSAndrew Geissler 17809209eecSAndrew GeisslerThis section presents a simple Makefile development flow and provides an 17909209eecSAndrew Geisslerexample that lets you see how you can use cross-toolchain environment 18009209eecSAndrew Geisslervariables and Makefile variables during development. 18109209eecSAndrew Geissler 18209209eecSAndrew Geissler.. image:: figures/sdk-makefile-flow.png 18309209eecSAndrew Geissler :align: center 18409209eecSAndrew Geissler 18509209eecSAndrew GeisslerThe main point of this section is to explain the following three cases 18609209eecSAndrew Geisslerregarding variable behavior: 18709209eecSAndrew Geissler 18809209eecSAndrew Geissler- *Case 1 - No Variables Set in the Makefile Map to Equivalent 18909209eecSAndrew Geissler Environment Variables Set in the SDK Setup Script:* Because matching 19009209eecSAndrew Geissler variables are not specifically set in the ``Makefile``, the variables 19109209eecSAndrew Geissler retain their values based on the environment setup script. 19209209eecSAndrew Geissler 19309209eecSAndrew Geissler- *Case 2 - Variables Are Set in the Makefile that Map to Equivalent 19409209eecSAndrew Geissler Environment Variables from the SDK Setup Script:* Specifically 19509209eecSAndrew Geissler setting matching variables in the ``Makefile`` during the build 19609209eecSAndrew Geissler results in the environment settings of the variables being 19709209eecSAndrew Geissler overwritten. In this case, the variables you set in the ``Makefile`` 19809209eecSAndrew Geissler are used. 19909209eecSAndrew Geissler 20009209eecSAndrew Geissler- *Case 3 - Variables Are Set Using the Command Line that Map to 20109209eecSAndrew Geissler Equivalent Environment Variables from the SDK Setup Script:* 20209209eecSAndrew Geissler Executing the ``Makefile`` from the command line results in the 20309209eecSAndrew Geissler environment variables being overwritten. In this case, the 20409209eecSAndrew Geissler command-line content is used. 20509209eecSAndrew Geissler 20609209eecSAndrew Geissler.. note:: 20709209eecSAndrew Geissler 20809209eecSAndrew Geissler Regardless of how you set your variables, if you use the "-e" option 20909209eecSAndrew Geissler with 21009209eecSAndrew Geissler make 21109209eecSAndrew Geissler , the variables from the SDK setup script take precedence: 21209209eecSAndrew Geissler :: 21309209eecSAndrew Geissler 21409209eecSAndrew Geissler $ make -e target 21509209eecSAndrew Geissler 21609209eecSAndrew Geissler 21709209eecSAndrew GeisslerThe remainder of this section presents a simple Makefile example that 21809209eecSAndrew Geisslerdemonstrates these variable behaviors. 21909209eecSAndrew Geissler 22009209eecSAndrew GeisslerIn a new shell environment variables are not established for the SDK 22109209eecSAndrew Geissleruntil you run the setup script. For example, the following commands show 22209209eecSAndrew Geisslera null value for the compiler variable (i.e. 22309209eecSAndrew Geissler:term:`CC`). 22409209eecSAndrew Geissler:: 22509209eecSAndrew Geissler 22609209eecSAndrew Geissler $ echo ${CC} 22709209eecSAndrew Geissler 22809209eecSAndrew Geissler $ 22909209eecSAndrew Geissler 23009209eecSAndrew GeisslerRunning the 23109209eecSAndrew GeisslerSDK setup script for a 64-bit build host and an i586-tuned target 23209209eecSAndrew Geisslerarchitecture for a ``core-image-sato`` image using the current &DISTRO; 23309209eecSAndrew GeisslerYocto Project release and then echoing that variable shows the value 23409209eecSAndrew Geisslerestablished through the script: 23509209eecSAndrew Geissler:: 23609209eecSAndrew Geissler 23709209eecSAndrew Geissler $ source /opt/poky/&DISTRO;/environment-setup-i586-poky-linux 23809209eecSAndrew Geissler $ echo ${CC} 23909209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/&DISTRO;/sysroots/i586-poky-linux 24009209eecSAndrew Geissler 24109209eecSAndrew GeisslerTo illustrate variable use, work through this simple "Hello World!" 24209209eecSAndrew Geisslerexample: 24309209eecSAndrew Geissler 24409209eecSAndrew Geissler1. *Create a Working Directory and Populate It:* Create a clean 24509209eecSAndrew Geissler directory for your project and then make that directory your working 24609209eecSAndrew Geissler location. 24709209eecSAndrew Geissler :: 24809209eecSAndrew Geissler 24909209eecSAndrew Geissler $ mkdir $HOME/helloworld 25009209eecSAndrew Geissler $ cd $HOME/helloworld 25109209eecSAndrew Geissler 25209209eecSAndrew Geissler After 25309209eecSAndrew Geissler setting up the directory, populate it with files needed for the flow. 25409209eecSAndrew Geissler You need a ``main.c`` file from which you call your function, a 25509209eecSAndrew Geissler ``module.h`` file to contain headers, and a ``module.c`` that defines 25609209eecSAndrew Geissler your function. 25709209eecSAndrew Geissler 25809209eecSAndrew Geissler Create the three files as follows: 25909209eecSAndrew Geissler 26009209eecSAndrew Geissler - ``main.c``: 26109209eecSAndrew Geissler :: 26209209eecSAndrew Geissler 26309209eecSAndrew Geissler #include "module.h" 26409209eecSAndrew Geissler void sample_func(); 26509209eecSAndrew Geissler int main() 26609209eecSAndrew Geissler { 26709209eecSAndrew Geissler sample_func(); 26809209eecSAndrew Geissler return 0; 26909209eecSAndrew Geissler } 27009209eecSAndrew Geissler 27109209eecSAndrew Geissler - ``module.h``: 27209209eecSAndrew Geissler :: 27309209eecSAndrew Geissler 27409209eecSAndrew Geissler #include <stdio.h> 27509209eecSAndrew Geissler void sample_func(); 27609209eecSAndrew Geissler 27709209eecSAndrew Geissler - ``module.c``: 27809209eecSAndrew Geissler :: 27909209eecSAndrew Geissler 28009209eecSAndrew Geissler #include "module.h" 28109209eecSAndrew Geissler void sample_func() 28209209eecSAndrew Geissler { 28309209eecSAndrew Geissler printf("Hello World!"); 28409209eecSAndrew Geissler printf("\n"); 28509209eecSAndrew Geissler } 28609209eecSAndrew Geissler 28709209eecSAndrew Geissler2. *Source the Cross-Toolchain Environment Setup File:* As described 28809209eecSAndrew Geissler earlier in the manual, installing the cross-toolchain creates a 28909209eecSAndrew Geissler cross-toolchain environment setup script in the directory that the 29009209eecSAndrew Geissler SDK was installed. Before you can use the tools to develop your 29109209eecSAndrew Geissler project, you must source this setup script. The script begins with 29209209eecSAndrew Geissler the string "environment-setup" and contains the machine architecture, 29309209eecSAndrew Geissler which is followed by the string "poky-linux". For this example, the 29409209eecSAndrew Geissler command sources a script from the default SDK installation directory 295*d1e89497SAndrew Geissler that uses the 32-bit Intel x86 Architecture and the &DISTRO_NAME; Yocto 29609209eecSAndrew Geissler Project release: 29709209eecSAndrew Geissler :: 29809209eecSAndrew Geissler 299*d1e89497SAndrew Geissler $ source /opt/poky/&DISTRO;/environment-setup-i586-poky-linux 30009209eecSAndrew Geissler 30109209eecSAndrew Geissler3. *Create the Makefile:* For this example, the Makefile contains 30209209eecSAndrew Geissler two lines that can be used to set the ``CC`` variable. One line is 30309209eecSAndrew Geissler identical to the value that is set when you run the SDK environment 30409209eecSAndrew Geissler setup script, and the other line sets ``CC`` to "gcc", the default 30509209eecSAndrew Geissler GNU compiler on the build host: 30609209eecSAndrew Geissler :: 30709209eecSAndrew Geissler 30809209eecSAndrew Geissler # CC=i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux 30909209eecSAndrew Geissler # CC="gcc" 31009209eecSAndrew Geissler all: main.o module.o 31109209eecSAndrew Geissler ${CC} main.o module.o -o target_bin 31209209eecSAndrew Geissler main.o: main.c module.h 31309209eecSAndrew Geissler ${CC} -I . -c main.c 31409209eecSAndrew Geissler module.o: module.c 31509209eecSAndrew Geissler module.h ${CC} -I . -c module.c 31609209eecSAndrew Geissler clean: 31709209eecSAndrew Geissler rm -rf *.o 31809209eecSAndrew Geissler rm target_bin 31909209eecSAndrew Geissler 32009209eecSAndrew Geissler4. *Make the Project:* Use the ``make`` command to create the binary 32109209eecSAndrew Geissler output file. Because variables are commented out in the Makefile, the 32209209eecSAndrew Geissler value used for ``CC`` is the value set when the SDK environment setup 32309209eecSAndrew Geissler file was run: 32409209eecSAndrew Geissler :: 32509209eecSAndrew Geissler 32609209eecSAndrew Geissler $ make 32709209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux -I . -c main.c 32809209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux -I . -c module.c 32909209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux main.o module.o -o target_bin 33009209eecSAndrew Geissler 33109209eecSAndrew Geissler From the results of the previous command, you can see that 33209209eecSAndrew Geissler the compiler used was the compiler established through the ``CC`` 33309209eecSAndrew Geissler variable defined in the setup script. 33409209eecSAndrew Geissler 33509209eecSAndrew Geissler You can override the ``CC`` environment variable with the same 33609209eecSAndrew Geissler variable as set from the Makefile by uncommenting the line in the 33709209eecSAndrew Geissler Makefile and running ``make`` again. 33809209eecSAndrew Geissler :: 33909209eecSAndrew Geissler 34009209eecSAndrew Geissler $ make clean 34109209eecSAndrew Geissler rm -rf *.o 34209209eecSAndrew Geissler rm target_bin 34309209eecSAndrew Geissler # 34409209eecSAndrew Geissler # Edit the Makefile by uncommenting the line that sets CC to "gcc" 34509209eecSAndrew Geissler # 34609209eecSAndrew Geissler $ make 34709209eecSAndrew Geissler gcc -I . -c main.c 34809209eecSAndrew Geissler gcc -I . -c module.c 34909209eecSAndrew Geissler gcc main.o module.o -o target_bin 35009209eecSAndrew Geissler 35109209eecSAndrew Geissler As shown in the previous example, the 35209209eecSAndrew Geissler cross-toolchain compiler is not used. Rather, the default compiler is 35309209eecSAndrew Geissler used. 35409209eecSAndrew Geissler 35509209eecSAndrew Geissler This next case shows how to override a variable by providing the 35609209eecSAndrew Geissler variable as part of the command line. Go into the Makefile and 35709209eecSAndrew Geissler re-insert the comment character so that running ``make`` uses the 35809209eecSAndrew Geissler established SDK compiler. However, when you run ``make``, use a 35909209eecSAndrew Geissler command-line argument to set ``CC`` to "gcc": 36009209eecSAndrew Geissler :: 36109209eecSAndrew Geissler 36209209eecSAndrew Geissler $ make clean 36309209eecSAndrew Geissler rm -rf *.o 36409209eecSAndrew Geissler rm target_bin 36509209eecSAndrew Geissler # 36609209eecSAndrew Geissler # Edit the Makefile to comment out the line setting CC to "gcc" 36709209eecSAndrew Geissler # 36809209eecSAndrew Geissler $ make 36909209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux -I . -c main.c 37009209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux -I . -c module.c 37109209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux main.o module.o -o target_bin 37209209eecSAndrew Geissler $ make clean 37309209eecSAndrew Geissler rm -rf *.o 37409209eecSAndrew Geissler rm target_bin 37509209eecSAndrew Geissler $ make CC="gcc" 37609209eecSAndrew Geissler gcc -I . -c main.c 37709209eecSAndrew Geissler gcc -I . -c module.c 37809209eecSAndrew Geissler gcc main.o module.o -o target_bin 37909209eecSAndrew Geissler 38009209eecSAndrew Geissler In the previous case, the command-line argument overrides the SDK 38109209eecSAndrew Geissler environment variable. 38209209eecSAndrew Geissler 38309209eecSAndrew Geissler In this last case, edit Makefile again to use the "gcc" compiler but 38409209eecSAndrew Geissler then use the "-e" option on the ``make`` command line: 38509209eecSAndrew Geissler :: 38609209eecSAndrew Geissler 38709209eecSAndrew Geissler $ make clean 38809209eecSAndrew Geissler rm -rf *.o 38909209eecSAndrew Geissler rm target_bin 39009209eecSAndrew Geissler # 39109209eecSAndrew Geissler # Edit the Makefile to use "gcc" 39209209eecSAndrew Geissler # 39309209eecSAndrew Geissler $ make 39409209eecSAndrew Geissler gcc -I . -c main.c 39509209eecSAndrew Geissler gcc -I . -c module.c 39609209eecSAndrew Geissler gcc main.o module.o -o target_bin 39709209eecSAndrew Geissler $ make clean 39809209eecSAndrew Geissler rm -rf *.o 39909209eecSAndrew Geissler rm target_bin 40009209eecSAndrew Geissler $ make -e 40109209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux -I . -c main.c 40209209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux -I . -c module.c 40309209eecSAndrew Geissler i586-poky-linux-gcc -m32 -march=i586 --sysroot=/opt/poky/2.5/sysroots/i586-poky-linux main.o module.o -o target_bin 40409209eecSAndrew Geissler 40509209eecSAndrew Geissler In the previous case, the "-e" option forces ``make`` to 40609209eecSAndrew Geissler use the SDK environment variables regardless of the values in the 40709209eecSAndrew Geissler Makefile. 40809209eecSAndrew Geissler 40909209eecSAndrew Geissler5. *Execute Your Project:* To execute the project (i.e. ``target_bin``), 41009209eecSAndrew Geissler use the following command: 41109209eecSAndrew Geissler :: 41209209eecSAndrew Geissler 41309209eecSAndrew Geissler $ ./target_bin 41409209eecSAndrew Geissler Hello World! 41509209eecSAndrew Geissler 41609209eecSAndrew Geissler .. note:: 41709209eecSAndrew Geissler 41809209eecSAndrew Geissler If you used the cross-toolchain compiler to build 41909209eecSAndrew Geissler target_bin 42009209eecSAndrew Geissler and your build host differs in architecture from that of the 42109209eecSAndrew Geissler target machine, you need to run your project on the target device. 42209209eecSAndrew Geissler 42309209eecSAndrew Geissler As expected, the project displays the "Hello World!" message. 424