xref: /openbmc/openbmc/poky/documentation/sdk-manual/working-projects.rst (revision d1e894976442c78577f52fe7b169812d00289120)
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