|  | .. _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 |