| .. _docs-targets: | |
| ======= | |
| Targets | |
| ======= | |
| Pigweed is designed to be portable to many different hardware platforms. | |
| Pigweed's GN build comes with an extensible target system that allows it to be | |
| configured to build for any number of platforms, which all build simultaneously. | |
| Defining a target | |
| ================= | |
| Each Pigweed target built by a project is defined within the GN build as a | |
| toolchain providing the target's build parameters. | |
| In Pigweed, these target toolchains are defined as GN scopes, which are fed into | |
| a ``generate_toolchain`` template to create the complete GN toolchain. | |
| Hierarchical target structure | |
| ----------------------------- | |
| The rationale for scope-based toolchains is to make Pigweed targets extensible. | |
| Variables from a toolchain can be forwarded into new scopes and then extended | |
| or overriden. This facilitates the sharing of common configuration options | |
| between toolchains, and allows for hierarchical structures. Upstream Pigweed | |
| makes use of this heavily; it defines basic compiler-only configurations, uses | |
| these as a base for board-specific toolchains, then creates its final targets on | |
| top of those. | |
| .. blockdiag:: | |
| blockdiag { | |
| default_fontsize = 14; | |
| orientation = portrait; | |
| arm_gcc [label = "arm_gcc"]; | |
| arm_gcc_cortex_m4 [label = "cortex_m4"]; | |
| arm_gcc_cortex_m4f [label = "cortex_m4f"]; | |
| arm_gcc_cortex_m4f_debug [label = "cortex_m4f_debug"]; | |
| arm_gcc_cortex_m4f_size_optimized [label = "cortex_m4f_size_optimized"]; | |
| stm32f429i_disc1_debug [label = "stm32f429i_disc1_debug"]; | |
| arm_gcc -> arm_gcc_cortex_m4 | |
| arm_gcc -> arm_gcc_cortex_m4f | |
| arm_gcc_cortex_m4f -> arm_gcc_cortex_m4f_debug | |
| arm_gcc_cortex_m4f -> arm_gcc_cortex_m4f_size_optimized | |
| arm_gcc_cortex_m4f_debug -> stm32f429i_disc1_debug | |
| } | |
| Toolchain target variables | |
| -------------------------- | |
| The core of a toolchain is defining the tools it uses. This is done by setting | |
| the variables ``ar``, ``cc``, and ``cxx`` to the appropriate compilers. Pigweed | |
| provides many commonly used compiler configurations in the ``pw_toolchain`` | |
| module. | |
| The rest of the a Pigweed target's configuration is listed within a ``defaults`` | |
| scope in its toolchain. Every variable in this scope is an override of a GN | |
| build argument defined in Pigweed. Some notable arguments include: | |
| * ``default_configs``: A list of GN configs to apply to every ``pw_*`` GN | |
| template. This is typically used to set compiler flags, optimization levels, | |
| global #defines, etc. | |
| * ``default_public_deps``: List of GN targets which are added as a dependency | |
| to all ``pw_*`` GN targets. This is used to add global module dependencies; | |
| for example, in upstream, ``pw_polyfill`` is added here to provide C++17 | |
| features in C++11/C++14 code. | |
| * Facade backends: Pigweed defines facades to provide a common interface for | |
| core system features such as logging without assuming an implementation. | |
| When building a Pigweed target, the implementations for each of these must be | |
| chosen. The ``*_BACKEND`` build args that Pigweed defines are used to set | |
| these. | |
| There are many other build arguments that can be set, some of which are | |
| module-specific. A full list can be seen by running ``gn args --list out``, | |
| and further documentation can be found within their respective modules. | |
| Example Pigweed target | |
| ====================== | |
| The code below demonstrates how a project might configure one of its Pigweed | |
| targets. | |
| .. code:: | |
| # Prevent gn format from reordering this import. | |
| import("//build_overrides/pigweed.gni") | |
| import("$dir_pw_toolchain/arm_gcc/toolchains.gni") | |
| import("$dir_pw_toolchain/generate_toolchain.gni") | |
| my_target_scope = { | |
| # Use Pigweed's Cortex M4 toolchain as a base. | |
| _toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_debug | |
| # Forward everything except the defaults scope from that toolchain. | |
| forward_variables_from(_toolchain_base, "*", [ "defaults" ]) | |
| defaults = { | |
| # Forward everything from the base toolchain's defaults. | |
| forward_variables_from(_toolchain_base.defaults, "*") | |
| # Extend with custom build arguments for the target. | |
| pw_log_BACKEND = dir_pw_log_tokenized | |
| } | |
| } | |
| # Create the actual GN toolchain from the scope. | |
| generate_toolchain("my_target") { | |
| forward_variables_from(my_target_scope, "*") | |
| } | |
| Upstream targets | |
| ================ | |
| The following is a list of targets used for upstream Pigweed development. | |
| .. toctree:: | |
| :maxdepth: 1 | |
| :glob: | |
| targets/*/target_docs |