.. _module-pw_arduino_build:
-----------------
pw_arduino_build
-----------------
The ``pw_arduino_build`` module contains both the `arduino_builder`_ command
line utility and an `Arduino Main Wrapper`_.
.. seealso::
See the :ref:`target-arduino` target documentation for a list of supported
hardware.
Arduino Main Wrapper
====================
``arduino_main_wrapper.cc`` implements the standard ``setup()`` and ``loop()``
functions [#f1]_ that are expected in Arduino sketches.
Pigweed executables rely on being able to define the ``main()`` function. This
is a problem for Arduino code as each core defines it's own ``main()``. To get
around this the Pigweed Arduino target renames ``main()`` to ``ArduinoMain()``
using a preprocessor macro: ``-Dmain(...)=ArduinoMain()``. This macro only
applies when compiling Arduino core source files. That frees up ``main()`` to be
used elsewhere.
Most Arduino cores will do some internal initialization before calling
``setup()`` followed by ``loop()``. To make sure Pigweed ``main()`` is started
after that early init we run it within ``setup()``:
.. code-block:: cpp
void setup() {
pw_arduino_Init();
// Start Pigweed main()
main();
}
void loop() {}
.. note::
``pw_arduino_Init()`` initializes the :ref:`module-pw_sys_io_arduino`
module.
.. warning::
You may notice ``loop()`` is empty in ``arduino_main_wrapper.cc`` and never
called. This will cause any code appearing after ``loop()`` in an Arduino
core to never be executed. For most cores this should be ok but may cause
issues in some scenarios.
arduino_builder
===============
``arduino_builder`` is utility that can extract compile and tooling information
from an Arduino core. It's used within Pigweed to shovel compiler flags into
the `GN `_ build system. It will also work
without Pigweed and can be used with other build systems.
Full documentation is pending. For now run ``arduino_builder --help`` for
details.
.. rubric::
Footnotes
.. [#f1]
See the Arduino Reference documentation on `setup()
`_, and
`loop()
`_.