xref: /aosp_15_r20/external/tink/docs/CMAKE-HOWTO.md (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang# CMake for Tink HOW-TO
2*e7b1675dSTing-Kang Chang
3*e7b1675dSTing-Kang Chang# Incorporating Tink into your project
4*e7b1675dSTing-Kang Chang
5*e7b1675dSTing-Kang ChangIf you are developing a project that uses Tink, you might incorporate the
6*e7b1675dSTing-Kang Changlibrary using one of the following approaches. At the moment, only the in-tree
7*e7b1675dSTing-Kang Changdependency is supported, although all of them should work.
8*e7b1675dSTing-Kang Chang
9*e7b1675dSTing-Kang Chang## In-tree dependency
10*e7b1675dSTing-Kang Chang
11*e7b1675dSTing-Kang ChangTink can be embedded directly in your CMake project and statically linked in
12*e7b1675dSTing-Kang Changyour executable. This is the approach we currently recommend. Assuming the Tink
13*e7b1675dSTing-Kang Changsource tree has been copied in the `third_party/tink` directory of your project,
14*e7b1675dSTing-Kang Changyour top-level CMake script should look like this:
15*e7b1675dSTing-Kang Chang
16*e7b1675dSTing-Kang Chang    cmake_minimum_required(VERSION 3.13)
17*e7b1675dSTing-Kang Chang    project(YourProject CXX)
18*e7b1675dSTing-Kang Chang    set(CMAKE_CXX_STANDARD_REQUIRED ON)
19*e7b1675dSTing-Kang Chang    set(CMAKE_CXX_STANDARD 14)
20*e7b1675dSTing-Kang Chang
21*e7b1675dSTing-Kang Chang    add_subdirectory(third_party/tink)
22*e7b1675dSTing-Kang Chang
23*e7b1675dSTing-Kang Chang    add_executable(your_app your_app.cc)
24*e7b1675dSTing-Kang Chang    target_link_libraries(your_app tink::static)
25*e7b1675dSTing-Kang Chang
26*e7b1675dSTing-Kang ChangNOTES:
27*e7b1675dSTing-Kang Chang
28*e7b1675dSTing-Kang Chang*   You need at least CMake 3.13 to build Tink and its dependencies.
29*e7b1675dSTing-Kang Chang*   Tink defines the C++ standard to use via the `TINK_CXX_STANDARD` variable,
30*e7b1675dSTing-Kang Chang    which is `14` by default. If you want to propagate to the value of
31*e7b1675dSTing-Kang Chang    `CMAKE_CXX_STANDARD` to Tink use `set(CMAKE_CXX_STANDARD_REQUIRED ON)`.
32*e7b1675dSTing-Kang Chang
33*e7b1675dSTing-Kang ChangInclude Tink headers in `your_app.cc` as follows:
34*e7b1675dSTing-Kang Chang
35*e7b1675dSTing-Kang Chang    #include "tink/config.h"
36*e7b1675dSTing-Kang Chang    #include "tink/json_keyset_reader.h"
37*e7b1675dSTing-Kang Chang
38*e7b1675dSTing-Kang Chang    // ...
39*e7b1675dSTing-Kang Chang
40*e7b1675dSTing-Kang ChangNOTE: `tink::static` provides the `tink/...` include path. It is just a shortcut
41*e7b1675dSTing-Kang Changfor your convenience, and you might still refer to Tink headers using a
42*e7b1675dSTing-Kang Changfilesystem path, such as `third_party/tink/cc/...`, if you prefer or need to.
43*e7b1675dSTing-Kang Chang
44*e7b1675dSTing-Kang ChangYou can see a full example in `examples/cc/helloworld/hello_world.cc`.
45*e7b1675dSTing-Kang Chang
46*e7b1675dSTing-Kang ChangGenerate the build directory as you normally would and invoke your build system
47*e7b1675dSTing-Kang Changof choice:
48*e7b1675dSTing-Kang Chang
49*e7b1675dSTing-Kang Chang    $ ls
50*e7b1675dSTing-Kang Chang    CMakeLists.txt your_app.cc third_party/
51*e7b1675dSTing-Kang Chang    $ mkdir build && cd build
52*e7b1675dSTing-Kang Chang    $ cmake ..
53*e7b1675dSTing-Kang Chang    $ make
54*e7b1675dSTing-Kang Chang    $ ./your_app
55*e7b1675dSTing-Kang Chang
56*e7b1675dSTing-Kang ChangIf you have the option, we recommend using [Ninja](https://ninja-build.org/) to
57*e7b1675dSTing-Kang Changbuild your project:
58*e7b1675dSTing-Kang Chang
59*e7b1675dSTing-Kang Chang    $ cmake -DCMAKE_GENERATOR=Ninja ..
60*e7b1675dSTing-Kang Chang    $ ninja
61*e7b1675dSTing-Kang Chang
62*e7b1675dSTing-Kang Chang
63*e7b1675dSTing-Kang Chang# Developing Tink with CMake
64*e7b1675dSTing-Kang Chang
65*e7b1675dSTing-Kang ChangIf you are developing Tink, Bazel is the primary build system, but you should
66*e7b1675dSTing-Kang Changtest all your changes with CMake too. Build Tink as a regular CMake project, but
67*e7b1675dSTing-Kang Changenable tests and build the shared library as well:
68*e7b1675dSTing-Kang Chang
69*e7b1675dSTing-Kang Chang    $ ls
70*e7b1675dSTing-Kang Chang    tink/
71*e7b1675dSTing-Kang Chang    $ mkdir tink-build && cd tink-build
72*e7b1675dSTing-Kang Chang    $ cmake ../tink -DTINK_BUILD_TESTS=ON -DCMAKE_GENERATOR=Ninja
73*e7b1675dSTing-Kang Chang    $ ninja
74*e7b1675dSTing-Kang Chang    $ CTEST_OUTPUT_ON_FAILURE=1 ninja test
75*e7b1675dSTing-Kang Chang    $ ninja package
76*e7b1675dSTing-Kang Chang
77*e7b1675dSTing-Kang ChangThis combination of options ensures that the entire CMake configuration is
78*e7b1675dSTing-Kang Changevaluated.
79*e7b1675dSTing-Kang Chang
80*e7b1675dSTing-Kang ChangWARNING: When editing a `BUILD.bazel` file, remember to keep it in sync with the
81*e7b1675dSTing-Kang Changcorresponding `CMakeLists.txt` file.
82