xref: /aosp_15_r20/external/pigweed/third_party/emboss/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_third_party_emboss:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker======
4*61c4878aSAndroid Build Coastguard WorkerEmboss
5*61c4878aSAndroid Build Coastguard Worker======
6*61c4878aSAndroid Build Coastguard Worker`Emboss <https://github.com/google/emboss>`_ is a tool for generating code to
7*61c4878aSAndroid Build Coastguard Workersafely read and write binary data structures.
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard WorkerThe ``$dir_pw_third_party/emboss`` module provides an ``emboss_cc_library`` GN
10*61c4878aSAndroid Build Coastguard Workertemplate, defined in build_defs.gni, which generates C++ bindings for the given
11*61c4878aSAndroid Build Coastguard WorkerEmboss source file. The Emboss source code needs to be provided by the user.
12*61c4878aSAndroid Build Coastguard Worker
13*61c4878aSAndroid Build Coastguard Worker------------------
14*61c4878aSAndroid Build Coastguard WorkerConfiguring Emboss
15*61c4878aSAndroid Build Coastguard Worker------------------
16*61c4878aSAndroid Build Coastguard WorkerThe recommended way to include the Emboss source code is to add it as a
17*61c4878aSAndroid Build Coastguard WorkerGit submodule:
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker   git submodule add https://github.com/google/emboss.git third_party/emboss/src
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Worker.. tab-set::
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: GN
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker      Next, set the GN variable ``dir_pw_third_party_emboss`` to the path of
28*61c4878aSAndroid Build Coastguard Worker      your Emboss installation. If using the submodule path from above, add the
29*61c4878aSAndroid Build Coastguard Worker      following to the ``default_args`` of your project's ``.gn`` file:
30*61c4878aSAndroid Build Coastguard Worker
31*61c4878aSAndroid Build Coastguard Worker      .. code-block::
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard Worker         dir_pw_third_party_emboss = "//third_party/emboss/src"
34*61c4878aSAndroid Build Coastguard Worker
35*61c4878aSAndroid Build Coastguard Worker      ..
36*61c4878aSAndroid Build Coastguard Worker         inclusive-language: disable
37*61c4878aSAndroid Build Coastguard Worker
38*61c4878aSAndroid Build Coastguard Worker      Optionally, configure the Emboss defines documented at
39*61c4878aSAndroid Build Coastguard Worker      `dir_pw_third_party_emboss/runtime/cpp/emboss_defines.h
40*61c4878aSAndroid Build Coastguard Worker      <https://github.com/google/emboss/blob/master/runtime/cpp/emboss_defines.h>`_
41*61c4878aSAndroid Build Coastguard Worker      by setting the ``pw_third_party_emboss_CONFIG`` variable to a source set
42*61c4878aSAndroid Build Coastguard Worker      that includes a public config overriding the defines. By default, checks
43*61c4878aSAndroid Build Coastguard Worker      will use PW_DASSERT.
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard Worker      ..
46*61c4878aSAndroid Build Coastguard Worker         inclusive-language: enable
47*61c4878aSAndroid Build Coastguard Worker
48*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: CMake
49*61c4878aSAndroid Build Coastguard Worker
50*61c4878aSAndroid Build Coastguard Worker      Next, set the CMake variable ``dir_pw_third_party_emboss`` to the path of
51*61c4878aSAndroid Build Coastguard Worker      your Emboss installation. If using the submodule path from above, add the
52*61c4878aSAndroid Build Coastguard Worker      following to your project's ``CMakeLists.txt`` file:
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker      .. code-block::
55*61c4878aSAndroid Build Coastguard Worker
56*61c4878aSAndroid Build Coastguard Worker         set(dir_pw_third_party_emboss "$ENV{PW_ROOT}/third_party/emboss/src" CACHE PATH "" FORCE)
57*61c4878aSAndroid Build Coastguard Worker
58*61c4878aSAndroid Build Coastguard Worker
59*61c4878aSAndroid Build Coastguard Worker------------
60*61c4878aSAndroid Build Coastguard WorkerUsing Emboss
61*61c4878aSAndroid Build Coastguard Worker------------
62*61c4878aSAndroid Build Coastguard Worker.. tab-set::
63*61c4878aSAndroid Build Coastguard Worker
64*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: GN
65*61c4878aSAndroid Build Coastguard Worker
66*61c4878aSAndroid Build Coastguard Worker      Let's say you've authored an Emboss source file at
67*61c4878aSAndroid Build Coastguard Worker      ``//my-project/public/my-project/my-protocol.emb``.
68*61c4878aSAndroid Build Coastguard Worker      To generate its bindings, you can add the following to
69*61c4878aSAndroid Build Coastguard Worker      ``//my-project/BUILD.gn``:
70*61c4878aSAndroid Build Coastguard Worker
71*61c4878aSAndroid Build Coastguard Worker      .. code-block::
72*61c4878aSAndroid Build Coastguard Worker
73*61c4878aSAndroid Build Coastguard Worker         import("$dir_pw_third_party/emboss/build_defs.gni")
74*61c4878aSAndroid Build Coastguard Worker
75*61c4878aSAndroid Build Coastguard Worker         emboss_cc_library("emboss_protocol") {
76*61c4878aSAndroid Build Coastguard Worker            source = "public/my-project/my-protocol.emb"
77*61c4878aSAndroid Build Coastguard Worker         }
78*61c4878aSAndroid Build Coastguard Worker
79*61c4878aSAndroid Build Coastguard Worker      This generates a source set of the same name as the target, in this case
80*61c4878aSAndroid Build Coastguard Worker      "emboss_protocol". To use the bindings, list this target as a dependency
81*61c4878aSAndroid Build Coastguard Worker      in GN:
82*61c4878aSAndroid Build Coastguard Worker
83*61c4878aSAndroid Build Coastguard Worker      .. code-block::
84*61c4878aSAndroid Build Coastguard Worker
85*61c4878aSAndroid Build Coastguard Worker         pw_test("emboss_test") {
86*61c4878aSAndroid Build Coastguard Worker            sources = [ "emboss_test.cc" ]
87*61c4878aSAndroid Build Coastguard Worker            deps = [
88*61c4878aSAndroid Build Coastguard Worker               ":emboss_protocol",
89*61c4878aSAndroid Build Coastguard Worker            ]
90*61c4878aSAndroid Build Coastguard Worker         }
91*61c4878aSAndroid Build Coastguard Worker
92*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: CMake
93*61c4878aSAndroid Build Coastguard Worker
94*61c4878aSAndroid Build Coastguard Worker      Let's say you've authored an Emboss source file at
95*61c4878aSAndroid Build Coastguard Worker      ``my-project/public/my-project/my-protocol.emb``.
96*61c4878aSAndroid Build Coastguard Worker      To generate its bindings, you can add the following to
97*61c4878aSAndroid Build Coastguard Worker      ``my-project/CMakeLists.txt``:
98*61c4878aSAndroid Build Coastguard Worker
99*61c4878aSAndroid Build Coastguard Worker      .. code-block::
100*61c4878aSAndroid Build Coastguard Worker
101*61c4878aSAndroid Build Coastguard Worker         include($ENV{PW_ROOT}/third_party/emboss/emboss.cmake)
102*61c4878aSAndroid Build Coastguard Worker
103*61c4878aSAndroid Build Coastguard Worker         emboss_cc_library(emboss_protocol
104*61c4878aSAndroid Build Coastguard Worker           SOURCES
105*61c4878aSAndroid Build Coastguard Worker             source = "public/my-project/my-protocol.emb"
106*61c4878aSAndroid Build Coastguard Worker         )
107*61c4878aSAndroid Build Coastguard Worker
108*61c4878aSAndroid Build Coastguard Worker      This generates a library of the same name as the target, in this case
109*61c4878aSAndroid Build Coastguard Worker      "emboss_protocol". To use the bindings, list this target as a dependency
110*61c4878aSAndroid Build Coastguard Worker      in CMake:
111*61c4878aSAndroid Build Coastguard Worker
112*61c4878aSAndroid Build Coastguard Worker      .. code-block::
113*61c4878aSAndroid Build Coastguard Worker
114*61c4878aSAndroid Build Coastguard Worker         pw_add_test(emboss_test
115*61c4878aSAndroid Build Coastguard Worker            SOURCES
116*61c4878aSAndroid Build Coastguard Worker               emboss_test.cc
117*61c4878aSAndroid Build Coastguard Worker            PRIVATE_DEPS
118*61c4878aSAndroid Build Coastguard Worker               emboss_protocol
119*61c4878aSAndroid Build Coastguard Worker         )
120*61c4878aSAndroid Build Coastguard Worker
121*61c4878aSAndroid Build Coastguard WorkerNow just include the generated header by adding ``.h`` to the path of your
122*61c4878aSAndroid Build Coastguard WorkerEmboss source file:
123*61c4878aSAndroid Build Coastguard Worker
124*61c4878aSAndroid Build Coastguard Worker.. code-block:: c++
125*61c4878aSAndroid Build Coastguard Worker
126*61c4878aSAndroid Build Coastguard Worker   #include <my-project/my-protocol.emb.h>
127