EDGS / submodules /gaussian-splatting /SIBR_viewers /cmake /linux /downloadAndExtractZipFile.cmake
Olga
Initial commit
5f9d349
# Copyright (C) 2020, Inria
# GRAPHDECO research group, https://team.inria.fr/graphdeco
# All rights reserved.
#
# This software is free for non-commercial, research and evaluation use
# under the terms of the LICENSE.md file.
#
# For inquiries contact [email protected] and/or [email protected]
## downloadAndExtractZipFile cmake function
## Provide a way to download zip file from public internet ZIP_URL host
## and to extract it in a specific EXCTRATED_ZIP_PATH destination.
## This function use 7-Zip external tool to maximize the compatibles formats.
## This will be not download again if the EXCTRATED_ZIP_PATH already exist and DL_FORCE is set to OFF.
## This will try to unzip file if already exist in the ZIP_DL_PATH.
##
## If EXCTRATED_ZIP_PATH and/or ZIP_DL_PATH are not full path,
## it will be interpreted relative to CMAKE_BINARY_DIR
##
## Usage example :
## include(downloadAndExtractZipFile)
## downloadAndExtractZipFile(
## http://www.cs.cornell.edu/~snavely/bundler/distr/bundler-v0.4-source.zip
## ${CMAKE_BINARY_DIR}/Bundler/bundler-v0.4-source.zip
## ${CMAKE_BINARY_DIR}/Bundler
## [DL_FORCE ON|OFF]
## [TIMEOUT]
## [CHECK_DIRTY_URL]
## )
##
## option DL_FORCE will redownload the zip file [deafult to OFF]
## option TIMEOUT will end the unzip process after this period of time [default to 600s]
## option CHECK_DIRTY_URL will write into the given file the downloaded URL and then,
## next time, if the URL was updated, it detect it with this file
## and will download the last version. This prevent to alway set manually DL_FORCE to ON...
##
if(__downloadAndExtractZipFile_cmake_INCLUDED__)
return()
else()
set(__downloadAndExtractZipFile_cmake_INCLUDED__ ON)
endif()
function(downloadAndExtractZipFile ZIP_URL ZIP_DL_PATH EXCTRATED_ZIP_PATH)
# message(STATUS "zipUrl=${ZIP_URL} zipDlPath=${ZIP_DL_PATH} extractedZipPath=${EXCTRATED_ZIP_PATH}")
cmake_parse_arguments(dwnlezf "" "VERBOSE;DL_FORCE;TIMEOUT;CHECK_DIRTY_URL" "" ${ARGN})
set(PROGRAMFILESx86 "PROGRAMFILES(x86)")
## Check entries mandatory args
if(IS_ABSOLUTE "${ZIP_DL_PATH}")
else()
set(ZIP_DL_PATH "${CMAKE_BINARY_DIR}/${ZIP_DL_PATH}")
endif()
if(IS_ABSOLUTE "${EXCTRATED_ZIP_PATH}")
else()
set(EXCTRATED_ZIP_PATH "${CMAKE_BINARY_DIR}/${EXCTRATED_ZIP_PATH}")
endif()
if(NOT EXISTS "${EXCTRATED_ZIP_PATH}")
file(MAKE_DIRECTORY ${EXCTRATED_ZIP_PATH})
endif()
# SB: Once, one of downloaded zip was corrupted by an error message coming from the server.
if(EXISTS "${ZIP_DL_PATH}")
# So I check for removing such corrupted files
message("Removing previous ${ZIP_DL_PATH} (might be corrupted)")
file(REMOVE "${ZIP_DL_PATH}")
if(EXISTS "${dwnlezf_CHECK_DIRTY_URL}")
# and remove the previous (corrupted) made 'Win3rdPartyUrl' file
file(REMOVE "${dwnlezf_CHECK_DIRTY_URL}")
endif()
endif()
## Check entries optional args
macro(readDirtyUrl )
if(dwnlezf_CHECK_DIRTY_URL)
if(IS_ABSOLUTE "${dwnlezf_CHECK_DIRTY_URL}")
else()
set(dwnlezf_CHECK_DIRTY_URL "${CMAKE_BINARY_DIR}/${dwnlezf_CHECK_DIRTY_URL}")
endif()
get_filename_component(unzipDir ${EXCTRATED_ZIP_PATH} NAME)
get_filename_component(unzipPath ${EXCTRATED_ZIP_PATH} PATH)
message(STATUS "Checking ${unzipDir} [from ${unzipPath}]...")
if(EXISTS "${dwnlezf_CHECK_DIRTY_URL}")
get_filename_component(CHECK_DIRTY_URL_FILENAME ${dwnlezf_CHECK_DIRTY_URL} NAME)
file(STRINGS "${dwnlezf_CHECK_DIRTY_URL}" contents)
list(GET contents 0 downloadURL)
list(REMOVE_AT contents 0)
if("${downloadURL}" MATCHES "${ZIP_URL}")
if(dwnlezf_VERBOSE)
message(STATUS "Your downloaded version (URL) seems to be up to date. Let me check if nothing is missing... (see ${dwnlezf_CHECK_DIRTY_URL}).")
endif()
file(GLOB PATHNAME_PATTERN_LIST "${EXCTRATED_ZIP_PATH}/*") ## is there something inside the downloaded destination ?
unset(NAME_PATTERN_LIST)
foreach(realPathPattern ${PATHNAME_PATTERN_LIST})
get_filename_component(itemName ${realPathPattern} NAME)
list(APPEND NAME_PATTERN_LIST ${itemName})
endforeach()
if(NAME_PATTERN_LIST)
foreach(item ${contents})
list(FIND NAME_PATTERN_LIST ${item} id)
if(${id} MATCHES "-1")
message(STATUS "${item} is missing, your downloaded version content changed, need to redownload it.")
set(ZIP_DL_FORCE ON)
break()
else()
list(REMOVE_AT NAME_PATTERN_LIST ${id})
set(ZIP_DL_FORCE OFF)
endif()
endforeach()
if(NOT ZIP_DL_FORCE AND NAME_PATTERN_LIST)
message("Yours seems to be up to date (regarding to ${CHECK_DIRTY_URL_FILENAME})!\nBut there are additional files/folders into your downloaded destination (feel free to clean it if you want).")
foreach(item ${NAME_PATTERN_LIST})
if(item)
message("${item}")
endif()
endforeach()
endif()
endif()
else()
set(ZIP_DL_FORCE ON)
message(STATUS "Your downloaded version is dirty (too old).")
endif()
else()
file(GLOB PATHNAME_PATTERN_LIST "${EXCTRATED_ZIP_PATH}/*") ## is there something inside the downloaded destination ?
if(NOT PATHNAME_PATTERN_LIST)
message("We found nothing into ${EXCTRATED_ZIP_PATH}, we will try to download it for you now.")
endif()
set(ZIP_DL_FORCE ON)
endif()
endif()
endmacro()
readDirtyUrl()
if(NOT ZIP_DL_FORCE)
return() ## do not need to further (as we are up to date, just exit the function
endif()
macro(writeDirtyUrl )
if(dwnlezf_CHECK_DIRTY_URL)
file(WRITE "${dwnlezf_CHECK_DIRTY_URL}" "${ZIP_URL}\n")
file(GLOB PATHNAME_PATTERN_LIST "${EXCTRATED_ZIP_PATH}/*") ## is there something inside the downloaded destination ?
unset(NAME_PATTERN_LIST)
foreach(realPathPattern ${PATHNAME_PATTERN_LIST})
get_filename_component(itemName ${realPathPattern} NAME)
list(APPEND NAME_PATTERN_LIST ${itemName})
endforeach()
if(NAME_PATTERN_LIST)
foreach(item ${NAME_PATTERN_LIST})
file(APPEND "${dwnlezf_CHECK_DIRTY_URL}" "${item}\n")
endforeach()
endif()
endif()
endmacro()
if(dwnlezf_DL_FORCE)
set(ZIP_DL_FORCE ON)
endif()
if(NOT dwnlezf_TIMEOUT)
set(dwnlezf_TIMEOUT 600)
endif()
math(EXPR dwnlezf_TIMEOUT_MIN "${dwnlezf_TIMEOUT}/60")
macro(unzip whichZipFile)
if(NOT SEVEN_ZIP_CMD)
find_program(SEVEN_ZIP_CMD NAMES 7z 7za p7zip DOC "7-zip executable" PATHS "$ENV{PROGRAMFILES}/7-Zip" "$ENV{${PROGRAMFILESx86}}/7-Zip" "$ENV{ProgramW6432}/7-Zip")
endif()
if(SEVEN_ZIP_CMD)
if(dwnlezf_VERBOSE)
message(STATUS "UNZIP: please, WAIT UNTIL ${SEVEN_ZIP_CMD} finished...\n(no more than ${dwnlezf_TIMEOUT_MIN} min)")
else()
message(STATUS "UNZIP...wait...")
endif()
execute_process( COMMAND ${SEVEN_ZIP_CMD} x ${whichZipFile} -y
WORKING_DIRECTORY ${EXCTRATED_ZIP_PATH} TIMEOUT ${dwnlezf_TIMEOUT}
RESULT_VARIABLE resVar OUTPUT_VARIABLE outVar ERROR_VARIABLE errVar
)
if(${resVar} MATCHES "0")
if(dwnlezf_VERBOSE)
message(STATUS "SUCESS to unzip in ${EXCTRATED_ZIP_PATH}. Now we can remove the downloaded zip file.")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} -E remove ${whichZipFile})
mark_as_advanced(SEVEN_ZIP_CMD)
else()
message(WARNING "something wrong in ${EXCTRATED_ZIP_PATH}\n with \"${SEVEN_ZIP_CMD} x ${whichZipFile} -y\", redo or try to unzip by yourself...")
message("unzip: resVar=${resVar}")
message("unzip: outVar=${outVar}")
message("unzip: errVar=${errVar}")
message("unzip: failed or canceled or timeout")
endif()
else()
message(WARNING "You need 7zip (http://www.7-zip.org/download.html) to unzip the downloaded dir.")
set(SEVEN_ZIP_CMD "" CACHE FILEPATH "7-zip executable")
mark_as_advanced(CLEAR SEVEN_ZIP_CMD)
endif()
endmacro()
if(dwnlezf_VERBOSE)
message(STATUS "Trying to look ${ZIP_DL_PATH} if a zip file exist...")
endif()
if(EXISTS "${ZIP_DL_PATH}")
## already downloaded, so just unzip it
unzip(${ZIP_DL_PATH})
writeDirtyUrl()
elseif(ZIP_DL_FORCE)
## the download part (+ unzip)
message(STATUS "Let me try to download package for you : ${ZIP_URL}")
if(dwnlezf_VERBOSE)
message(STATUS "Downloading...\n SRC=${ZIP_URL}\n DEST=${ZIP_DL_PATH}.tmp\n INACTIVITY_TIMEOUT=180s")
endif()
file(DOWNLOAD ${ZIP_URL} ${ZIP_DL_PATH}.tmp INACTIVITY_TIMEOUT 360 STATUS status SHOW_PROGRESS)
list(GET status 0 numResult)
if(${numResult} MATCHES "0")
if(dwnlezf_VERBOSE)
message(STATUS "Download succeed, so let me rename the tmp file to unzip it")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} -E rename ${ZIP_DL_PATH}.tmp ${ZIP_DL_PATH})
unzip(${ZIP_DL_PATH})
writeDirtyUrl()
else()
list(GET status 1 errMsg)
message(WARNING "DOWNLOAD ${ZIP_URL} to ${ZIP_DL_PATH} failed\n:${errMsg}")
message(WARNING "OK, you need to download the ${ZIP_URL} manually and put it into ${ZIP_DL_PATH}")
message("Take a look at the project website page to check available URL.")
endif()
endif()
## clean up the tmp downloaded file
if(EXISTS "${ZIP_DL_PATH}.tmp")
execute_process(COMMAND ${CMAKE_COMMAND} -E remove ${ZIP_DL_PATH}.tmp)
endif()
endfunction()