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