xref: /aosp_15_r20/external/tink/cmake/TinkWorkspace.cmake (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang# Copyright 2019 Google LLC
2*e7b1675dSTing-Kang Chang#
3*e7b1675dSTing-Kang Chang# Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang# you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang# You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang#
7*e7b1675dSTing-Kang Chang# http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang#
9*e7b1675dSTing-Kang Chang# Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang# distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang# See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang# limitations under the License.
14*e7b1675dSTing-Kang Chang
15*e7b1675dSTing-Kang Chang# Download, unpack and setup Tink dependencies.
16*e7b1675dSTing-Kang Chang#
17*e7b1675dSTing-Kang Chang# Despite the looks, http_archive rules are not purely declarative, and order
18*e7b1675dSTing-Kang Chang# matters. All variables defined before a rule are visible when configuring the
19*e7b1675dSTing-Kang Chang# dependency it declares, and the targets provided by a dependency are visible
20*e7b1675dSTing-Kang Chang# (only) after it has been declared. Following dependencies may rely on targets
21*e7b1675dSTing-Kang Chang# defined by a previous one, for instance on gtest or absl.
22*e7b1675dSTing-Kang Chang#
23*e7b1675dSTing-Kang Chang# Some rules imported from dependencies require small fixes, which are specified
24*e7b1675dSTing-Kang Chang# after the relative http_archive rule. Please always document the intended
25*e7b1675dSTing-Kang Chang# purpose of such statements, and why they are necessary.
26*e7b1675dSTing-Kang Chang#
27*e7b1675dSTing-Kang Chang# In general, when adding a new dependency you should follow this structure:
28*e7b1675dSTing-Kang Chang#
29*e7b1675dSTing-Kang Chang# <set any configuration variable, if any>
30*e7b1675dSTing-Kang Chang# <http_archive for your dependency>
31*e7b1675dSTing-Kang Chang# <define or fix newly imported targets, if any>
32*e7b1675dSTing-Kang Chang#
33*e7b1675dSTing-Kang Chang# Many projects provide switches to disable tests or examples, which you should
34*e7b1675dSTing-Kang Chang# specify, in order to speed up the compilation process.
35*e7b1675dSTing-Kang Chang
36*e7b1675dSTing-Kang Changinclude(HttpArchive)
37*e7b1675dSTing-Kang Changinclude(TinkUtil)
38*e7b1675dSTing-Kang Chang
39*e7b1675dSTing-Kang Chang# Creates an interface target from an imported one.
40*e7b1675dSTing-Kang Chang#
41*e7b1675dSTing-Kang Chang# Parameters:
42*e7b1675dSTing-Kang Chang#   INTERFACE_TARGET Name of the interface target.
43*e7b1675dSTing-Kang Chang#   IMPORTED_TARGET Name of the imported target (e.g., with find_package).
44*e7b1675dSTing-Kang Chang#
45*e7b1675dSTing-Kang Changmacro(_create_interface_target INTERFACE_TARGET IMPORTED_TARGET)
46*e7b1675dSTing-Kang Chang  add_library(${INTERFACE_TARGET} INTERFACE)
47*e7b1675dSTing-Kang Chang  target_link_libraries(${INTERFACE_TARGET} INTERFACE ${IMPORTED_TARGET})
48*e7b1675dSTing-Kang Chang  target_include_directories(${INTERFACE_TARGET} INTERFACE ${IMPORTED_TARGET})
49*e7b1675dSTing-Kang Changendmacro()
50*e7b1675dSTing-Kang Chang
51*e7b1675dSTing-Kang Changset(gtest_force_shared_crt ON CACHE BOOL "Tink dependency override" FORCE)
52*e7b1675dSTing-Kang Chang
53*e7b1675dSTing-Kang Changif (TINK_BUILD_TESTS)
54*e7b1675dSTing-Kang Chang  if (TINK_USE_INSTALLED_GOOGLETEST)
55*e7b1675dSTing-Kang Chang    # This uses the CMake's FindGTest module; if successful, this call to
56*e7b1675dSTing-Kang Chang    # find_package generates the targets GTest::gmock, GTest::gtest and
57*e7b1675dSTing-Kang Chang    # GTest::gtest_main.
58*e7b1675dSTing-Kang Chang    find_package(GTest CONFIG REQUIRED)
59*e7b1675dSTing-Kang Chang    _create_interface_target(gmock GTest::gmock)
60*e7b1675dSTing-Kang Chang    _create_interface_target(gtest_main GTest::gtest_main)
61*e7b1675dSTing-Kang Chang  else()
62*e7b1675dSTing-Kang Chang    http_archive(
63*e7b1675dSTing-Kang Chang      NAME googletest
64*e7b1675dSTing-Kang Chang      URL https://github.com/google/googletest/archive/refs/tags/release-1.11.0.tar.gz
65*e7b1675dSTing-Kang Chang      SHA256 b4870bf121ff7795ba20d20bcdd8627b8e088f2d1dab299a031c1034eddc93d5
66*e7b1675dSTing-Kang Chang    )
67*e7b1675dSTing-Kang Chang  endif()
68*e7b1675dSTing-Kang Chang
69*e7b1675dSTing-Kang Chang  http_archive(
70*e7b1675dSTing-Kang Chang    NAME wycheproof
71*e7b1675dSTing-Kang Chang    URL https://github.com/google/wycheproof/archive/d8ed1ba95ac4c551db67f410c06131c3bc00a97c.zip
72*e7b1675dSTing-Kang Chang    SHA256 eb1d558071acf1aa6d677d7f1cabec2328d1cf8381496c17185bd92b52ce7545
73*e7b1675dSTing-Kang Chang    DATA_ONLY
74*e7b1675dSTing-Kang Chang  )
75*e7b1675dSTing-Kang Chang  # Symlink the Wycheproof test data.
76*e7b1675dSTing-Kang Chang  # Tests expect Wycheproof test vectors to be in a local testvectors/ folder.
77*e7b1675dSTing-Kang Chang  add_directory_alias("${wycheproof_SOURCE_DIR}/testvectors"
78*e7b1675dSTing-Kang Chang    "${CMAKE_BINARY_DIR}/testvectors")
79*e7b1675dSTing-Kang Changendif()
80*e7b1675dSTing-Kang Chang
81*e7b1675dSTing-Kang Changif (NOT TINK_USE_INSTALLED_ABSEIL)
82*e7b1675dSTing-Kang Chang  # Release from 2023-05-04.
83*e7b1675dSTing-Kang Chang  http_archive(
84*e7b1675dSTing-Kang Chang    NAME abseil
85*e7b1675dSTing-Kang Chang    URL https://github.com/abseil/abseil-cpp/archive/refs/tags/20230125.3.zip
86*e7b1675dSTing-Kang Chang    SHA256 51d676b6846440210da48899e4df618a357e6e44ecde7106f1e44ea16ae8adc7
87*e7b1675dSTing-Kang Chang  )
88*e7b1675dSTing-Kang Changelse()
89*e7b1675dSTing-Kang Chang  # This is everything that needs to be done here. Abseil already defines its
90*e7b1675dSTing-Kang Chang  # targets, which gets linked in tink_cc_(library|test).
91*e7b1675dSTing-Kang Chang  find_package(absl REQUIRED)
92*e7b1675dSTing-Kang Changendif()
93*e7b1675dSTing-Kang Chang
94*e7b1675dSTing-Kang Chang# Don't fetch BoringSSL or look for OpenSSL if target `crypto` is already
95*e7b1675dSTing-Kang Chang# defined.
96*e7b1675dSTing-Kang Changif (NOT TARGET crypto)
97*e7b1675dSTing-Kang Chang  if (NOT TINK_USE_SYSTEM_OPENSSL)
98*e7b1675dSTing-Kang Chang    # Commit from Feb 15, 2023.
99*e7b1675dSTing-Kang Chang    # NOTE: This is one commit ahead of Bazel; the commit fixes a CMake issue,
100*e7b1675dSTing-Kang Chang    # which made build fail on CMake 3.10.
101*e7b1675dSTing-Kang Chang    # See https://github.com/google/boringssl/compare/5c22014...e27ff0e.
102*e7b1675dSTing-Kang Chang    http_archive(
103*e7b1675dSTing-Kang Chang      NAME boringssl
104*e7b1675dSTing-Kang Chang      URL https://github.com/google/boringssl/archive/e27ff0e4312c91357778b36bbd8a7ec7bfc67be3.zip
105*e7b1675dSTing-Kang Chang      SHA256 11d3c87906bed215a915b0db11cefd0fc7b939ddbec4952a29e343a83ce3bc50
106*e7b1675dSTing-Kang Chang      CMAKE_SUBDIR src
107*e7b1675dSTing-Kang Chang    )
108*e7b1675dSTing-Kang Chang    # BoringSSL targets do not carry include directory info, this fixes it.
109*e7b1675dSTing-Kang Chang    target_include_directories(crypto PUBLIC
110*e7b1675dSTing-Kang Chang      "$<BUILD_INTERFACE:${boringssl_SOURCE_DIR}/src/include>")
111*e7b1675dSTing-Kang Chang  else()
112*e7b1675dSTing-Kang Chang    # Support for ED25519 was added from 1.1.1.
113*e7b1675dSTing-Kang Chang    find_package(OpenSSL 1.1.1 REQUIRED)
114*e7b1675dSTing-Kang Chang    _create_interface_target(crypto OpenSSL::Crypto)
115*e7b1675dSTing-Kang Chang  endif()
116*e7b1675dSTing-Kang Changelse()
117*e7b1675dSTing-Kang Chang  message(STATUS "Using an already declared `crypto` target")
118*e7b1675dSTing-Kang Chang  get_target_property(crypto_INCLUDE_DIR crypto INTERFACE_INCLUDE_DIRECTORIES)
119*e7b1675dSTing-Kang Chang  message(STATUS "crypto Include Dir: ${crypto_INCLUDE_DIR}")
120*e7b1675dSTing-Kang Changendif()
121*e7b1675dSTing-Kang Chang
122*e7b1675dSTing-Kang Changset(RAPIDJSON_BUILD_DOC OFF CACHE BOOL "Tink dependency override" FORCE)
123*e7b1675dSTing-Kang Changset(RAPIDJSON_BUILD_EXAMPLES OFF CACHE BOOL "Tink dependency override" FORCE)
124*e7b1675dSTing-Kang Changset(RAPIDJSON_BUILD_TESTS OFF CACHE BOOL "Tink dependency override" FORCE)
125*e7b1675dSTing-Kang Chang
126*e7b1675dSTing-Kang Changhttp_archive(
127*e7b1675dSTing-Kang Chang  NAME rapidjson
128*e7b1675dSTing-Kang Chang  URL https://github.com/Tencent/rapidjson/archive/v1.1.0.tar.gz
129*e7b1675dSTing-Kang Chang  SHA256 bf7ced29704a1e696fbccf2a2b4ea068e7774fa37f6d7dd4039d0787f8bed98e
130*e7b1675dSTing-Kang Chang)
131*e7b1675dSTing-Kang Chang# Rapidjson is a header-only library with no explicit target. Here we create one.
132*e7b1675dSTing-Kang Changadd_library(rapidjson INTERFACE)
133*e7b1675dSTing-Kang Changtarget_include_directories(rapidjson INTERFACE "${rapidjson_SOURCE_DIR}")
134*e7b1675dSTing-Kang Chang
135*e7b1675dSTing-Kang Changset(protobuf_BUILD_TESTS OFF CACHE BOOL "Tink dependency override" FORCE)
136*e7b1675dSTing-Kang Changset(protobuf_BUILD_EXAMPLES OFF CACHE BOOL "Tink dependency override" FORCE)
137*e7b1675dSTing-Kang Chang## Use protobuf X.21.9.
138*e7b1675dSTing-Kang Changhttp_archive(
139*e7b1675dSTing-Kang Chang  NAME com_google_protobuf
140*e7b1675dSTing-Kang Chang  URL https://github.com/protocolbuffers/protobuf/archive/v21.9.zip
141*e7b1675dSTing-Kang Chang  SHA256 5babb8571f1cceafe0c18e13ddb3be556e87e12ceea3463d6b0d0064e6cc1ac3
142*e7b1675dSTing-Kang Chang  CMAKE_SUBDIR cmake
143*e7b1675dSTing-Kang Chang)
144