# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include(FetchContent) include(CMakeParseArguments) # Download, unpack and configure a dependency. # # The project is added as a subdirectory of Tink, unless DATA_ONLY is # specified. This makes all target defined by it available as dependencies. # # This rule also defines two variables: # - _SOURCE_DIR points to the root directory of the downloaded package; # it can be used to reference data in tests, or append extra include/link # paths in the Workspace file. # - _BINARY_DIR points to the build directory. # # Parameters: # NAME name of the dependency. # URL url to fetch a source archive from. # SHA256 hash of the file downloaded from URL. # # Optional parameters: # CMAKE_SUBDIR subdirectory of the downloaded archive where the root # CMakeLists.txt file for the project is located. Defaults to the root. # CMAKE_ARGS any additional argument that should be passed to cmake when # configuring the downloaded archive. Defaults to empty. # DATA_ONLY flag, if present the package will only be downloaded, verified and # unpacked. No configuration step is performed, and no target included. This # is useful for downloading archives of test vectors or artifacts. # False by default. # function(http_archive) cmake_parse_arguments(PARSE_ARGV 0 http_archive "DATA_ONLY" "NAME;URL;SHA256;CMAKE_SUBDIR" "CMAKE_ARGS" ) FetchContent_Declare( ${http_archive_NAME} URL ${http_archive_URL} URL_HASH SHA256=${http_archive_SHA256} ) message(STATUS "Fetching ${http_archive_NAME}") FetchContent_GetProperties(${http_archive_NAME}) if(NOT ${http_archive_NAME}_POPULATED) FetchContent_Populate(${http_archive_NAME}) if (NOT http_archive_DATA_ONLY) add_subdirectory( ${${http_archive_NAME}_SOURCE_DIR}/${http_archive_CMAKE_SUBDIR} ${${http_archive_NAME}_BINARY_DIR} EXCLUDE_FROM_ALL) endif() # Expose these variables to the caller. set( "${http_archive_NAME}_SOURCE_DIR" "${${http_archive_NAME}_SOURCE_DIR}" PARENT_SCOPE) set( "${http_archive_NAME}_BINARY_DIR" "${${http_archive_NAME}_BINARY_DIR}" PARENT_SCOPE) endif() endfunction(http_archive)