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