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