blob: 95d5664ccf200456cc37ea018005df47fd39385f [file] [log] [blame] [view]
# CMake for Tink HOW-TO
# Incorporating Tink into your project
If you are developing a project that uses Tink, you might incorporate the
library using one of the following approaches. At the moment, only the in-tree
dependency is supported, although all of them should work.
## In-tree dependency
Tink can be embedded directly in your CMake project and statically linked in
your executable. This is the approach we currently recommend. Assuming the Tink
source tree has been copied in the `third_party/tink` directory of your project,
your top-level CMake script should look like this:
cmake_minimum_required(VERSION 3.13)
project(YourProject CXX)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 14)
add_subdirectory(third_party/tink)
add_executable(your_app your_app.cc)
target_link_libraries(your_app tink::static)
NOTES:
* You need at least CMake 3.13 to build Tink and its dependencies.
* Tink defines the C++ standard to use via the `TINK_CXX_STANDARD` variable,
which is `14` by default. If you want to propagate to the value of
`CMAKE_CXX_STANDARD` to Tink use `set(CMAKE_CXX_STANDARD_REQUIRED ON)`.
Include Tink headers in `your_app.cc` as follows:
#include "tink/config.h"
#include "tink/json_keyset_reader.h"
// ...
NOTE: `tink::static` provides the `tink/...` include path. It is just a shortcut
for your convenience, and you might still refer to Tink headers using a
filesystem path, such as `third_party/tink/cc/...`, if you prefer or need to.
You can see a full example in `examples/cc/helloworld/hello_world.cc`.
Generate the build directory as you normally would and invoke your build system
of choice:
$ ls
CMakeLists.txt your_app.cc third_party/
$ mkdir build && cd build
$ cmake ..
$ make
$ ./your_app
If you have the option, we recommend using [Ninja](https://ninja-build.org/) to
build your project:
$ cmake -DCMAKE_GENERATOR=Ninja ..
$ ninja
# Developing Tink with CMake
If you are developing Tink, Bazel is the primary build system, but you should
test all your changes with CMake too. Build Tink as a regular CMake project, but
enable tests and build the shared library as well:
$ ls
tink/
$ mkdir tink-build && cd tink-build
$ cmake ../tink -DTINK_BUILD_TESTS=ON -DCMAKE_GENERATOR=Ninja
$ ninja
$ CTEST_OUTPUT_ON_FAILURE=1 ninja test
$ ninja package
This combination of options ensures that the entire CMake configuration is
evaluated.
WARNING: When editing a `BUILD.bazel` file, remember to keep it in sync with the
corresponding `CMakeLists.txt` file.