blob: af965f4ee3bbae17025482927f6b4e9fb369c424 [file] [log] [blame]
Rob Mohr84f234e2019-12-06 09:16:50 -08001.. default-domain:: cpp
2
3.. highlight:: sh
4
Alexei Frolov9d169d52020-03-03 17:20:06 -08005.. _chapter-build:
6
Rob Mohr84f234e2019-12-06 09:16:50 -08007--------
8pw_build
9--------
Alexei Frolov9d169d52020-03-03 17:20:06 -080010Pigweed's modules aim to be easily integratable into both new and existing
11embedded projects. To that goal, the ``pw_build`` module provides support for
12multiple build systems. Our personal favorite is `GN`_/`Ninja`_, which is used
13by upstream developers for its speed and flexibility. `CMake`_ and `Bazel`_
14build files are also provided by all modules, allowing Pigweed to be added to a
15project with minimal effort.
Rob Mohr84f234e2019-12-06 09:16:50 -080016
17.. _GN: https://gn.googlesource.com/gn/
18.. _Ninja: https://ninja-build.org/
Alexei Frolov9d169d52020-03-03 17:20:06 -080019.. _CMake: https://cmake.org/
Rob Mohr84f234e2019-12-06 09:16:50 -080020.. _Bazel: https://bazel.build/
21
Alexei Frolov9d169d52020-03-03 17:20:06 -080022Beyond just compiling code, Pigweed’s GN build system can also:
23
24* Generate HTML documentation, via our Sphinx integration (with ``pw_docgen``)
Armando Montanez0054a9b2020-03-13 13:06:24 -070025* Display memory usage report cards (with ``pw_bloat``)
Alexei Frolov9d169d52020-03-03 17:20:06 -080026* Incrementally run unit tests after code changes (with ``pw_target_runner``)
27* And more!
28
29These are only supported in the GN build, so we recommend using it if possible.
30
Rob Mohr84f234e2019-12-06 09:16:50 -080031GN / Ninja
32==========
Armando Montanezbcc194b2020-03-10 10:23:18 -070033The GN / Ninja build system is the primary build system used for upstream
34Pigweed development, and is the most tested and feature-rich build system
35Pigweed offers.
Rob Mohr84f234e2019-12-06 09:16:50 -080036
Armando Montanezbcc194b2020-03-10 10:23:18 -070037This module's ``build.gn`` file contains a number of C/C++ ``config``
38declarations that are used by upstream Pigweed to set some architecture-agnostic
39compiler defaults. (See Pigweed's ``//BUILDCONFIG.gn``)
40
Armando Montanez0054a9b2020-03-13 13:06:24 -070041``pw_build`` also provides several useful GN templates that are used throughout
Armando Montanezbcc194b2020-03-10 10:23:18 -070042Pigweed.
Alexei Frolov69ad1922019-12-13 13:11:32 -080043
44Templates
45---------
46
Alexei Frolovedd2f142020-06-09 19:11:27 -070047Target types
48^^^^^^^^^^^^
Alexei Frolov69ad1922019-12-13 13:11:32 -080049.. code::
50
Alexei Frolovedd2f142020-06-09 19:11:27 -070051 import("$dir_pw_build/target_types.gni")
Alexei Frolov69ad1922019-12-13 13:11:32 -080052
Alexei Frolovedd2f142020-06-09 19:11:27 -070053 pw_source_set("my_library") {
54 sources = [ "lib.cc" ]
55 }
56
57Pigweed defines wrappers around the four basic GN binary types ``source_set``,
58``executable``, ``static_library``, and ``shared_library``. These wrappers apply
59default arguments to each target as specified in the ``default_configs`` and
60``default_public_deps`` build args. Additionally, they allow defaults to be
61removed on a per-target basis using ``remove_configs`` and
62``remove_public_deps`` variables, respectively.
63
64The ``pw_executable`` template provides additional functionality around building
65complete binaries. As Pigweed is a collection of libraries, it does not know how
66its final targets are built. ``pw_executable`` solves this by letting each user
67of Pigweed specify a global executable template for their target, and have
68Pigweed build against it. This is controlled by the build variable
69``pw_executable_config.target_type``, specifying the name of the executable
70template for a project.
Alexei Frolov69ad1922019-12-13 13:11:32 -080071
72.. tip::
73
74 Prefer to use ``pw_executable`` over plain ``executable`` targets to allow
75 cleanly building the same code for multiple target configs.
76
77**Arguments**
78
Alexei Frolovedd2f142020-06-09 19:11:27 -070079All of the ``pw_*`` target type overrides accept any arguments, as they simply
80forward them through to the underlying target.
Alexei Frolov69ad1922019-12-13 13:11:32 -080081
82pw_python_script
83^^^^^^^^^^^^^^^^
84The ``pw_python_script`` template is a convenience wrapper around ``action`` for
85running Python scripts. The main benefit it provides is automatic resolution of
86GN paths to filesystem paths and GN target names to compiled binary files. This
87allows Python scripts to be written independent of GN, taking only filesystem as
88arguments.
89
90Another convenience provided by the template is to allow running scripts without
91any outputs. Sometimes scripts run in a build do not directly produce output
92files, but GN requires that all actions have an output. ``pw_python_script``
93solves this by accepting a boolean ``stamp`` argument which tells it to create a
94dummy output file for the action.
95
96**Arguments**
97
98``pw_python_script`` accepts all of the arguments of a regular ``action``
99target. Additionally, it has some of its own arguments:
100
101* ``stamp``: Optional boolean indicating whether to automatically create a dummy
102 output file for the script. This allows running scripts without specifying any
103 ``outputs``.
104
105**Example**
106
107.. code::
108
109 import("$dir_pw_build/python_script.gni")
110
111 python_script("hello_world") {
112 script = "py/say_hello.py"
113 args = [ "world" ]
114 stamp = true
115 }
116
117pw_input_group
118^^^^^^^^^^^^^^
119``pw_input_group`` defines a group of input files which are not directly
120processed by the build but are still important dependencies of later build
121steps. This is commonly used alongside metadata to propagate file dependencies
122through the build graph and force rebuilds on file modifications.
123
124For example ``pw_docgen`` defines a ``pw_doc_group`` template which outputs
125metadata from a list of input files. The metadata file is not actually part of
126the build, and so changes to any of the input files do not trigger a rebuild.
127This is problematic, as targets that depend on the metadata should rebuild when
128the inputs are modified but GN cannot express this dependency.
129
130``pw_input_group`` solves this problem by allowing a list of files to be listed
131in a target that does not output any build artifacts, causing all dependent
132targets to correctly rebuild.
133
134**Arguments**
135
136``pw_input_group`` accepts all arguments that can be passed to a ``group``
137target, as well as requiring one extra:
138
139* ``inputs``: List of input files.
140
141**Example**
142
143.. code::
144
145 import("$dir_pw_build/input_group.gni")
146
147 pw_input_group("foo_metadata") {
148 metadata = {
149 files = [
150 "x.foo",
151 "y.foo",
152 "z.foo",
153 ]
154 }
155 inputs = metadata.files
156 }
157
158Targets depending on ``foo_metadata`` will rebuild when any of the ``.foo``
159files are modified.
Rob Mohr84f234e2019-12-06 09:16:50 -0800160
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800161CMake / Ninja
162=============
Armando Montanezbcc194b2020-03-10 10:23:18 -0700163
164Pigweed's CMake support is provided primarily for projects that have an existing
165CMake build and wish to integrate Pigweed without switching to a new build
166system.
167
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800168The following command generates Ninja build files in the out/cmake directory.
169
170.. code:: sh
171
172 cmake -B out/cmake -S /path/to/pigweed -G Ninja
173
174Tests can be executed with the ``pw_run_tests_GROUP`` targets. To run the basic
175Pigweed tests, run ``ninja -C out/cmake pw_run_tests_modules``.
176
177CMake functions
178---------------
179CMake convenience functions are defined in ``pw_build/pigweed.cmake``.
180
181* ``pw_auto_add_simple_module`` -- For modules with only one library,
182 automatically declare the library and its tests.
183* ``pw_add_facade`` -- Declare a module facade.
184* ``pw_add_module_library`` -- Add a library that is part of a module.
185* ``pw_add_test`` -- Declare a test target.
186
187See ``pw_build/pigweed.cmake`` for the complete documentation of these
188functions.
189
190Special libraries that do not fit well with these functions are created with the
191standard CMake functions, such as ``add_library`` and ``target_link_libraries``.
192
193Use Pigweed from an existing CMake project
194------------------------------------------
195To use Pigweed libraries form a CMake-based project, simply include the Pigweed
196repository from a ``CMakeLists.txt``.
197
198.. code:: cmake
199
200 add_subdirectory(path/to/pigweed pigweed)
201
202All module libraries will be available as ``module_name`` or
203``module_name.sublibrary``.
204
205If desired, modules can be included individually.
206
207.. code:: cmake
208
209 include(path/to/pigweed/pw_build/pigweed.cmake)
210
211 add_subdirectory(path/to/pigweed/pw_some_module pw_some_module)
212 add_subdirectory(path/to/pigweed/pw_another_module pw_another_module)
213
Rob Mohr84f234e2019-12-06 09:16:50 -0800214Bazel
215=====
Armando Montanezbcc194b2020-03-10 10:23:18 -0700216
217Bazel is currently very experimental, and only builds for host.
218
Rob Mohr84f234e2019-12-06 09:16:50 -0800219The common configuration for Bazel for all modules is in the ``pigweed.bzl``
220file. The built-in Bazel rules ``cc_binary``, ``cc_library``, and ``cc_test``
221are wrapped with ``pw_cc_binary``, ``pw_cc_library``, and ``pw_cc_test``.
222These wrappers add parameters to calls to the compiler and linker.
223
224The ``BUILD`` file is merely a placeholder and currently does nothing.