[CMake] file( DOWNLOAD ) problem

David Cole david.cole at kitware.com
Wed Sep 26 18:28:48 EDT 2012


On Wed, Sep 26, 2012 at 6:12 PM, Eric Noulard <eric.noulard at gmail.com> wrote:
>
> 2012/9/27 David Cole <david.cole at kitware.com>:
> > With file(DOWNLOAD, you should always use the EXPECTED_MD5 argument (or
> > EXPECTED_HASH with nightly CMake, or 2.8.10 or later) to verify success.
>
> I bet this is not always possible.
> Why would you **always** know some hash of the file you are downloading?


If you don't, then you can't know if it came down correctly or not,
even if STATUS tells you that the download succeeded... So. I would
say if you don't know the expected hash, then you can't trust the
source of the download. I personally would not use file(DOWNLOAD to
grab anything of importance unless I knew what it's expected hash is.

>
>
> May be STATUS is usable in this case as well:
>
> "If STATUS var is specified the status of the operation will be put in
> var. The status is returned in a list of length 2. The first element
> is the numeric return value for the operation, and the second element
> is a string value for the error. A 0 numeric error means no error in
> the operation"
>
> --
> Erk
> Le gouvernement représentatif n'est pas la démocratie --
> http://www.le-message.org


Yes, you can see how file(DOWNLOAD is used from ExternalProject by
inspecting one of its generated download scripts. Here's an example
for downloading the tarball for the zlib project:


message(STATUS "downloading...
     src='http://zlib.net/zlib-1.2.7.tar.gz'
     dst='/Users/davidcole/Downloads/zlib-1.2.7.tar.gz'
     timeout='none'")

file(DOWNLOAD
  "http://zlib.net/zlib-1.2.7.tar.gz"
  "/Users/davidcole/Downloads/zlib-1.2.7.tar.gz"
  SHOW_PROGRESS
  EXPECTED_MD5;60df6a37c56e7c1366cca812414f7b85
  # no TIMEOUT
  STATUS status
  LOG log)

list(GET status 0 status_code)
list(GET status 1 status_string)

if(NOT status_code EQUAL 0)
  message(FATAL_ERROR "error: downloading
'http://zlib.net/zlib-1.2.7.tar.gz' failed
  status_code: ${status_code}
  status_string: ${status_string}
  log: ${log}
")
endif()

message(STATUS "downloading... done")


More information about the CMake mailing list