.. _chapter-pw-env_setup: ------------ pw_env_setup ------------ A classic problem in the embedded space is reducing the time from git clone to having a binary executing on a device. The issue is that an entire suite of tools is needed for non-trivial production embedded projects. For example: - A C++ compiler for your target device, and also for your host - A build system or three; for example, GN, Ninja, CMake, Bazel - A code formatting program like clang-format - A debugger like OpenOCD to flash and debug your embedded device - A known Python version with known modules installed for scripting - A Go compiler for the Go-based command line tools ...and so on In the server space, container solutions like Docker or Podman solve this; however, in our experience container solutions are a mixed bag for embedded systems development where one frequently needs access to native system resources like USB devices, or must operate on Windows. ``pw_env_setup`` is our compromise solution for this problem that works on Mac, Windows, and Linux. It leverages the Chrome packaging system `CIPD`_ to bootstrap a Python installation, which in turn inflates a virtual environment. The tooling is installed into your workspace, and makes no changes to your system. This tooling is designed to be reused by any project. .. _CIPD: https://github.com/luci/luci-go/tree/master/cipd .. warning:: At this time ``pw_env_setup`` works for us, but isn’t well tested. We don’t suggest relying on it just yet. However, we are interested in experience reports; if you give it a try, please `send us a note`_ about your experience. .. _send us a note: pigweed@googlegroups.com Projects using Pigweed can leverage ``pw_env_setup`` to install their own dependencies. The following environment variables are now used to pass options into pw_env_setup. * ``PW_CIPD_PACKAGE_FILES`` * ``PW_VIRTUALENV_REQUIREMENTS`` * ``PW_VIRTUALENV_SETUP_PY_ROOTS`` * ``PW_CARGO_PACKAGE_FILES`` Each of these variables can contain multiple entries separated by ``:`` (or ``;`` on Windows) like the ``PATH`` environment variable. However, they will also be interpreted as globs, so ``PW_VIRTUALENV_REQUIREMENTS="/foo/bar/*/requirements.txt"`` is perfectly valid. They should be full paths. Projects depending on Pigweed should set these variables and then invoke Pigweed's ``bootstrap.sh`` (or ``bootstrap.bat``), which will add to each of these variables before invoking ``pw_env_setup``. Users wanting additional setup can set these variables in their shell init files. Pigweed will add to these variables and will not remove any existing values. At the end of Pigweed's bootstrap process, it will reset these variables to their initial values.