xref: /aosp_15_r20/external/pigweed/pw_package/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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