blob: de649064ae07edfeb4d72fcf47c95a01f9ce90d3 [file] [log] [blame]
.. _kbuild_project:
Developing an Application and the Build System
**********************************************
The build system is an application centric system. The application drives the
configuration and build process of the kernel binary.
Application development can be organized in three independent directories:
the kernel base directory, the project directory, and the project source code
directory.
The Zephyr Kernel's base directory hosts the kernel source code, the
configuration options, and the kernel build definitions.
The application directory is the directory that puts together the kernel with
the developer's application. It hosts the definitions of the developers'
applications. For example, application-specific configuration options and the
application's
source code.
The Application Project
=======================
A common application project is composed of the following files:
* **Makefile**: Defines the application's build process and integrates the
developer's application with the kernel's build system.
* **Configuration file**: Allows the developer to override the platform's
default configuration.
* **MDEF**: Defines the set of kernel objects that the the application
instantiates. Required only by the microkernel.
* **The :file:`src/` directory**: By default, this directory hosts the
application's source code. This location can be overridden and defined in a
different directory.
* **Makefile**: Adds the developer's source code into the build system's
recursion model.
The application's source code can be organized in subdirectories.
Each directory must follow the Kbuild Makefile conventions; see
:ref:`kbuild_makefiles`.
Application Definition
======================
The developer defines the relationship of application to build system through
the Makefiles. The application is integrated into the build system by
including the Makefile.inc file provided.
.. code-block:: make
include $(ZEPHYR_BASE)/Makefile.inc
The following predefined variables configure the development project:
* :makevar:`ARCH`: Specifies the build architecture for the kernel. The
architectures currently supported are x86, arm and arc. The build system
sets C flags, selects the default configuration and uses the appropriate
toolchain tools. The default value is x86.
* :makevar:`ZEPHYR_BASE`: Sets the path to the kernel's base directory.
This variable is usually set by the :file:`zephyr_env.sh` script.
It can be used to get the kernel's base directory, as used in the
Makefile.inc inclusion above, or it can be overridden to select an
specific instance of the kernel.
* :makevar:`PROJECT_BASE`: Provides the developer's application project
directory path. It is set by the :file:`Makefile.inc` file.
* :makevar:`SOURCE_DIR`: Overrides the default value for the application's
source code directory. The developer source code directory is set to
:file:`$(PROJECT_BASE/)src/` by default. This directory name should end
with slash **'/'**.
* :makevar:`BOARD`: Selects the platform that the application's
build will use for the default configuration.
* :makevar:`KERNEL_TYPE`: Selects the kernel type that the application's
build will use for the default configuration. It indicates whether to use a
nanokernel or microkernel architecture.
The supported values are **nano** and **micro**.
* :makevar:`MDEF_FILE`: Indicates the name of the MDEF file; required for
microkernel architectures only.
* :makevar:`CONF_FILE`: Indicates the name of a configuration fragment file.
This file includes the kconfig configuration values that override the
default configuration values.
* :makevar:`O`: Optional. Indicates the output directory that Kconfig uses.
The output directory stores all the files generated during the build
process. The default output directory is the :file:`$(PROJECT_BASE)/outdir`
directory.
Application Debugging
=====================
This section is a quick hands-on reference to start debugging your
application with QEMU. Most content in this section is already covered on
`QEMU`_ and `GNU_Debugger`_ reference manuals.
.. _QEMU: http://wiki.qemu.org/Main_Page
.. _GNU_Debugger: http://www.gnu.org/software/gdb
In this quick reference you find shortcuts, specific environmental variables
and parameters that can help you to quickly set up your debugging
environment.
The simplest way to debug an application running in QEMU is using the GNU
Debugger and setting a local GDB server in your development system
through QEMU.
You will need an ELF binary image for debugging purposes.
The build system generates the image in the output directory.
By default, the kernel binary name is :file:`zephyr.elf`. The name can be
changed using Kconfig.
.. note::
We will use the standard 1234 TCP port to open a
:abbr:`GDB (GNU Debugger)` server instance. This port number can be
changed for a port that best suits the development system.
QEMU is the supported emulation system of the kernel. QEMU must be invoked
with the -s and -S options.
* :option:`-S` Do not start CPU at startup; rather, you must type 'c' in the
monitor.
* :option:`-s` Shorthand for :literal:`-gdb tcp::1234`: open a GDB server on
TCP port 1234.
The build system can build the elf binary and call the QEMU process with
the :makevar:`qemu` target. The QEMU debug options can be set using the
environment variable :envvar:`QEMU_EXTRA_FLAGS`. To set the :option:`-s` and
:option:`-S` options:
.. code-block:: bash
export QEMU_EXTRA_FLAGS="-s -S"
The build and emulation processes are called with the Makefile :option:`qemu`
target:
.. code-block:: bash
make qemu
The build system will start a QEMU instance with the CPU halted at startup
and with a GDB server instance listening at the TCP port 1234.
The :file:`.gdbinit` will help initialize your GDB instance on every run.
In this example, the initialization file points to the GDB server instance.
It configures a connection to a remote target at the local host on the TCP
port 1234. The initialization sets the kernel's root directory as a
reference. The :file:`.gdbinit` file contains the following lines:
.. code-block:: bash
target remote localhost:1234
dir ZEPHYR_BASE
.. note::
Substitute ZEPHYR_BASE for the current kernel's root directory.
Execute the application to debug from the same directory that you chose for
the :file:`gdbinit` file. The command can include the :option:`--tui` option
to enable the use of a terminal user interface. The following commands
connects to the GDB server using :file:`gdb`. The command loads the symbol
table from the elf binary file. In this example, the elf binary file name
corresponds to :file:`zephyr.elf` file:
.. code-block:: bash
gdb --tui zephyr.elf
.. note::
The GDB version on the development system might not support the --tui
option.
Finally, this command connects to the GDB server using the Data
Displayer Debugger (:file:`ddd`). The command loads the symbol table from the
elf binary file, in this instance, the :file:`zephyr.elf` file.
.. note::
The :abbr:`DDD (Data Displayer Debugger)` may not be installed in your
development system by default. Follow your system instructions to install
it.
.. code-block:: bash
ddd --gdb --debugger "gdb zephyr.elf"
.. note::
Both commands execute the :abbr:`gdb (GNU Debugger)`.
The command name might change depending on the toolchain you are using
and your cross-development tools.