| .. _docs-getting-started: |
| |
| =============== |
| Getting Started |
| =============== |
| This guide will walk you through the typical upstream development workflow. |
| |
| .. note:: |
| |
| We don't yet have thorough documentation for leveraging Pigweed in a separate |
| project (our intended use case!). The `sample project |
| <https://pigweed.googlesource.com/pigweed/sample_project/+/main/README.md>`_ |
| shows how to use Pigweed as a library in your broader project, but you may |
| need further guidance. |
| |
| We're happy to help you get your project setup; just drop in our `chat room |
| <https://discord.gg/M9NSeTA>`_ or send a note to the `mailing list |
| <https://groups.google.com/forum/#!forum/pigweed>`_. |
| |
| Express setup |
| ============= |
| If you'd like to skip the detailed explanations, below is the shorter version |
| of getting setup for Pigweed. If you run into trouble, look at the more |
| in-depth guide below, starting at :ref:`prerequisites`. The express setup |
| configures Pigweed's watcher for three targets to give a taste of Pigweed: |
| |
| #. **Host** - Mac, Linux, or Windows. Builds and runs tests |
| #. **Device/STM32F429** - Build only; Optionally, the STM32F429I-DISC1 kit to |
| follow along later in the guide to run tests directly on said device(s) |
| #. **Docs** - Builds the Pigweed docs |
| |
| To get setup: |
| |
| #. Make sure you have Git and Python installed and on your path. |
| |
| #. Clone Pigweed and bootstrap the environment (compiler setup & more). **Be |
| patient, this step downloads ~1GB of LLVM, GCC, and other tooling**. |
| |
| .. code:: bash |
| |
| $ cd ~ |
| $ git clone https://pigweed.googlesource.com/pigweed/pigweed |
| ... |
| $ cd pigweed |
| $ source ./bootstrap.sh (On Linux & Mac) |
| $ bootstrap.bat (On Windows) |
| ... |
| |
| #. Configure the GN build. |
| |
| .. code:: bash |
| |
| $ gn gen out |
| Done. Made 1047 targets from 91 files in 114ms |
| |
| #. Start the watcher. The watcher will invoke Ninja to build all the targets |
| |
| .. code:: bash |
| |
| $ pw watch |
| |
| ▒█████▄ █▓ ▄███▒ ▒█ ▒█ ░▓████▒ ░▓████▒ ▒▓████▄ |
| ▒█░ █░ ░█▒ ██▒ ▀█▒ ▒█░ █ ▒█ ▒█ ▀ ▒█ ▀ ▒█ ▀█▌ |
| ▒█▄▄▄█░ ░█▒ █▓░ ▄▄░ ▒█░ █ ▒█ ▒███ ▒███ ░█ █▌ |
| ▒█▀ ░█░ ▓█ █▓ ░█░ █ ▒█ ▒█ ▄ ▒█ ▄ ░█ ▄█▌ |
| ▒█ ░█░ ░▓███▀ ▒█▓▀▓█░ ░▓████▒ ░▓████▒ ▒▓████▀ |
| |
| 20200707 17:24:06 INF Starting Pigweed build watcher |
| 20200707 17:24:06 INF Will build [1/1]: out |
| 20200707 17:24:06 INF Attaching filesystem watcher to $HOME/wrk/pigweed/... |
| 20200707 17:24:06 INF Triggering initial build... |
| ... |
| |
| #. **Congratulations, you're ready to go!** Now take Pigweed for a spin by |
| making a test fail. |
| |
| #. With the watcher running in a separate window, edit |
| ``pw_status/status_test.cc`` to make an expectation fail; for example, add |
| ``EXPECT_EQ(0, 1);`` in a test. |
| |
| #. Save the file. Observe the watcher rebuild & retest, and fail. Restore the |
| test if you feel like it. |
| |
| #. Open the generated docs in ``out/docs/gen/docs/html/index.html`` in your |
| browser. |
| |
| #. Edit ``docs/getting_started.rst`` (this file!) and make any change. Save. |
| See the watcher rebuild the docs. Reload your browser, and see the changes. |
| |
| See below for equivalent Windows commands, and for more details on what each |
| part does. |
| |
| **Note:** After running bootstrap once, use ``source ./activate.sh`` (or |
| ``activate.bat`` on Windows) to re-activate the environment without |
| re-bootstrapping. |
| |
| .. _prerequisites: |
| |
| Prerequisites |
| ------------- |
| **Linux** |
| |
| Most Linux installations should work out of box, and not require any manual |
| installation of prerequisites beyond basics like ``git`` and |
| ``build-essential``. Make sure gcc is set to gcc-8. |
| |
| **macOS** |
| |
| To start using Pigweed on MacOS, you'll need to install XCode. Download it |
| via the App Store, then install the relevant tools from the command line. |
| |
| .. code:: none |
| |
| $ xcode-select --install |
| |
| On macOS you may get SSL certificate errors with the system Python |
| installation. Run ``sudo pip install certifi`` to fix this. If you get SSL |
| errors with the Python from `Homebrew <https://brew.sh>`_ try running the |
| following commands to ensure Python knows how to use OpenSSL. |
| |
| .. code:: none |
| |
| $ brew install openssl |
| $ brew uninstall python |
| $ brew install python |
| |
| To flash firmware to a STM32 Discovery development board (and run ``pw test``) |
| from macOS, you will need to install OpenOCD. Install |
| [Homebrew](https://brew.sh), then install OpenOCD with `brew install openocd`. |
| |
| **Windows** |
| |
| To start using Pigweed on Windows, you'll need to install `Git |
| <https://git-scm.com/download/win>`_ and `Python |
| <https://www.python.org/downloads/windows/>`_. We recommend you install Git to |
| run from the command line and third party software. |
| |
| If you plan to flash devices with firmware, you'll need to install OpenOCD and |
| ensure it's on your system path. |
| |
| Bootstrap |
| ========= |
| |
| Once you satisfied the prerequisites, you will be able to clone Pigweed and |
| run the bootstrap that initializes the Pigweed virtual environment. The |
| bootstrap may take several minutes to complete, so please be patient. |
| |
| **Linux & macOS** |
| |
| .. code:: bash |
| |
| $ git clone https://pigweed.googlesource.com/pigweed/pigweed ~/pigweed |
| $ cd ~/pigweed |
| $ source ./bootstrap.sh |
| |
| **Windows** |
| |
| .. code:: batch |
| |
| :: Run git commands from the shell you set up to use with Git during install. |
| > git clone https://pigweed.googlesource.com/pigweed/pigweed %HOMEPATH%\pigweed |
| > cd %HOMEPATH%\pigweed |
| > bootstrap.bat |
| |
| Below is a real-time demo with roughly what you should expect to see as output: |
| |
| .. image:: images/pw_env_setup_demo.gif |
| :width: 800 |
| :alt: build example using pw watch |
| |
| Congratulations, you are now set up to start using Pigweed! |
| |
| Pigweed Environment |
| =================== |
| After going through the initial setup process, your current terminal will be in |
| the Pigweed development environment that provides all the tools you should need |
| to develop on Pigweed. If you leave that session, you can activate the |
| environment in a new session with the following command: |
| |
| **Linux & macOS** |
| |
| .. code:: bash |
| |
| $ source ./activate.sh |
| |
| **Windows** |
| |
| .. code:: batch |
| |
| > activate.bat |
| |
| Some major changes may require triggering the bootstrap again, so if you run |
| into host tooling changes after a pull it may be worth re-running bootstrap. |
| |
| Build Pigweed for Host |
| ====================== |
| Pigweed's primary build system is GN/Ninja based. There are CMake and Bazel |
| builds in-development, but they are incomplete and don't have feature parity |
| with the GN build. We strongly recommend you stick to the GN build system. |
| |
| GN (Generate Ninja) just does what it says on the tin; GN generates |
| `Ninja <https://ninja-build.org/>`_ build files. |
| |
| The default GN configuration generates build files that allow you to build host |
| binaries, device binaries, and upstream documentation all in one Ninja |
| invocation. |
| |
| Run GN as seen below: |
| |
| .. code:: bash |
| |
| $ gn gen out |
| |
| Note that ``out`` is simply the directory the build files are saved to. Unless |
| this directory is deleted or you desire to do a clean build, there's no need to |
| run GN again; just rebuild using Ninja directly. |
| |
| Now that we have build files, it's time to build Pigweed! |
| |
| Now you *could* manually invoke the host build using ``ninja -C out`` every |
| time you make a change, but that's tedious. Instead, let's use ``pw_watch``. |
| |
| Go ahead and start ``pw_watch``: |
| |
| .. code:: bash |
| |
| $ pw watch |
| |
| When ``pw_watch`` starts up, it will automatically build the directory we |
| generated in ``out``. Additionally, ``pw_watch`` watches source code files for |
| changes, and triggers a Ninja build whenever it notices a file has been saved. |
| You might be surprised how much time it can save you! |
| |
| With ``pw watch`` running, try modifying |
| ``pw_status/public/pw_status/status.h`` and watch the build re-trigger when you |
| save the file. |
| |
| See below for a demo of this in action: |
| |
| .. image:: images/pw_watch_build_demo.gif |
| :width: 800 |
| :alt: build example using pw watch |
| |
| Running Unit Tests |
| ================== |
| Fun fact, you've been running the unit tests already! Ninja builds targeting |
| the host automatically build and run the unit tests. Unit tests err on the side |
| of being quiet in the success case, and only output test results when there's a |
| failure. |
| |
| To see the a test failure, modify ``pw_status/status_test.cc`` to fail by |
| changing one of the strings in the "KnownString" test. |
| |
| .. image:: images/pw_watch_test_demo.gif |
| :width: 800 |
| :alt: example test failure using pw watch |
| |
| Running tests as part of the build isn't particularly expensive because GN |
| caches passing tests. Each time you build, only the tests that are affected |
| (whether directly or transitively) by the code changes since the last build |
| will be re-built and re-run. |
| |
| Try running the ``pw_status`` test manually: |
| |
| .. code:: bash |
| |
| $ ./out/host_{clang,gcc}_debug/obj/pw_status/test/status_test |
| |
| Depending on your host OS, the compiler will default to either ``clang`` or |
| ``gcc``. |
| |
| Building for a Device |
| ===================== |
| A Pigweed "target" is a build configuration that includes a toolchain, default |
| library configurations, and more to result in binaries that run natively on the |
| target. With the default build invocation, you're already building for a device |
| target (the STMicroelectronics STM32F429I-DISC1) in parallel with the host |
| build! |
| |
| If you want to build JUST for the device, you can kick of watch with: |
| |
| .. code:: bash |
| |
| $ pw watch stm32f429i |
| |
| This is equivalent to the following Ninja invocation: |
| |
| .. code:: bash |
| |
| $ ninja -C out stm32f429i |
| |
| Running Tests on a Device |
| ========================= |
| While tests run automatically on the host, it takes a few more steps to get |
| tests to run automatically on a device, too. Even though we've verified tests |
| pass on the host, it's crucial to verify the same with on-device testing. We've |
| encountered some unexpected bugs that can only be found by running the unit |
| tests directly on the device. |
| |
| 1. Connect Device(s) |
| -------------------- |
| Connect any number of STM32F429I-DISC1 boards to your computer using the mini |
| USB port on the board (**not** the micro USB). Pigweed will automatically |
| detect the boards and distribute the tests across the devices. More boards = |
| faster tests! Keep in mind that you may have to make some environment specific |
| updates to ensure you have permissions to use the USB device. For example, on |
| Linux you may need to update your udev rules and ensure you're in the plugdev |
| and dialout groups. |
| |
| .. image:: images/stm32f429i-disc1_connected.jpg |
| :width: 800 |
| :alt: development boards connected via USB |
| |
| 2. Launch Test Server |
| --------------------- |
| To allow Ninja to run tests on an arbitrary number of devices, Ninja will send |
| test requests to a server running in the background. Launch the server in |
| another window using the command below (remember, you'll need to activate the |
| Pigweed environment first). |
| |
| .. code:: bash |
| |
| $ stm32f429i_disc1_test_server |
| |
| **Note:** If you attach or detach any more boards to your workstation you'll |
| need to relaunch this server. |
| |
| 3. Configure GN |
| --------------- |
| Tell GN to use the testing server by enabling a build arg specific to the |
| stm32f429i-disc1 target. |
| |
| .. code:: bash |
| |
| $ gn args out |
| # Append this line to the file that opens in your editor to tell GN to run |
| # on-device unit tests. |
| pw_use_test_server = true |
| |
| Done! |
| ----- |
| Whenever you make code changes and trigger a build, all the affected unit tests |
| will be run across the attached boards! |
| |
| See the demo below for an example of what this all looks like put together: |
| |
| .. image:: images/pw_watch_on_device_demo.gif |
| :width: 800 |
| :alt: pw watch running on-device tests |
| |
| Building the Documentation |
| ========================== |
| In addition to the markdown documentation, Pigweed has a collection of |
| information-rich RST files that are used to generate HTML documentation. All |
| the docs are hosted at https://pigweed.dev/, and are built as a part of the |
| default build invocation. This makes it easier to make changes and see how they |
| turn out. Once built, you can find the rendered HTML documentation at |
| ``out/docs/gen/docs/html``. |
| |
| You can explicitly build just the documentation with the command below. |
| |
| .. code:: bash |
| |
| $ ninja -C out docs |
| |
| This concludes the introduction to developing for upstream Pigweed. |
| |
| Next steps |
| ========== |
| |
| Check out other modules |
| ----------------------- |
| If you'd like to see more of what Pigweed has to offer, dive into the |
| :ref:`docs-module-guides`. |
| |
| Check out the sample project |
| ---------------------------- |
| We have a `sample project |
| <https://pigweed.googlesource.com/pigweed/sample_project/+/main/README.md>`_ |
| that demonstrates how to use Pigweed in your own project. Note that there are |
| many ways to leverage Pigweed and the sample project is one approach. |
| |
| Check out the Hackaday Supercon talk about Pigweed |
| -------------------------------------------------- |
| We gave a talk at Hackaday's 2021 supercon, `Give Pigweed a Whirl |
| <https://hackaday.com/2021/01/13/remoticon-video-pigweed-brings-embedded-unit-testing-library-integration-to-commandline/>`_ |
| |
| We've made improvements since we gave the talk; for example, we now have RTOS |
| primitives. |
| |
| Set up Pigweed for your own project |
| ------------------------------------ |
| We don't yet have thorough documentation for leveraging Pigweed in a separate |
| project (our intended use case!). The `sample project |
| <https://pigweed.googlesource.com/pigweed/sample_project/+/main/README.md>`_ |
| shows how to use Pigweed as a library in your broader project, but you may need |
| further guidance. |
| |
| Dropping into our `chat room <https://discord.gg/M9NSeTA>`_ is the most |
| immediate way to get help. Alternatively, you can send a note to the `mailing |
| list <https://groups.google.com/forum/#!forum/pigweed>`_. |