blob: 43ff762d862f02a087bfc7d88bdaf8c683f34802 [file] [log] [blame]
Wyatt Heplerf9fb90f2020-09-30 18:59:33 -07001.. _module-pw_build:
Alexei Frolov9d169d52020-03-03 17:20:06 -08002
Rob Mohr84f234e2019-12-06 09:16:50 -08003--------
4pw_build
5--------
Alexei Frolov9d169d52020-03-03 17:20:06 -08006Pigweed's modules aim to be easily integratable into both new and existing
7embedded projects. To that goal, the ``pw_build`` module provides support for
8multiple build systems. Our personal favorite is `GN`_/`Ninja`_, which is used
9by upstream developers for its speed and flexibility. `CMake`_ and `Bazel`_
10build files are also provided by all modules, allowing Pigweed to be added to a
11project with minimal effort.
Rob Mohr84f234e2019-12-06 09:16:50 -080012
13.. _GN: https://gn.googlesource.com/gn/
14.. _Ninja: https://ninja-build.org/
Alexei Frolov9d169d52020-03-03 17:20:06 -080015.. _CMake: https://cmake.org/
Rob Mohr84f234e2019-12-06 09:16:50 -080016.. _Bazel: https://bazel.build/
17
Alexei Frolov9d169d52020-03-03 17:20:06 -080018Beyond just compiling code, Pigweed’s GN build system can also:
19
20* Generate HTML documentation, via our Sphinx integration (with ``pw_docgen``)
Armando Montanez0054a9b2020-03-13 13:06:24 -070021* Display memory usage report cards (with ``pw_bloat``)
Alexei Frolov9d169d52020-03-03 17:20:06 -080022* Incrementally run unit tests after code changes (with ``pw_target_runner``)
23* And more!
24
25These are only supported in the GN build, so we recommend using it if possible.
26
Rob Mohr84f234e2019-12-06 09:16:50 -080027GN / Ninja
28==========
Armando Montanezbcc194b2020-03-10 10:23:18 -070029The GN / Ninja build system is the primary build system used for upstream
30Pigweed development, and is the most tested and feature-rich build system
31Pigweed offers.
Rob Mohr84f234e2019-12-06 09:16:50 -080032
Armando Montanezbcc194b2020-03-10 10:23:18 -070033This module's ``build.gn`` file contains a number of C/C++ ``config``
34declarations that are used by upstream Pigweed to set some architecture-agnostic
35compiler defaults. (See Pigweed's ``//BUILDCONFIG.gn``)
36
Armando Montanez0054a9b2020-03-13 13:06:24 -070037``pw_build`` also provides several useful GN templates that are used throughout
Armando Montanezbcc194b2020-03-10 10:23:18 -070038Pigweed.
Alexei Frolov69ad1922019-12-13 13:11:32 -080039
Alexei Frolovedd2f142020-06-09 19:11:27 -070040Target types
Wyatt Heplerb3ea9802021-02-23 09:46:09 -080041------------
Wyatt Heplere0575f72020-10-16 10:47:03 -070042.. code-block::
Alexei Frolov69ad1922019-12-13 13:11:32 -080043
Alexei Frolovedd2f142020-06-09 19:11:27 -070044 import("$dir_pw_build/target_types.gni")
Alexei Frolov69ad1922019-12-13 13:11:32 -080045
Alexei Frolovedd2f142020-06-09 19:11:27 -070046 pw_source_set("my_library") {
47 sources = [ "lib.cc" ]
48 }
49
50Pigweed defines wrappers around the four basic GN binary types ``source_set``,
51``executable``, ``static_library``, and ``shared_library``. These wrappers apply
52default arguments to each target as specified in the ``default_configs`` and
53``default_public_deps`` build args. Additionally, they allow defaults to be
54removed on a per-target basis using ``remove_configs`` and
55``remove_public_deps`` variables, respectively.
56
57The ``pw_executable`` template provides additional functionality around building
58complete binaries. As Pigweed is a collection of libraries, it does not know how
59its final targets are built. ``pw_executable`` solves this by letting each user
60of Pigweed specify a global executable template for their target, and have
61Pigweed build against it. This is controlled by the build variable
62``pw_executable_config.target_type``, specifying the name of the executable
63template for a project.
Alexei Frolov69ad1922019-12-13 13:11:32 -080064
65.. tip::
66
67 Prefer to use ``pw_executable`` over plain ``executable`` targets to allow
68 cleanly building the same code for multiple target configs.
69
70**Arguments**
71
Alexei Frolovedd2f142020-06-09 19:11:27 -070072All of the ``pw_*`` target type overrides accept any arguments, as they simply
73forward them through to the underlying target.
Alexei Frolov69ad1922019-12-13 13:11:32 -080074
Wyatt Heplerb3ea9802021-02-23 09:46:09 -080075Python packages
76---------------
77GN templates for :ref:`Python build automation <docs-python-build>` are
78described in :ref:`module-pw_build-python`.
79
80.. toctree::
81 :hidden:
82
83 python
84
Wyatt Heplere0575f72020-10-16 10:47:03 -070085.. _module-pw_build-facade:
86
87pw_facade
Wyatt Heplerb3ea9802021-02-23 09:46:09 -080088---------
Wyatt Heplere0575f72020-10-16 10:47:03 -070089In their simplest form, a :ref:`facade<docs-module-structure-facades>` is a GN
90build arg used to change a dependency at compile time. Pigweed targets configure
91these facades as needed.
92
93The ``pw_facade`` template bundles a ``pw_source_set`` with a facade build arg.
94This allows the facade to provide header files, compilation options or anything
95else a GN ``source_set`` provides.
96
97The ``pw_facade`` template declares two targets:
98
99* ``$target_name``: the public-facing ``pw_source_set``, with a ``public_dep``
100 on the backend
101* ``$target_name.facade``: target used by the backend to avoid circular
102 dependencies
103
104.. code-block::
105
106 # Declares ":foo" and ":foo.facade" GN targets
107 pw_facade("foo") {
108 backend = pw_log_BACKEND
109 public_configs = [ ":public_include_path" ]
110 public = [ "public/pw_foo/foo.h" ]
111 }
112
Wyatt Hepler0d32d1d2020-10-23 08:05:23 -0700113.. _module-pw_build-python-action:
Alexei Frolov199045a2020-08-28 13:02:30 -0700114
Wyatt Heplerc8e05a42020-10-19 14:49:39 -0700115pw_python_action
Wyatt Heplerb3ea9802021-02-23 09:46:09 -0800116----------------
Wyatt Heplerc8e05a42020-10-19 14:49:39 -0700117The ``pw_python_action`` template is a convenience wrapper around ``action`` for
Wyatt Hepler8224a642020-07-29 08:55:56 -0700118running Python scripts. The main benefit it provides is resolution of GN target
119labels to compiled binary files. This allows Python scripts to be written
120independently of GN, taking only filesystem paths as arguments.
Alexei Frolov69ad1922019-12-13 13:11:32 -0800121
122Another convenience provided by the template is to allow running scripts without
123any outputs. Sometimes scripts run in a build do not directly produce output
Wyatt Heplerc8e05a42020-10-19 14:49:39 -0700124files, but GN requires that all actions have an output. ``pw_python_action``
Alexei Frolov69ad1922019-12-13 13:11:32 -0800125solves this by accepting a boolean ``stamp`` argument which tells it to create a
126dummy output file for the action.
127
128**Arguments**
129
Wyatt Heplerc8e05a42020-10-19 14:49:39 -0700130``pw_python_action`` accepts all of the arguments of a regular ``action``
Alexei Frolov69ad1922019-12-13 13:11:32 -0800131target. Additionally, it has some of its own arguments:
132
Wyatt Hepler79d983f2020-10-12 08:46:34 -0700133* ``module``: Run the specified Python module instead of a script. Either
134 ``script`` or ``module`` must be specified, but not both.
Wyatt Heplera74f7b02020-07-23 14:10:56 -0700135* ``capture_output``: Optional boolean. If true, script output is hidden unless
136 the script fails with an error. Defaults to true.
137* ``stamp``: Optional variable indicating whether to automatically create a
138 dummy output file for the script. This allows running scripts without
139 specifying ``outputs``. If ``stamp`` is true, a generic output file is
140 used. If ``stamp`` is a file path, that file is used as a stamp file. Like any
141 output file, ``stamp`` must be in the build directory. Defaults to false.
Wyatt Hepler79d983f2020-10-12 08:46:34 -0700142* ``directory``: Optional path. Change to this directory before executing the
143 command. Paths in arguments may need to be adjusted.
144* ``environment``: Optional list of strings. Environment variables to set,
145 passed as NAME=VALUE strings.
Alexei Frolov69ad1922019-12-13 13:11:32 -0800146
Wyatt Hepler8224a642020-07-29 08:55:56 -0700147**Expressions**
148
Wyatt Heplerc8e05a42020-10-19 14:49:39 -0700149``pw_python_action`` evaluates expressions in ``args``, the arguments passed to
Wyatt Hepler8224a642020-07-29 08:55:56 -0700150the script. These expressions function similarly to generator expressions in
151CMake. Expressions may be passed as a standalone argument or as part of another
152argument. A single argument may contain multiple expressions.
153
154Generally, these expressions are used within templates rather than directly in
155BUILD.gn files. This allows build code to use GN labels without having to worry
156about converting them to files.
157
Wyatt Hepler53a06fb2020-07-31 13:04:56 -0700158The following expressions are supported:
Wyatt Hepler8224a642020-07-29 08:55:56 -0700159
160.. describe:: <TARGET_FILE(gn_target)>
161
162 Evaluates to the output file of the provided GN target. For example, the
163 expression
164
Wyatt Heplere0575f72020-10-16 10:47:03 -0700165 .. code-block::
Wyatt Hepler8224a642020-07-29 08:55:56 -0700166
167 "<TARGET_FILE(//foo/bar:static_lib)>"
168
169 might expand to
170
Wyatt Heplere0575f72020-10-16 10:47:03 -0700171 .. code-block::
Wyatt Hepler8224a642020-07-29 08:55:56 -0700172
173 "/home/User/project_root/out/obj/foo/bar/static_lib.a"
174
175 ``TARGET_FILE`` parses the ``.ninja`` file for the GN target, so it should
176 always find the correct output file, regardless of the toolchain's or target's
177 configuration. Some targets, such as ``source_set`` and ``group`` targets, do
178 not have an output file, and attempting to use ``TARGET_FILE`` with them
179 results in an error.
180
181 ``TARGET_FILE`` only resolves GN target labels to their outputs. To resolve
182 paths generally, use the standard GN approach of applying the
183 ``rebase_path(path)`` function. With default arguments, ``rebase_path``
184 converts the provided GN path or list of paths to be relative to the build
185 directory, from which all build commands and scripts are executed.
186
Wyatt Hepler53a06fb2020-07-31 13:04:56 -0700187.. describe:: <TARGET_FILE_IF_EXISTS(gn_target)>
188
189 ``TARGET_FILE_IF_EXISTS`` evaluates to the output file of the provided GN
190 target, if the output file exists. If the output file does not exist, the
191 entire argument that includes this expression is omitted, even if there is
192 other text or another expression.
193
194 For example, consider this expression:
195
Wyatt Heplere0575f72020-10-16 10:47:03 -0700196 .. code-block::
Wyatt Hepler53a06fb2020-07-31 13:04:56 -0700197
198 "--database=<TARGET_FILE_IF_EXISTS(//alpha/bravo)>"
199
200 If the ``//alpha/bravo`` target file exists, this might expand to the
201 following:
202
Wyatt Heplere0575f72020-10-16 10:47:03 -0700203 .. code-block::
Wyatt Hepler53a06fb2020-07-31 13:04:56 -0700204
205 "--database=/home/User/project/out/obj/alpha/bravo/bravo.elf"
206
207 If the ``//alpha/bravo`` target file does not exist, the entire
208 ``--database=`` argument is omitted from the script arguments.
209
210.. describe:: <TARGET_OBJECTS(gn_target)>
211
212 Evaluates to the object files of the provided GN target. Expands to a separate
213 argument for each object file. If the target has no object files, the argument
214 is omitted entirely. Because it does not expand to a single expression, the
215 ``<TARGET_OBJECTS(...)>`` expression may not have leading or trailing text.
216
217 For example, the expression
218
Wyatt Heplere0575f72020-10-16 10:47:03 -0700219 .. code-block::
Wyatt Hepler53a06fb2020-07-31 13:04:56 -0700220
221 "<TARGET_OBJECTS(//foo/bar:a_source_set)>"
222
223 might expand to multiple separate arguments:
224
Wyatt Heplere0575f72020-10-16 10:47:03 -0700225 .. code-block::
Wyatt Hepler53a06fb2020-07-31 13:04:56 -0700226
227 "/home/User/project_root/out/obj/foo/bar/a_source_set.file_a.cc.o"
228 "/home/User/project_root/out/obj/foo/bar/a_source_set.file_b.cc.o"
229 "/home/User/project_root/out/obj/foo/bar/a_source_set.file_c.cc.o"
230
Alexei Frolov69ad1922019-12-13 13:11:32 -0800231**Example**
232
Wyatt Heplere0575f72020-10-16 10:47:03 -0700233.. code-block::
Alexei Frolov69ad1922019-12-13 13:11:32 -0800234
Wyatt Hepler51ded742020-10-19 14:45:27 -0700235 import("$dir_pw_build/python_action.gni")
Alexei Frolov69ad1922019-12-13 13:11:32 -0800236
Wyatt Heplerc8e05a42020-10-19 14:49:39 -0700237 pw_python_action("postprocess_main_image") {
Wyatt Hepler8224a642020-07-29 08:55:56 -0700238 script = "py/postprocess_binary.py"
239 args = [
240 "--database",
241 rebase_path("my/database.csv"),
242 "--binary=<TARGET_FILE(//firmware/images:main)>",
243 ]
Alexei Frolov69ad1922019-12-13 13:11:32 -0800244 stamp = true
245 }
246
247pw_input_group
Wyatt Heplerb3ea9802021-02-23 09:46:09 -0800248--------------
Alexei Frolov69ad1922019-12-13 13:11:32 -0800249``pw_input_group`` defines a group of input files which are not directly
250processed by the build but are still important dependencies of later build
251steps. This is commonly used alongside metadata to propagate file dependencies
252through the build graph and force rebuilds on file modifications.
253
254For example ``pw_docgen`` defines a ``pw_doc_group`` template which outputs
255metadata from a list of input files. The metadata file is not actually part of
256the build, and so changes to any of the input files do not trigger a rebuild.
257This is problematic, as targets that depend on the metadata should rebuild when
258the inputs are modified but GN cannot express this dependency.
259
260``pw_input_group`` solves this problem by allowing a list of files to be listed
261in a target that does not output any build artifacts, causing all dependent
262targets to correctly rebuild.
263
264**Arguments**
265
266``pw_input_group`` accepts all arguments that can be passed to a ``group``
267target, as well as requiring one extra:
268
269* ``inputs``: List of input files.
270
271**Example**
272
Wyatt Heplere0575f72020-10-16 10:47:03 -0700273.. code-block::
Alexei Frolov69ad1922019-12-13 13:11:32 -0800274
275 import("$dir_pw_build/input_group.gni")
276
277 pw_input_group("foo_metadata") {
278 metadata = {
279 files = [
280 "x.foo",
281 "y.foo",
282 "z.foo",
283 ]
284 }
285 inputs = metadata.files
286 }
287
288Targets depending on ``foo_metadata`` will rebuild when any of the ``.foo``
289files are modified.
Rob Mohr84f234e2019-12-06 09:16:50 -0800290
Sam McCauley0da412c2020-10-02 10:34:56 -0700291pw_zip
Wyatt Heplerb3ea9802021-02-23 09:46:09 -0800292------
Sam McCauley0da412c2020-10-02 10:34:56 -0700293``pw_zip`` is a target that allows users to zip up a set of input files and
294directories into a single output ``.zip`` file—a simple automation of a
295potentially repetitive task.
296
297**Arguments**
298
299* ``inputs``: List of source files as well as the desired relative zip
300 destination. See below for the input syntax.
301* ``dirs``: List of entire directories to be zipped as well as the desired
302 relative zip destination. See below for the input syntax.
303* ``output``: Filename of output ``.zip`` file.
304* ``deps``: List of dependencies for the target.
305
306**Input Syntax**
307
308Inputs all need to follow the correct syntax:
309
310#. Path to source file or directory. Directories must end with a ``/``.
311#. The delimiter (defaults to ``>``).
312#. The desired destination of the contents within the ``.zip``. Must start
313 with ``/`` to indicate the zip root. Any number of subdirectories are
314 allowed. If the source is a file it can be put into any subdirectory of the
315 root. If the source is a file, the zip copy can also be renamed by ending
316 the zip destination with a filename (no trailing ``/``).
317
318Thus, it should look like the following: ``"[source file or dir] > /"``.
319
320**Example**
321
322Let's say we have the following structure for a ``//source/`` directory:
323
Wyatt Heplere0575f72020-10-16 10:47:03 -0700324.. code-block::
Sam McCauley0da412c2020-10-02 10:34:56 -0700325
326 source/
327 ├── file1.txt
328 ├── file2.txt
329 ├── file3.txt
330 └── some_dir/
331 ├── file4.txt
332 └── some_other_dir/
333 └── file5.txt
334
335And we create the following build target:
336
Wyatt Heplere0575f72020-10-16 10:47:03 -0700337.. code-block::
Sam McCauley0da412c2020-10-02 10:34:56 -0700338
339 import("$dir_pw_build/zip.gni")
340
341 pw_zip("target_name") {
342 inputs = [
343 "//source/file1.txt > /", # Copied to the zip root dir.
344 "//source/file2.txt > /renamed.txt", # File renamed.
345 "//source/file3.txt > /bar/", # File moved to the /bar/ dir.
346 ]
347
348 dirs = [
349 "//source/some_dir/ > /bar/some_dir/", # All /some_dir/ contents copied
350 # as /bar/some_dir/.
351 ]
352
353 # Note on output: if the specific output directory isn't defined
354 # (such as output = "zoo.zip") then the .zip will output to the
355 # same directory as the BUILD.gn file that called the target.
356 output = "//$target_out_dir/foo.zip" # Where the foo.zip will end up
357 }
358
359This will result in a ``.zip`` file called ``foo.zip`` stored in
360``//$target_out_dir`` with the following structure:
361
Wyatt Heplere0575f72020-10-16 10:47:03 -0700362.. code-block::
Sam McCauley0da412c2020-10-02 10:34:56 -0700363
364 foo.zip
365 ├── bar/
366 │   ├── file3.txt
367 │   └── some_dir/
368 │   ├── file4.txt
369 │   └── some_other_dir/
370 │   └── file5.txt
371 ├── file1.txt
372 └── renamed.txt
373
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800374CMake / Ninja
375=============
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700376Pigweed's `CMake`_ support is provided primarily for projects that have an
377existing CMake build and wish to integrate Pigweed without switching to a new
378build system.
Armando Montanezbcc194b2020-03-10 10:23:18 -0700379
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700380The following command generates Ninja build files for a host build in the
381``out/cmake_host`` directory:
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800382
Wyatt Heplere0575f72020-10-16 10:47:03 -0700383.. code-block:: sh
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800384
Wyatt Heplerdcfa92b2020-11-10 09:47:30 -0800385 cmake -B out/cmake_host -S "$PW_ROOT" -G Ninja -DCMAKE_TOOLCHAIN_FILE=$PW_ROOT/pw_toolchain/host_clang/toolchain.cmake
386
387The ``PW_ROOT`` environment variable must point to the root of the Pigweed
388directory. This variable is set by Pigweed's environment setup.
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800389
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700390Tests can be executed with the ``pw_run_tests.GROUP`` targets. To run Pigweed
391module tests, execute ``pw_run_tests.modules``:
392
393.. code-block:: sh
394
395 ninja -C out/cmake_host pw_run_tests.modules
396
397:ref:`module-pw_watch` supports CMake, so you can also run
398
399.. code-block:: sh
400
Wyatt Hepler00efe182020-11-23 08:25:14 -0800401 pw watch -C out/cmake_host pw_run_tests.modules
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800402
403CMake functions
404---------------
405CMake convenience functions are defined in ``pw_build/pigweed.cmake``.
406
407* ``pw_auto_add_simple_module`` -- For modules with only one library,
408 automatically declare the library and its tests.
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700409* ``pw_auto_add_module_tests`` -- Create test targets for all tests in a module.
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800410* ``pw_add_facade`` -- Declare a module facade.
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700411* ``pw_set_backend`` -- Set the backend library to use for a facade.
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800412* ``pw_add_module_library`` -- Add a library that is part of a module.
413* ``pw_add_test`` -- Declare a test target.
414
415See ``pw_build/pigweed.cmake`` for the complete documentation of these
416functions.
417
418Special libraries that do not fit well with these functions are created with the
419standard CMake functions, such as ``add_library`` and ``target_link_libraries``.
420
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700421Facades and backends
422--------------------
423The CMake build uses CMake cache variables for configuring
424:ref:`facades<docs-module-structure-facades>` and backends. Cache variables are
425similar to GN's build args set with ``gn args``. Unlike GN, CMake does not
426support multi-toolchain builds, so these variables have a single global value
427per build directory.
428
429The ``pw_add_facade`` function declares a cache variable named
430``<module_name>_BACKEND`` for each facade. Cache variables can be awkward to
431work with, since their values only change when they're assigned, but then
Wyatt Heplerd9336a42020-11-10 09:47:30 -0800432persist accross CMake invocations. These variables should be set in one of the
433following ways:
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700434
Wyatt Heplerd9336a42020-11-10 09:47:30 -0800435* Call ``pw_set_backend`` to set backends appropriate for the target in the
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700436 target's toolchain file. The toolchain file is provided to ``cmake`` with
437 ``-DCMAKE_TOOLCHAIN_FILE=<toolchain file>``.
Wyatt Heplerd9336a42020-11-10 09:47:30 -0800438* Call ``pw_set_backend`` in the top-level ``CMakeLists.txt`` before other
439 CMake code executes.
440* Set the backend variable at the command line with the ``-D`` option.
441
442 .. code-block:: sh
443
444 cmake -B out/cmake_host -S "$PW_ROOT" -G Ninja \
445 -DCMAKE_TOOLCHAIN_FILE=$PW_ROOT/pw_toolchain/host_clang/toolchain.cmake \
446 -Dpw_log_BACKEND=pw_log_basic
447
448* Temporarily override a backend by setting it interactively with ``ccmake`` or
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700449 ``cmake-gui``.
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700450
Wyatt Hepler73439f72020-11-03 14:28:11 -0800451Toolchain setup
452---------------
453In CMake, the toolchain is configured by setting CMake variables, as described
454in the `CMake documentation <https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html>`_.
455These variables are typically set in a toolchain CMake file passed to ``cmake``
456with the ``-D`` option (``-DCMAKE_TOOLCHAIN_FILE=path/to/file.cmake``).
457For Pigweed embedded builds, set ``CMAKE_SYSTEM_NAME`` to the empty string
458(``""``).
459
Wyatt Heplerc9e51d22020-10-29 09:12:37 -0700460Third party libraries
461---------------------
462The CMake build includes third-party libraries similarly to the GN build. A
463``dir_pw_third_party_<library>`` cache variable is defined for each third-party
464dependency. This variable can have one of three values:
465
466* ``""`` (empty) -- the dependency is not available
467* ``PRESENT`` -- the dependency is available and is already included in the
468 build
469* ``</path/to/the/dependency>`` -- the dependency is available and will be
470 automatically imported from this path using ``add_subdirectory``.
471
472If the variable is empty (``if("${dir_pw_third_party_<library>}" STREQUAL
473"")``), the dependency is not available. Otherwise, it is available and
474libraries declared by it can be referenced.
475
Wyatt Heplerd9336a42020-11-10 09:47:30 -0800476Third party variables are set like any other cache global variable in CMake. It
477is recommended to set these in one of the following ways:
Wyatt Heplerdcfa92b2020-11-10 09:47:30 -0800478
Wyatt Heplerd9336a42020-11-10 09:47:30 -0800479* Set with the CMake ``set`` function in the toolchain file or a
480 ``CMakeLists.txt`` before other CMake code executes.
Wyatt Heplerdcfa92b2020-11-10 09:47:30 -0800481
Wyatt Heplerd9336a42020-11-10 09:47:30 -0800482 .. code-block:: cmake
Wyatt Heplerdcfa92b2020-11-10 09:47:30 -0800483
Wyatt Heplerd9336a42020-11-10 09:47:30 -0800484 set(dir_pw_third_party_nanopb PRESENT CACHE STRING "" FORCE)
485
486* Set the variable at the command line with the ``-D`` option.
487
488 .. code-block:: sh
489
490 cmake -B out/cmake_host -S "$PW_ROOT" -G Ninja \
491 -DCMAKE_TOOLCHAIN_FILE=$PW_ROOT/pw_toolchain/host_clang/toolchain.cmake \
492 -Ddir_pw_third_party_nanopb=/path/to/nanopb
493
494* Set the variable interactively with ``ccmake`` or ``cmake-gui``.
Wyatt Heplerdcfa92b2020-11-10 09:47:30 -0800495
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800496Use Pigweed from an existing CMake project
497------------------------------------------
498To use Pigweed libraries form a CMake-based project, simply include the Pigweed
499repository from a ``CMakeLists.txt``.
500
Wyatt Heplere0575f72020-10-16 10:47:03 -0700501.. code-block:: cmake
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800502
503 add_subdirectory(path/to/pigweed pigweed)
504
505All module libraries will be available as ``module_name`` or
506``module_name.sublibrary``.
507
508If desired, modules can be included individually.
509
Wyatt Heplere0575f72020-10-16 10:47:03 -0700510.. code-block:: cmake
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800511
Wyatt Hepler0fbcdfc2020-01-02 07:53:39 -0800512 add_subdirectory(path/to/pigweed/pw_some_module pw_some_module)
513 add_subdirectory(path/to/pigweed/pw_another_module pw_another_module)
514
Rob Mohr84f234e2019-12-06 09:16:50 -0800515Bazel
516=====
Armando Montanezbcc194b2020-03-10 10:23:18 -0700517Bazel is currently very experimental, and only builds for host.
518
Rob Mohr84f234e2019-12-06 09:16:50 -0800519The common configuration for Bazel for all modules is in the ``pigweed.bzl``
520file. The built-in Bazel rules ``cc_binary``, ``cc_library``, and ``cc_test``
521are wrapped with ``pw_cc_binary``, ``pw_cc_library``, and ``pw_cc_test``.
522These wrappers add parameters to calls to the compiler and linker.
523
524The ``BUILD`` file is merely a placeholder and currently does nothing.