blob: 933f17329d8dd15a6ca312b3633d5a42e9cf9f1f [file] [log] [blame]
Wyatt Heplerf9fb90f2020-09-30 18:59:33 -07001.. _docs-pw-style:
Keir Mierle2c1e56b2019-11-15 16:32:11 -08002
3===========================
4Style Guide and Conventions
5===========================
6
Armando Montanezf2bbb752020-03-03 09:50:37 -08007.. tip::
8 Pigweed runs ``pw format`` as part of ``pw presubmit`` to perform some code
9 formatting checks. To speed up the review process, consider adding ``pw
10 presubmit`` as a git push hook using the following command:
11 ``pw presubmit --install``
12
Keir Mierle2c1e56b2019-11-15 16:32:11 -080013---------
14C++ style
15---------
16
17The Pigweed C++ style guide is closely based on Google's external C++ Style
18Guide, which is found on the web at
19https://google.github.io/styleguide/cppguide.html. The Google C++ Style Guide
20applies to Pigweed except as described in this document.
21
22The Pigweed style guide only applies to Pigweed itself. It does not apply to
Alexei Frolov44d54732020-01-10 14:45:43 -080023projects that use Pigweed or to the third-party code included with Pigweed.
Keir Mierle2c1e56b2019-11-15 16:32:11 -080024Non-Pigweed code is free to use features restricted by Pigweed, such as dynamic
25memory allocation and the entirety of the C++ Standard Library.
26
27Recommendations in the :doc:`embedded_cpp_guide` are considered part of the
28Pigweed style guide, but are separated out since it covers more general
29embedded development beyond just C++ style.
30
31Automatic formatting
32====================
33Pigweed uses `clang-format <https://clang.llvm.org/docs/ClangFormat.html>`_ to
34automatically format Pigweed source code. A ``.clang-format`` configuration is
35provided with the Pigweed repository.
36
37Automatic formatting is essential to facilitate large-scale, automated changes
38in Pigweed. Therefore, all code in Pigweed is expected to be formatted with
39``clang-format`` prior to submission. Existing code may be reformatted at any
40time.
41
42If ``clang-format`` formats code in an undesirable or incorrect way, it can be
43disabled for the affected lines by adding ``// clang-format off``.
44``clang-format`` must then be re-enabled with a ``// clang-format on`` comment.
45
46.. code-block:: cpp
47
48 // clang-format off
Alexei Frolov44d54732020-01-10 14:45:43 -080049 constexpr int kMyMatrix[] = {
Keir Mierle2c1e56b2019-11-15 16:32:11 -080050 100, 23, 0,
51 0, 542, 38,
52 1, 2, 201,
53 };
54 // clang-format on
55
56C Standard Library
57==================
58In C++ headers, always use the C++ versions of C Standard Library headers (e.g.
59``<cstdlib>`` instead of ``<stdlib.h>``). If the header is used by both C and
60C++ code, only the C header should be used.
61
62In C++ code, it is preferred to use C functions from the ``std`` namespace. For
63example, use ``std::memcpy`` instead of ``memcpy``. The C++ standard does not
64require the global namespace versions of the functions to be provided. Using
65``std::`` is more consistent with the C++ Standard Library and makes it easier
66to distinguish Pigweed functions from library functions.
67
68Within core Pigweed, do not use C standard library functions that allocate
69memory, such as ``std::malloc``. There are exceptions to this for when dynamic
70allocation is enabled for a system; Pigweed modules are allowed to add extra
71functionality when a heap is present; but this must be optional.
72
73C++ Standard Library
74====================
75Much of the C++ Standard Library is not a good fit for embedded software. Many
76of the classes and functions were not designed with the RAM, flash, and
77performance constraints of a microcontroller in mind. For example, simply
78adding the line ``#include <iostream>`` can increase the binary size by 150 KB!
Alexei Frolov44d54732020-01-10 14:45:43 -080079This is larger than many microcontrollers' entire internal storage.
Keir Mierle2c1e56b2019-11-15 16:32:11 -080080
81However, with appropriate caution, a limited set of standard C++ libraries can
82be used to great effect. Developers can leverage familiar, well-tested
83abstractions instead of writing their own. C++ library algorithms and classes
84can give equivalent or better performance than hand-written C code.
85
86A limited subset of the C++ Standard Library is permitted in Pigweed. To keep
87Pigweed small, flexible, and portable, functions that allocate dynamic memory
88must be avoided. Care must be exercised when using multiple instantiations of a
89template function, which can lead to code bloat.
90
91The following C++ Standard Library headers are always permitted:
92
93 * ``<array>``
94 * ``<complex>``
95 * ``<initializer_list>``
96 * ``<iterator>``
97 * ``<limits>``
98 * ``<optional>``
99 * ``<random>``
100 * ``<ratio>``
101 * ``<span>``
102 * ``<string_view>``
103 * ``<tuple>``
104 * ``<type_traits>``
105 * ``<utility>``
106 * ``<variant>``
107 * C Standard Library headers (``<c*>``)
108
109With caution, parts of the following headers can be used:
110
111 * ``<algorithm>`` -- be wary of potential memory allocation
112 * ``<atomic>`` -- not all MCUs natively support atomic operations
113 * ``<bitset>`` -- conversions to or from strings are disallowed
114 * ``<functional>`` -- do **not** use ``std::function``
115 * ``<new>`` -- for placement new
116 * ``<numeric>`` -- be wary of code size with multiple template instantiations
117
118Never use any of these headers:
119
120 * Dynamic containers (``<list>``, ``<map>``, ``<set>``, ``<vector>``, etc.)
121 * Streams (``<iostream>``, ``<ostream>``, ``<fstream>``, etc.)
122 * ``<exception>``
123 * ``<future>``, ``<mutex>``, ``<thread>``
124 * ``<memory>``
125 * ``<regex>``
126 * ``<scoped_allocator>``
127 * ``<sstream>``
128 * ``<stdexcept>``
129 * ``<string>``
130 * ``<valarray>``
131
132Headers not listed here should be carefully evaluated before they are used.
133
134These restrictions do not apply to third party code or to projects that use
135Pigweed.
136
137Combining C and C++
138===================
139Prefer to write C++ code over C code, using ``extern "C"`` for symbols that must
140have C linkage. ``extern "C"`` functions should be defined within C++
141namespaces to simplify referring to other code.
142
143C++ functions with no parameters do not include ``void`` in the parameter list.
144C functions with no parameters must include ``void``.
145
146.. code-block:: cpp
147
148 namespace pw {
149
150 bool ThisIsACppFunction() { return true; }
151
152 extern "C" int pw_ThisIsACFunction(void) { return -1; }
153
154 extern "C" {
155
156 int pw_ThisIsAlsoACFunction(void) {
157 return ThisIsACppFunction() ? 100 : 0;
158 }
159
160 } // extern "C"
161
162 } // namespace pw
163
164Comments
165========
Ali Zhangf22f1f12021-04-02 18:59:28 -0700166Prefer C++-style (``//``) comments over C-style comments (``/* */``). C-style
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800167comments should only be used for inline comments.
168
169.. code-block:: cpp
170
171 // Use C++-style comments, except where C-style comments are necessary.
172 // This returns a random number using an algorithm I found on the internet.
173 #define RANDOM_NUMBER() [] { \
174 return 4; /* chosen by fair dice roll */ \
175 }()
176
177Indent code in comments with two additional spaces, making a total of three
178spaces after the ``//``. All code blocks must begin and end with an empty
Alexei Frolov44d54732020-01-10 14:45:43 -0800179comment line, even if the blank comment line is the last line in the block.
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800180
181.. code-block:: cpp
182
183 // Here is an example of code in comments.
184 //
185 // int indentation_spaces = 2;
186 // int total_spaces = 3;
187 //
188 // engine_1.thrust = RANDOM_NUMBER() * indentation_spaces + total_spaces;
189 //
190 bool SomeFunction();
191
192Control statements
193==================
194All loops and conditional statements must use braces.
195
Ewout van Bekkume072fab2020-07-17 16:34:00 -0700196The syntax ``while (true)`` is preferred over ``for (;;)`` for infinite loops.
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800197
198Include guards
199==============
200The first non-comment line of every header file must be ``#pragma once``. Do
201not use traditional macro include guards. The ``#pragma once`` should come
202directly after the Pigweed copyright block, with no blank line, followed by a
203blank, like this:
204
205.. code-block:: cpp
206
Keir Mierle086ef1c2020-03-19 02:03:51 -0700207 // Copyright 2020 The Pigweed Authors
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800208 //
209 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
Wyatt Hepler1a960942019-11-26 14:13:38 -0800210 // use this file except in compliance with the License. You may obtain a copy of
211 // the License at
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800212 //
213 // https://www.apache.org/licenses/LICENSE-2.0
214 //
215 // Unless required by applicable law or agreed to in writing, software
216 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
217 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
Wyatt Hepler1a960942019-11-26 14:13:38 -0800218 // License for the specific language governing permissions and limitations under
219 // the License.
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800220 #pragma once
221
222 // Header file-level comment goes here...
223
224Memory allocation
225=================
226Dynamic memory allocation can be problematic. Heap allocations and deallocations
227occupy valuable CPU cycles. Memory usage becomes nondeterministic, which can
228result in a system crashing without a clear culprit.
229
230To keep Pigweed portable, core Pigweed code is not permitted to dynamically
231(heap) allocate memory, such as with ``malloc`` or ``new``. All memory should be
232allocated with automatic (stack) or static (global) storage duration. Pigweed
233must not use C++ libraries that use dynamic allocation.
234
235Projects that use Pigweed are free to use dynamic allocation, provided they
236have selected a target that enables the heap.
237
238Naming
239======
240Entities shall be named according to the `Google style guide
241<https://google.github.io/styleguide/cppguide.html>`_, with the following
242additional requirements.
243
244**C++ code**
245 * All Pigweed C++ code must be in the ``pw`` namespace. Namespaces for
246 modules should be nested under ``pw``. For example,
247 ``pw::string::Format()``.
248 * Whenever possible, private code should be in a source (.cc) file and placed
249 in anonymous namespace nested under ``pw``.
250 * If private code must be exposed in a header file, it must be in a namespace
251 nested under ``pw``. The namespace may be named for its subsystem or use a
252 name that designates it as private, such as ``internal``.
Ewout van Bekkumad2f3c32021-03-31 10:12:17 -0700253 * Template arguments for non-type names (e.g. ``template <int kFooBar>``)
254 should follow the constexpr and const variable Google naming convention,
255 which means k prefixed camel case (e.g.
256 ``kCamelCase``). This matches the Google C++ style for variable naming,
257 however the wording in the official style guide isn't explicit for template
258 arguments and could be interpreted to use ``foo_bar`` style naming.
259 For consistency with other variables whose value is always fixed for the
260 duration of the program, the naming convention is ``kCamelCase``, and so
261 that is the style we use in Pigweed.
Keir Mierle003044a2020-04-14 10:56:20 -0700262
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800263**C code**
Armando Montanez59aa2782021-01-12 15:16:36 -0800264In general, C symbols should be prefixed with the module name. If the symbol is
265not associated with a module, use just ``pw`` as the module name. Facade
266backends may chose to prefix symbols with the facade's name to help reduce the
267length of the prefix.
268
269 * Public names used by C code must be prefixed with the module name (e.g.
270 ``pw_tokenizer_*``).
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800271 * If private code must be exposed in a header, private names used by C code
Armando Montanez59aa2782021-01-12 15:16:36 -0800272 must be prefixed with an underscore followed by the module name (e.g.
273 ``_pw_assert_*``).
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800274 * Avoid writing C source (.c) files in Pigweed. Prefer to write C++ code with
275 C linkage using ``extern "C"``. Within C source, private C functions and
Armando Montanez59aa2782021-01-12 15:16:36 -0800276 variables must be named with the ``_pw_my_module_*`` prefix and should be
277 declared ``static`` whenever possible; for example,
278 ``_pw_my_module_MyPrivateFunction``.
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800279 * The C prefix rules apply to
280
Armando Montanez59aa2782021-01-12 15:16:36 -0800281 * C functions (``int pw_foo_FunctionName(void);``),
282 * variables used by C code (``int pw_foo_variable_name;``),
283 * constant variables used by C code (``int pw_foo_kConstantName;``),
284 * structs used by C code (``typedef struct {} pw_foo_StructName;``), and
285 * all of the above for ``extern "C"`` names in C++ code.
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800286
287 The prefix does not apply to struct members, which use normal Google style.
288
289**Preprocessor macros**
Armando Montanez59aa2782021-01-12 15:16:36 -0800290 * Public Pigweed macros must be prefixed with the module name (e.g.
291 ``PW_MY_MODULE_*``).
292 * Private Pigweed macros must be prefixed with an underscore followed by the
293 module name (e.g. ``_PW_MY_MODULE_*``).
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800294
295**Example**
296
297.. code-block:: cpp
298
Armando Montanez59aa2782021-01-12 15:16:36 -0800299 namespace pw::my_module {
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800300 namespace nested_namespace {
301
302 // C++ names (types, variables, functions) must be in the pw namespace.
303 // They are named according to the Google style guide.
304 constexpr int kGlobalConstant = 123;
305
306 // Prefer using functions over extern global variables.
307 extern int global_variable;
308
309 class Class {};
310
311 void Function();
312
313 extern "C" {
314
315 // Public Pigweed code used from C must be prefixed with pw_.
Armando Montanez59aa2782021-01-12 15:16:36 -0800316 extern const int pw_my_module_kGlobalConstant;
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800317
Armando Montanez59aa2782021-01-12 15:16:36 -0800318 extern int pw_my_module_global_variable;
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800319
Armando Montanez59aa2782021-01-12 15:16:36 -0800320 void pw_my_module_Function(void);
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800321
322 typedef struct {
323 int member_variable;
Armando Montanez59aa2782021-01-12 15:16:36 -0800324 } pw_my_module_Struct;
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800325
326 // Private Pigweed code used from C must be prefixed with _pw_.
Armando Montanez59aa2782021-01-12 15:16:36 -0800327 extern const int _pw_my_module_kPrivateGlobalConstant;
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800328
Armando Montanez59aa2782021-01-12 15:16:36 -0800329 extern int _pw_my_module_private_global_variable;
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800330
Armando Montanez59aa2782021-01-12 15:16:36 -0800331 void _pw_my_module_PrivateFunction(void);
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800332
333 typedef struct {
334 int member_variable;
Armando Montanez59aa2782021-01-12 15:16:36 -0800335 } _pw_my_module_PrivateStruct;
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800336
337 } // extern "C"
338
339 // Public macros must be prefixed with PW_.
Armando Montanez59aa2782021-01-12 15:16:36 -0800340 #define PW_MY_MODULE_PUBLIC_MACRO(arg) arg
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800341
342 // Private macros must be prefixed with _PW_.
Armando Montanez59aa2782021-01-12 15:16:36 -0800343 #define _PW_MY_MODULE_PRIVATE_MACRO(arg) arg
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800344
345 } // namespace nested_namespace
Armando Montanez59aa2782021-01-12 15:16:36 -0800346 } // namespace pw::my_module
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800347
348Namespace scope formatting
349==========================
350All non-indented blocks (namespaces, ``extern "C"`` blocks, and preprocessor
351conditionals) must have a comment on their closing line with the
352contents of the starting line.
353
354All nested namespaces should be declared together with no blank lines between
355them.
356
357.. code-block:: cpp
358
359 #include "some/header.h"
360
361 namespace pw::nested {
362 namespace {
363
364 constexpr int kAnonConstantGoesHere = 0;
365
366 } // namespace
367
368 namespace other {
369
370 const char* SomeClass::yes = "no";
371
372 bool ThisIsAFunction() {
373 #if PW_CONFIG_IS_SET
374 return true;
375 #else
376 return false;
377 #endif // PW_CONFIG_IS_SET
378 }
379
380 extern "C" {
381
382 const int pw_kSomeConstant = 10;
383 int pw_some_global_variable = 600;
384
385 void pw_CFunction() { ... }
386
387 } // extern "C"
388
389 } // namespace
390 } // namespace pw::nested
391
392Pointers and references
393=======================
394For pointer and reference types, place the asterisk or ampersand next to the
395type.
396
397.. code-block:: cpp
398
399 int* const number = &that_thing;
400 constexpr const char* kString = "theory!"
401
402 bool FindTheOneRing(const Region& where_to_look) { ... }
403
404Prefer storing references over storing pointers. Pointers are required when the
405pointer can change its target or may be ``nullptr``. Otherwise, a reference or
Adam MacBethfb126582021-07-20 18:24:38 +0000406const reference should be used.
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800407
408Preprocessor macros
409===================
410Macros should only be used when they significantly improve upon the C++ code
411they replace. Macros should make code more readable, robust, and safe, or
412provide features not possible with standard C++, such as stringification, line
413number capturing, or conditional compilation. When possible, use C++ constructs
414like constexpr variables in place of macros. Never use macros as constants,
415except when a string literal is needed or the value must be used by C code.
416
417When macros are needed, the macros should be accompanied with extensive tests
418to ensure the macros are hard to use wrong.
419
420Stand-alone statement macros
421----------------------------
422Macros that are standalone statements must require the caller to terminate the
Alexei Frolov44d54732020-01-10 14:45:43 -0800423macro invocation with a semicolon. For example, the following does *not* conform
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800424to Pigweed's macro style:
425
426.. code-block:: cpp
427
428 // BAD! Definition has built-in semicolon.
429 #define PW_LOG_IF_BAD(mj) \
430 CallSomeFunction(mj);
431
432 // BAD! Compiles without error; semicolon is missing.
Alexei Frolov44d54732020-01-10 14:45:43 -0800433 PW_LOG_IF_BAD("foo")
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800434
435Here's how to do this instead:
436
437.. code-block:: cpp
438
439 // GOOD; requires semicolon to compile.
440 #define PW_LOG_IF_BAD(mj) \
441 CallSomeFunction(mj)
442
443 // GOOD; fails to compile due to lacking semicolon.
Alexei Frolov44d54732020-01-10 14:45:43 -0800444 PW_LOG_IF_BAD("foo")
Keir Mierle2c1e56b2019-11-15 16:32:11 -0800445
446For macros in function scope that do not already require a semicolon, the
447contents can be placed in a ``do { ... } while (0)`` loop.
448
449.. code-block:: cpp
450
451 #define PW_LOG_IF_BAD(mj) \
452 do { \
453 if (mj.Bad()) { \
454 Log(#mj " is bad") \
455 } \
456 } while (0)
457
458Standalone macros at global scope that do not already require a semicolon can
459add a ``static_assert`` or throwaway struct declaration statement as their
460last line.
461
462.. code-block:: cpp
463
464 #define PW_NEAT_THING(thing) \
465 bool IsNeat_##thing() { return true; } \
466 static_assert(true, "Macros must be terminated with a semicolon")
467
468Private macros in public headers
469--------------------------------
470Private macros in public headers must be prefixed with ``_PW_``, even if they
471are undefined after use; this prevents collisions with downstream users. For
472example:
473
474.. code-block:: cpp
475
476 #define _PW_MY_SPECIAL_MACRO(op) ...
477 ...
478 // Code that uses _PW_MY_SPECIAL_MACRO()
479 ...
480 #undef _PW_MY_SPECIAL_MACRO
481
482Macros in private implementation files (.cc)
483--------------------------------------------
484Macros within .cc files that should only used within one file should be
485undefined after their last use; for example:
486
487.. code-block:: cpp
488
489 #define DEFINE_OPERATOR(op) \
490 T operator ## op(T x, T y) { return x op y; } \
491 static_assert(true, "Macros must be terminated with a semicolon") \
492
493 DEFINE_OPERATOR(+);
494 DEFINE_OPERATOR(-);
495 DEFINE_OPERATOR(/);
496 DEFINE_OPERATOR(*);
497
498 #undef DEFINE_OPERATOR
499
500Preprocessor conditional statements
501===================================
502When using macros for conditional compilation, prefer to use ``#if`` over
503``#ifdef``. This checks the value of the macro rather than whether it exists.
504
505 * ``#if`` handles undefined macros equivalently to ``#ifdef``. Undefined
506 macros expand to 0 in preprocessor conditional statements.
507 * ``#if`` evaluates false for macros defined as 0, while ``#ifdef`` evaluates
508 true.
509 * Macros defined using compiler flags have a default value of 1 in GCC and
510 Clang, so they work equivalently for ``#if`` and ``#ifdef``.
511 * Macros defined to an empty statement cause compile-time errors in ``#if``
512 statements, which avoids ambiguity about how the macro should be used.
513
514All ``#endif`` statements should be commented with the expression from their
515corresponding ``#if``. Do not indent within preprocessor conditional statements.
516
517.. code-block:: cpp
518
519 #if USE_64_BIT_WORD
520 using Word = uint64_t;
521 #else
522 using Word = uint32_t;
523 #endif // USE_64_BIT_WORD
524
525Unsigned integers
526=================
527Unsigned integers are permitted in Pigweed. Aim for consistency with existing
528code and the C++ Standard Library. Be very careful mixing signed and unsigned
529integers.
530
531------------
532Python style
533------------
534Pigweed uses the standard Python style: PEP8, which is available on the web at
535https://www.python.org/dev/peps/pep-0008/. All Pigweed Python code should pass
536``yapf`` when configured for PEP8 style.
537
Wyatt Heplerab4eb7a2020-01-08 18:04:31 -0800538Python 3
539========
540Pigweed uses Python 3. Some modules may offer limited support for Python 2, but
541Python 3.6 or newer is required for most Pigweed code.
Wayne Jacksond597e462020-06-03 15:03:12 -0700542
543---------------
544Build files: GN
545---------------
546
547Each Pigweed source module will require a build file named BUILD.gn which
548encapsulates the build targets and specifies their sources and dependencies.
Ali Zhangf22f1f12021-04-02 18:59:28 -0700549The format of this file is similar in structure to the
Wayne Jacksond597e462020-06-03 15:03:12 -0700550`Bazel/Blaze format <https://docs.bazel.build/versions/3.2.0/build-ref.html>`_
551(Googlers may also review `go/build-style <go/build-style>`_), but with
552nomenclature specific to Pigweed. For each target specified within the build
Ali Zhangf22f1f12021-04-02 18:59:28 -0700553file there are a list of dependency fields. Those fields, in their expected
Wayne Jacksond597e462020-06-03 15:03:12 -0700554order, are:
555
556 * ``<public_config>`` -- external build configuration
557 * ``<public_deps>`` -- necessary public dependencies (ie: Pigweed headers)
558 * ``<public>`` -- exposed package public interface header files
559 * ``<config>`` -- package build configuration
560 * ``<sources>`` -- package source code
561 * ``<deps>`` -- package necessary local dependencies
562
563Assets within each field must be listed in alphabetical order
564
565.. code-block:: cpp
566
567 # Here is a brief example of a GN build file.
568
569 import("$dir_pw_unit_test/test.gni")
570
571 config("default_config") {
572 include_dirs = [ "public" ]
573 }
574
575 source_set("pw_sample_module") {
576 public_configs = [ ":default_config" ]
Wyatt Hepler7abd8cc2021-01-19 16:49:33 -0800577 public_deps = [ dir_pw_status ]
Wayne Jacksond597e462020-06-03 15:03:12 -0700578 public = [ "public/pw_sample_module/sample_module.h" ]
579 sources = [
580 "public/pw_sample_module/internal/sample_module.h",
581 "sample_module.cc",
582 "used_by_sample_module.cc",
583 ]
584 deps = [ dir_pw_varint ]
585 }
586
587 pw_test_group("tests") {
588 tests = [ ":sample_module_test" ]
589 }
590
591 pw_test("sample_module_test") {
Wayne Jacksond597e462020-06-03 15:03:12 -0700592 sources = [ "sample_module_test.cc" ]
Kevin Zeng1e10ef22020-06-09 20:47:14 -0700593 deps = [ ":sample_module" ]
Wayne Jacksond597e462020-06-03 15:03:12 -0700594 }
595
596 pw_doc_group("docs") {
597 sources = [ "docs.rst" ]
598 }
Akira Baruah40a9c3f2021-06-16 15:17:54 -0700599
600------------------
601Build files: Bazel
602------------------
603
604Similar to their BUILD.gn counterparts, build files for the Bazel build system
605must be named BUILD.bazel. Bazel can interpret files named just BUILD, but we
606use BUILD.bazel to avoid any ambiguity with other build systems or tooling.