From e7d5e4b4bf864fa779e2fc90dfb352588bf82246 Mon Sep 17 00:00:00 2001 From: Ruslan Baratov Date: Thu, 19 May 2016 15:00:40 +0300 Subject: [PATCH] ExternalProject: Re-implement download verification as a dedicated script Move the content to a `ExternalProject-verify.cmake.in` file and use `configure_file` to generate the final script. --- Modules/ExternalProject-verify.cmake.in | 48 +++++++++++++++++++++++++ Modules/ExternalProject.cmake | 43 ++++++++++------------ 2 files changed, 66 insertions(+), 25 deletions(-) create mode 100644 Modules/ExternalProject-verify.cmake.in diff --git a/Modules/ExternalProject-verify.cmake.in b/Modules/ExternalProject-verify.cmake.in new file mode 100644 index 000000000..1d8db9664 --- /dev/null +++ b/Modules/ExternalProject-verify.cmake.in @@ -0,0 +1,48 @@ +#============================================================================= +# Copyright 2008-2013 Kitware, Inc. +# Copyright 2016 Ruslan Baratov +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +cmake_minimum_required(VERSION 3.5) + +if("@LOCAL@" STREQUAL "") + message(FATAL_ERROR "LOCAL can't be empty") +endif() + +if(NOT EXISTS "@LOCAL@") + message(FATAL_ERROR "File not found: @LOCAL@") +endif() + +if("@ALGO@" STREQUAL "") + message(WARNING "File will not be verified since no URL_HASH specified") + return() +endif() + +if("@EXPECT_VALUE@" STREQUAL "") + message(FATAL_ERROR "EXPECT_VALUE can't be empty") +endif() + +message(STATUS "verifying file... + file='@LOCAL@'") + +file("@ALGO@" "@LOCAL@" actual_value) + +if(NOT "${actual_value}" STREQUAL "@EXPECT_VALUE@") + message(FATAL_ERROR "error: @ALGO@ hash of + @LOCAL@ +does not match expected value + expected: '@EXPECT_VALUE@' + actual: '${actual_value}' +") +endif() + +message(STATUS "verifying file... done") diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index 9752fc714..224950108 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -377,6 +377,7 @@ file:: #============================================================================= # Copyright 2008-2013 Kitware, Inc. +# Copyright 2016 Ruslan Baratov # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. @@ -418,6 +419,9 @@ endif() set(_ep_hash_algos "MD5|SHA1|SHA224|SHA256|SHA384|SHA512") set(_ep_hash_regex "^(${_ep_hash_algos})=([0-9A-Fa-f]+)$") +set(_ExternalProject_SELF "${CMAKE_CURRENT_LIST_FILE}") +get_filename_component(_ExternalProject_SELF_DIR "${_ExternalProject_SELF}" PATH) + function(_ep_parse_arguments f name ns args) # Transfer the arguments to this function into target properties for the # new custom target we just added so that we can set up all the build steps @@ -937,33 +941,22 @@ endfunction() function(_ep_write_verifyfile_script script_filename LOCAL hash) if("${hash}" MATCHES "${_ep_hash_regex}") - set(algo "${CMAKE_MATCH_1}") - string(TOLOWER "${CMAKE_MATCH_2}" expect_value) - set(script_content "set(expect_value \"${expect_value}\") -set(succeeded 0) - file(${algo} \"\${file}\" actual_value) - if(\"\${actual_value}\" STREQUAL \"\${expect_value}\") - set(succeeded 1) + set(ALGO "${CMAKE_MATCH_1}") + string(TOLOWER "${CMAKE_MATCH_2}" EXPECT_VALUE) + else() + set(ALGO "") + set(EXPECT_VALUE "") endif() -if(\${succeeded}) - message(STATUS \"verifying file... done\") -else() - message(FATAL_ERROR \"error: ${algo} hash of - \${file} -does not match expected value - expected: \${expect_value} - actual: \${actual_value} -\") -endif()") - else() - set(script_content "message(STATUS \"verifying file... warning: did not verify file - no URL_HASH specified?\")") - endif() - file(WRITE ${script_filename} "set(file \"${LOCAL}\") -message(STATUS \"verifying file... - file='\${file}'\") -${script_content} -") + # Used variables: + # * ALGO + # * EXPECT_VALUE + # * LOCAL + configure_file( + "${_ExternalProject_SELF_DIR}/ExternalProject-verify.cmake.in" + "${script_filename}" + @ONLY + ) endfunction()