1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_package: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard Worker========== 4*61c4878aSAndroid Build Coastguard Workerpw_package 5*61c4878aSAndroid Build Coastguard Worker========== 6*61c4878aSAndroid Build Coastguard WorkerThe package module provides a mechanism to install additional tools used by 7*61c4878aSAndroid Build Coastguard WorkerPigweed. Most Pigweed dependencies should be installed using 8*61c4878aSAndroid Build Coastguard Worker:ref:`module-pw_env_setup`. Examples of reasons packages should be managed using 9*61c4878aSAndroid Build Coastguard Workerthis module instead are listed below. 10*61c4878aSAndroid Build Coastguard Worker 11*61c4878aSAndroid Build Coastguard Worker* The dependency is extremely large and not commonly used. 12*61c4878aSAndroid Build Coastguard Worker* The dependency has a number of compatible versions and we want to allow 13*61c4878aSAndroid Build Coastguard Worker downstream projects to pick a version rather than being forced to use ours. 14*61c4878aSAndroid Build Coastguard Worker* The dependency has license issues that make it complicated for Google to 15*61c4878aSAndroid Build Coastguard Worker include it directly as a submodule or distribute it as a CIPD package. 16*61c4878aSAndroid Build Coastguard Worker* The dependency needs to be "installed" into the system in some manner beyond 17*61c4878aSAndroid Build Coastguard Worker just extraction and thus isn't a good match for distribution with CIPD. 18*61c4878aSAndroid Build Coastguard Worker 19*61c4878aSAndroid Build Coastguard Worker----- 20*61c4878aSAndroid Build Coastguard WorkerUsage 21*61c4878aSAndroid Build Coastguard Worker----- 22*61c4878aSAndroid Build Coastguard WorkerThe package module can be accessed through the ``pw package`` command. This 23*61c4878aSAndroid Build Coastguard Workerhas several subcommands. 24*61c4878aSAndroid Build Coastguard Worker 25*61c4878aSAndroid Build Coastguard Worker``pw package list`` 26*61c4878aSAndroid Build Coastguard Worker Lists all the packages installed followed by all the packages available. 27*61c4878aSAndroid Build Coastguard Worker 28*61c4878aSAndroid Build Coastguard Worker``pw package install <package-name>`` 29*61c4878aSAndroid Build Coastguard Worker Installs ``<package-name>``. Exactly how this works is package-dependent, 30*61c4878aSAndroid Build Coastguard Worker and packages can decide to do nothing because the package is current, do an 31*61c4878aSAndroid Build Coastguard Worker incremental update, or delete the current version and install anew. Use 32*61c4878aSAndroid Build Coastguard Worker ``--force`` to remove the package before installing. 33*61c4878aSAndroid Build Coastguard Worker 34*61c4878aSAndroid Build Coastguard Worker``pw package status <package-name>`` 35*61c4878aSAndroid Build Coastguard Worker Indicates whether ``<package-name>`` is installed. 36*61c4878aSAndroid Build Coastguard Worker 37*61c4878aSAndroid Build Coastguard Worker``pw package remove <package-name>`` 38*61c4878aSAndroid Build Coastguard Worker Removes ``<package-name>``. 39*61c4878aSAndroid Build Coastguard Worker 40*61c4878aSAndroid Build Coastguard WorkerBy default ``pw package`` operates on the directory referenced by 41*61c4878aSAndroid Build Coastguard Worker``PW_PACKAGE_ROOT``. 42*61c4878aSAndroid Build Coastguard Worker 43*61c4878aSAndroid Build Coastguard Worker.. _module-pw_package-middleware-only-packages: 44*61c4878aSAndroid Build Coastguard Worker 45*61c4878aSAndroid Build Coastguard WorkerMiddleware-Only Packages 46*61c4878aSAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~~~~~ 47*61c4878aSAndroid Build Coastguard WorkerPigweed itself includes a number of packages that simply clone git repositories. 48*61c4878aSAndroid Build Coastguard WorkerIn general, these should not be used by projects using Pigweed. Pigweed uses 49*61c4878aSAndroid Build Coastguard Workerthese packages to avoid using submodules so downstream projects don't have 50*61c4878aSAndroid Build Coastguard Workermultiple copies of a given repository in their source tree. Projects using 51*61c4878aSAndroid Build Coastguard WorkerPigweed should use submodules instead of packages because submodules are 52*61c4878aSAndroid Build Coastguard Workersupported by much more mature tooling: git. To install these packages anyway, 53*61c4878aSAndroid Build Coastguard Workeruse ``--force`` on the command line or ``force=True`` in Python code. 54*61c4878aSAndroid Build Coastguard Worker 55*61c4878aSAndroid Build Coastguard Worker----------- 56*61c4878aSAndroid Build Coastguard WorkerConfiguring 57*61c4878aSAndroid Build Coastguard Worker----------- 58*61c4878aSAndroid Build Coastguard Worker 59*61c4878aSAndroid Build Coastguard WorkerCompatibility 60*61c4878aSAndroid Build Coastguard Worker~~~~~~~~~~~~~ 61*61c4878aSAndroid Build Coastguard WorkerPython 3 62*61c4878aSAndroid Build Coastguard Worker 63*61c4878aSAndroid Build Coastguard WorkerAdding a New Package 64*61c4878aSAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~ 65*61c4878aSAndroid Build Coastguard WorkerTo add a new package create a class that subclasses ``Package`` from 66*61c4878aSAndroid Build Coastguard Worker``pw_package/package_manager.py``. 67*61c4878aSAndroid Build Coastguard Worker 68*61c4878aSAndroid Build Coastguard Worker.. code-block:: python 69*61c4878aSAndroid Build Coastguard Worker 70*61c4878aSAndroid Build Coastguard Worker class Package: 71*61c4878aSAndroid Build Coastguard Worker """Package to be installed. 72*61c4878aSAndroid Build Coastguard Worker 73*61c4878aSAndroid Build Coastguard Worker Subclass this to implement installation of a specific package. 74*61c4878aSAndroid Build Coastguard Worker """ 75*61c4878aSAndroid Build Coastguard Worker def __init__(self, name): 76*61c4878aSAndroid Build Coastguard Worker self._name = name 77*61c4878aSAndroid Build Coastguard Worker 78*61c4878aSAndroid Build Coastguard Worker @property 79*61c4878aSAndroid Build Coastguard Worker def name(self): 80*61c4878aSAndroid Build Coastguard Worker return self._name 81*61c4878aSAndroid Build Coastguard Worker 82*61c4878aSAndroid Build Coastguard Worker def install(self, path: pathlib.Path) -> None: 83*61c4878aSAndroid Build Coastguard Worker """Install the package at path. 84*61c4878aSAndroid Build Coastguard Worker 85*61c4878aSAndroid Build Coastguard Worker Install the package in path. Cannot assume this directory is empty—it 86*61c4878aSAndroid Build Coastguard Worker may need to be deleted or updated. 87*61c4878aSAndroid Build Coastguard Worker """ 88*61c4878aSAndroid Build Coastguard Worker 89*61c4878aSAndroid Build Coastguard Worker def remove(self, path: pathlib.Path) -> None: 90*61c4878aSAndroid Build Coastguard Worker """Remove the package from path. 91*61c4878aSAndroid Build Coastguard Worker 92*61c4878aSAndroid Build Coastguard Worker Removes the directory containing the package. For most packages this 93*61c4878aSAndroid Build Coastguard Worker should be sufficient to remove the package, and subclasses should not 94*61c4878aSAndroid Build Coastguard Worker need to override this package. 95*61c4878aSAndroid Build Coastguard Worker """ 96*61c4878aSAndroid Build Coastguard Worker if os.path.exists(path): 97*61c4878aSAndroid Build Coastguard Worker shutil.rmtree(path) 98*61c4878aSAndroid Build Coastguard Worker 99*61c4878aSAndroid Build Coastguard Worker def status(self, path: pathlib.Path) -> bool: 100*61c4878aSAndroid Build Coastguard Worker """Returns if package is installed at path and current. 101*61c4878aSAndroid Build Coastguard Worker 102*61c4878aSAndroid Build Coastguard Worker This method will be skipped if the directory does not exist. 103*61c4878aSAndroid Build Coastguard Worker """ 104*61c4878aSAndroid Build Coastguard Worker 105*61c4878aSAndroid Build Coastguard WorkerThere's also a helper class for retrieving specific revisions of Git 106*61c4878aSAndroid Build Coastguard Workerrepositories in ``pw_package/git_repo.py``. 107*61c4878aSAndroid Build Coastguard Worker 108*61c4878aSAndroid Build Coastguard WorkerThen call ``pw_package.package_manager.register(PackageClass)`` to register 109*61c4878aSAndroid Build Coastguard Workerthe class with the package manager. 110*61c4878aSAndroid Build Coastguard Worker 111*61c4878aSAndroid Build Coastguard WorkerSetting up a Project 112*61c4878aSAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~ 113*61c4878aSAndroid Build Coastguard WorkerTo set up the package manager for a new project create a file like below and 114*61c4878aSAndroid Build Coastguard Workeradd it to the ``PW_PLUGINS`` file (see :ref:`module-pw_cli` for details). This 115*61c4878aSAndroid Build Coastguard Workerfile is based off of ``pw_package/pigweed_packages.py``. 116*61c4878aSAndroid Build Coastguard Worker 117*61c4878aSAndroid Build Coastguard Worker.. code-block:: python 118*61c4878aSAndroid Build Coastguard Worker 119*61c4878aSAndroid Build Coastguard Worker from pw_package import package_manager 120*61c4878aSAndroid Build Coastguard Worker # These modules register themselves so must be imported despite appearing 121*61c4878aSAndroid Build Coastguard Worker # unused. 122*61c4878aSAndroid Build Coastguard Worker from pw_package.packages import nanopb 123*61c4878aSAndroid Build Coastguard Worker 124*61c4878aSAndroid Build Coastguard Worker def main(argv=None) -> int: 125*61c4878aSAndroid Build Coastguard Worker return package_manager.run(**vars(package_manager.parse_args(argv))) 126*61c4878aSAndroid Build Coastguard Worker 127*61c4878aSAndroid Build Coastguard WorkerOptions 128*61c4878aSAndroid Build Coastguard Worker~~~~~~~ 129*61c4878aSAndroid Build Coastguard WorkerOptions for code formatting can be specified in the ``pigweed.json`` file 130*61c4878aSAndroid Build Coastguard Worker(see also :ref:`SEED-0101 <seed-0101>`). This is currently limited to one 131*61c4878aSAndroid Build Coastguard Workeroption. 132*61c4878aSAndroid Build Coastguard Worker 133*61c4878aSAndroid Build Coastguard Worker* ``allow_middleware_only_packages``: Allow middleware-only packages to be 134*61c4878aSAndroid Build Coastguard Worker installed. See :ref:`module-pw_package-middleware-only-packages` for more. 135*61c4878aSAndroid Build Coastguard Worker 136*61c4878aSAndroid Build Coastguard Worker.. code-block:: 137*61c4878aSAndroid Build Coastguard Worker 138*61c4878aSAndroid Build Coastguard Worker { 139*61c4878aSAndroid Build Coastguard Worker "pw": { 140*61c4878aSAndroid Build Coastguard Worker "pw_package": { 141*61c4878aSAndroid Build Coastguard Worker "allow_middleware_only_packages": true 142*61c4878aSAndroid Build Coastguard Worker } 143*61c4878aSAndroid Build Coastguard Worker } 144*61c4878aSAndroid Build Coastguard Worker } 145