| .. _module-pw_build_mcuxpresso: |
| |
| =================== |
| pw_build_mcuxpresso |
| =================== |
| |
| The ``pw_build_mcuxpresso`` module provides helper utilities for building a |
| target based on an NXP MCUXpresso SDK. |
| |
| The GN build files live in ``third_party/mcuxpresso`` but are documented here. |
| The rationale for keeping the build files in ``third_party`` is that code |
| depending on an MCUXpresso SDK can clearly see that their dependency is on |
| third party, not pigweed code. |
| |
| ----------------------- |
| Using an MCUXpresso SDK |
| ----------------------- |
| An MCUXpresso SDK consists of a number of components, each of which has a set |
| of sources, headers, preprocessor defines, and dependencies on other |
| components. These are all described in an XML "manifest" file included in the |
| SDK package. |
| |
| To use the SDK within a Pigweed project, the set of components you need must be |
| combined into a library that you can depend on. This library will include all of |
| the sources and headers, along with necessary preprocessor defines, for those |
| components and their dependencies. |
| |
| Optional components |
| =================== |
| Including components will include all of their required dependencies. Where the |
| components you include have optional dependencies, they must be satisfied by the |
| set of components you include otherwise the library generation will fail with an |
| error. |
| |
| Excluding components |
| ==================== |
| Components can be excluded from the generated source set, for example to |
| suppress errors about optional dependencies your project does not need, or to |
| prevent an unwanted component dependency from being introduced into your |
| project. |
| |
| mcuxpresso_builder |
| ================== |
| ``mcuxpresso_builder`` is a utility installed into the environment that is used |
| by the GN build scripts in ``third_party/mcuxpresso``, or directly by you to |
| generate rules for the Bazel build. |
| |
| Usage is documented for each build system in the relevant section. |
| |
| ------------ |
| The GN build |
| ------------ |
| Using an MCUxpresso SDK within a Pigweed project that uses the GN Build system |
| involves the creation of one or more ``pw_source_set`` targets you can depend on |
| in your executable targets. |
| |
| These source sets sets are defined using the ``pw_mcuxpresso_sdk`` template. |
| Provide the path to the ``manifest`` XML, along with the names of the components |
| you wish to ``include``. |
| |
| For boards with multiple cores, pass the specific core to filter components for |
| in ``device_core``. |
| |
| .. code-block:: text |
| |
| import("$dir_pw_third_party/mcuxpresso/mcuxpresso.gni") |
| |
| pw_mcuxpresso_sdk("sample_project_sdk") { |
| manifest = "$dir_pw_third_party/mcuxpresso/evkmimxrt595/EVK-MIMXRT595_manifest_v3_13.xml" |
| include = [ |
| "component.serial_manager_uart.MIMXRT595S", |
| "project_template.evkmimxrt595.MIMXRT595S", |
| "utility.debug_console.MIMXRT595S", |
| ] |
| device_core = "cm33_MIMXRT595S" |
| } |
| |
| pw_executable("hello_world") { |
| sources = [ "hello_world.cc" ] |
| deps = [ ":sample_project_sdk" ] |
| } |
| |
| To exclude components, provide the list to ``exclude`` as an argument to the |
| template. For example to replace the FreeRTOS kernel bundled with the MCUXpresso |
| SDK with the Pigweed third-party target: |
| |
| .. code-block:: text |
| |
| pw_mcuxpresso_sdk("freertos_project_sdk") { |
| // manifest and includes ommitted for clarity |
| exclude = [ "middleware.freertos-kernel.MIMXRT595S" ] |
| public_deps = [ "$dir_pw_third_party/freertos" ] |
| } |
| |
| Introducing dependencies |
| ======================== |
| As seen above, the generated source set can have dependencies added by passing |
| the ``public_deps`` (or ``deps``) arguments to the template. |
| |
| You can also pass the ``allow_circular_includes_from``, ``configs``, and |
| ``public_configs`` arguments to augment the generated source set. |
| |
| For example it is very common to replace the ``project_template`` component with |
| a source set of your own that provides modified copies of the files from the |
| SDK. |
| |
| To resolve circular dependencies, in addition to the generated source set, two |
| configs named with the ``__defines`` and ``__includes`` suffixes on the template |
| name are generated, to provide the preprocessor defines and include paths that |
| the source set uses. |
| |
| .. code-block:: text |
| |
| pw_mcuxpresso_sdk("my_project_sdk") { |
| manifest = "$dir_pw_third_party/mcuxpresso/evkmimxrt595/EVK-MIMXRT595_manifest_v3_13.xml" |
| include = [ |
| "component.serial_manager_uart.MIMXRT595S", |
| "utility.debug_console.MIMXRT595S", |
| ] |
| public_deps = [ ":my_project_config" ] |
| allow_circular_includes_from = [ ":my_project_config" ] |
| } |
| |
| pw_source_set("my_project_config") { |
| sources = [ "board.c", "clock_config.c", "pin_mux.c" ] |
| public = [ "board.h", "clock_config.h", "pin_mux.h "] |
| public_configs = [ |
| ":my_project_sdk__defines", |
| ":my_project_sdk__includes" |
| ] |
| } |
| |
| mcuxpresso_builder |
| ================== |
| For the GN build, this utility is invoked by the ``pw_mcuxpresso_sdk`` template. |
| You should only need to interact with ``mcuxpresso_builder`` directly if you are |
| doing something custom. |
| |
| The ``gn`` subcommand outputs a GN scope describing the result of expanding the |
| set of included and excluded components. |
| |
| The ``--prefix`` option specifies the GN location of the SDK files. |
| |
| .. code-block:: bash |
| |
| mcuxpresso_builder gn /path/to/manifest.xml \ |
| --include project_template.evkmimxrt595.MIMXRT595S \ |
| --include utility.debug_console.MIMXRT595S \ |
| --include component.serial_manager_uart.MIMXRT595S \ |
| --exclude middleware.freertos-kernel.MIMXRT595S \ |
| --device-core cm33_MIMXRT595S \ |
| --prefix //path/to/sdk |
| |
| --------------- |
| The Bazel build |
| --------------- |
| To use an MCUxpresso SDK within a Pigweed project that uses tha Bazel build |
| system, you must use the ``mcuxpresso_builder`` tool directly and place its |
| output in ``BUILD`` or ``BUILD.bazel`` files yourself. |
| |
| Provide the path to the manifest XML, the ``--name`` of the ``cc_library`` to |
| create, along with the names of the components you wish to ``--include`` or |
| ``--exclude``. |
| |
| .. code-block:: bash |
| |
| mcuxpresso_builder bazel /path/to/manifest.xml \ |
| --name example_sdk \ |
| --include project_template.evkmimxrt595.MIMXRT595S \ |
| --include utility.debug_console.MIMXRT595S \ |
| --include component.serial_manager_uart.MIMXRT595S \ |
| --exclude middleware.freertos-kernel.MIMXRT595S \ |
| --device-core cm33_MIMXRT595S |
| |
| |
| Place the resulting output in a ``BUILD`` file, and then modify your |
| ``WORKSPACE`` to associate this build file with the path to the MCUxpresso SDK |
| checkout. |
| |
| .. code-block:: python |
| |
| new_local_repository( |
| name = "mcuxpresso_sdk", |
| build_file = "//third_party/mcuxpresso_sdk/BUILD", |
| path = "third_party/evkmimxrt595/sdk", |
| ) |
| |
| To add other dependencies, compiler definitions, etc. it is recommended that |
| you do so by creating a new target, and add a dependency to it, rather than |
| modifying the generated targets. |