[CMake] Is there a better way to retrieve content from a remote zip file?

Chuck Atkins chuck.atkins at kitware.com
Thu Apr 28 11:58:12 EDT 2016


This looks well suited to ExternalProject.  Just give it an empty configure
and build steps and then have the install step perform the copy:

include(ExternalProject)

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  set(3rdParty_SUBDIR x64)
else()
  set(3rdParty_SUBDIR x86)
endif()

ExternalProject_Add( 3rdParty
  URL http://download.osgvisual.org/3rdParty_VS2013_v120_x86_x64_V9_small.7z
  URL_MD5 c9294a16b39783cba8c4c55df182b24b
  BUILD_IN_SOURCE 1
  CONFIGURE_COMMAND ""
  BUILD_COMMAND ""
  INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory ${3rdParty_SUBDIR}/
${CMAKE_INSTALL_PREFIX}
)

This created a "3rdParty" target that should do everything you need and
only if necessary.

- Chuck

On Thu, Apr 28, 2016 at 11:19 AM, Lee Butler <iraytrace at gmail.com> wrote:

> I am looking for a better way to do something than having a sequence of
> "if (NOT EXISTS)" statements.  My package being built depends on some
> external libraries and headers, that are available in a zip file on an
> external website.  So for example:  zlib.h,zlib.dll and zlib.lib are (along
> with other stuff) in 3rdParty.zip available from a remote URL.  I don't
> want to build these things, I want to fetch the zip file, unpack it and
> copy the relevant portions into place only as needed.
>
> At the moment I have the code below, which feels "unclean" on so many
> levels:
>
> if (NOT EXISTS "${CMAKE_INSTALL_PREFIX}/include/zlib.h")
>   if (NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/3rdParty_x86_x64")
>     if (NOT EXISTS
> "${CMAKE_CURRENT_BINARY_DIR}/3rdParty_VS2013_v120_x86_x64_V9_small.7z")
>        MESSAGE(STATUS "Downloading 3rdParty")
>        file(DOWNLOAD
> http://download.osgvisual.org/3rdParty_VS2013_v120_x86_x64_V9_small.7z
> "${CMAKE_CURRENT_BINARY_DIR}/3rdParty_VS2013_v120_x86_x64_V9_small.7z"
> SHOW_PROGRESS)
>     endif()
>
>     message(STATUS "expanding 3rdParty Archive")
>     execute_process( COMMAND ${CMAKE_COMMAND} -E tar xzf
> "${CMAKE_CURRENT_BINARY_DIR}/3rdParty_VS2013_v120_x86_x64_V9_small.7z" )
>   endif()
>   foreach(dir bin data include lib ssl)
>     file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/3rdParty_x86_x64/x64/${dir}"
> "${CMAKE_INSTALL_PREFIX}/${dir}")
>   endforeach(dir)
>   file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/3rdParty_x86_x64")
> endif()
>
> This has the property of fetching the 7z file, extracting the contents and
> leaving the 7z file around for later rebuilds.  I hope there is a cleaner
> way of saying the same thing.  BTW, I would be just as happy putting
> "products" from the zip file in the current build destinations instead of
> the install destinations.
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20160428/513cfd5e/attachment.html>


More information about the CMake mailing list