set(@DEPENDENCY_NAME@_URL "@DEPENDENCY_URL@") set(@DEPENDENCY_NAME@_DIR ${CMDEP_ROOT_DIR}/@DEPENDENCY_NAME@) set(@DEPENDENCY_NAME@_LOCK ${CMDEP_ROOT_DIR}) set(@DEPENDENCY_NAME@_DOT_CMDEP_SOURCE_FILE "${@DEPENDENCY_NAME@_DIR}/.cmdep-source") set(@DEPENDENCY_NAME@_SOURCE_DIR ${@DEPENDENCY_NAME@_DIR} CACHE PATH "A path that points to a @DEPENDENCY_NAME@ source directory. If manually set, no downloading or extraction will take place and this will be used instead.") set(@DEPENDENCY_NAME@_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/@DEPENDENCY_NAME@) if(NOT @DEPENDENCY_NAME@_DOWNLOAD_NAME) get_filename_component(@DEPENDENCY_NAME@_DOWNLOAD_NAME "${@DEPENDENCY_NAME@_URL}" NAME) endif() set(@DEPENDENCY_NAME@_ZIP ${CMDEP_ZIP_DIR}/${@DEPENDENCY_NAME@_DOWNLOAD_NAME}) # To prevent other concurrent CMake instances from trying to download or extract # the file, we lock the source directory. This will guarantee that only a single # CMake instance downloads or extracts a file. # file(LOCK ${@DEPENDENCY_NAME@_LOCK} DIRECTORY GUARD FILE) if(@DEPENDENCY_NAME@_SOURCE_DIR STREQUAL @DEPENDENCY_NAME@_DIR) if(EXISTS "${@DEPENDENCY_NAME@_DOT_CMDEP_SOURCE_FILE}") file(READ "${@DEPENDENCY_NAME@_DOT_CMDEP_SOURCE_FILE}" @DEPENDENCY_NAME@_CURRENT_SOURCE_URL) if(NOT @DEPENDENCY_NAME@_CURRENT_SOURCE_URL STREQUAL @DEPENDENCY_NAME@_URL) set(@DEPENDENCY_NAME@_SOURCE_CHANGED TRUE) endif() else() set(@DEPENDENCY_NAME@_SOURCE_CHANGED TRUE) endif() endif() if(@DEPENDENCY_NAME@_SOURCE_CHANGED) message(STATUS "@DEPENDENCY_NAME@: Source has changed. Redownloading...") file(REMOVE_RECURSE ${@DEPENDENCY_NAME@_DIR}) endif() if(NOT EXISTS ${@DEPENDENCY_NAME@_SOURCE_DIR}) if(NOT EXISTS ${@DEPENDENCY_NAME@_ZIP}) get_filename_component(@DEPENDENCY_NAME@_ZIP_DIRECTORY "${@DEPENDENCY_NAME@_ZIP}" DIRECTORY) if(NOT EXISTS ${@DEPENDENCY_NAME@_ZIP_DIRECTORY}) file(MAKE_DIRECTORY ${@DEPENDENCY_NAME@_ZIP_DIRECTORY}) endif() message(STATUS "@DEPENDENCY_NAME@: Downloading from ${@DEPENDENCY_NAME@_URL}") file(DOWNLOAD ${@DEPENDENCY_NAME@_URL} ${@DEPENDENCY_NAME@_ZIP} SHOW_PROGRESS # no TIMEOUT STATUS status LOG log) list(GET status 0 status_code) list(GET status 1 status_string) if(status_code EQUAL 0) message(STATUS "@DEPENDENCY_NAME@: Download complete") else() message(FATAL_ERROR "@DEPENDENCY_NAME@: error: downloading from '${@DEPENDENCY_NAME@_URL}' failed with error code ${status_code} (${status_string}) -- ${log}") endif() endif() # Prepare a space for extracting: # set(tmp_dir "${CMAKE_CURRENT_BINARY_DIR}/@DEPENDENCY_NAME@-tmp") file(MAKE_DIRECTORY "${tmp_dir}") # Extract it: # message(STATUS "@DEPENDENCY_NAME@: extracting...") execute_process(COMMAND ${CMAKE_COMMAND} -E tar xfz ${@DEPENDENCY_NAME@_ZIP} WORKING_DIRECTORY ${tmp_dir} RESULT_VARIABLE rv) if(NOT rv EQUAL 0) message(STATUS "@DEPENDENCY_NAME@: extracting... [error clean up]") file(REMOVE_RECURSE "${tmp_dir}") message(FATAL_ERROR "@DEPENDENCY_NAME@: error: extract of '${@DEPENDENCY_NAME@_DOWNLOAD_NAME}' failed") endif() # Analyze what came out of the tar file: # message(STATUS "@DEPENDENCY_NAME@: extracting... [analysis]") file(GLOB contents "${tmp_dir}/*") list(REMOVE_ITEM contents "${tmp_dir}/.DS_Store") list(LENGTH contents n) if(NOT n EQUAL 1 OR NOT IS_DIRECTORY "${contents}") set(contents "${tmp_dir}") endif() # Move "the one" directory to the final directory: # message(STATUS "@DEPENDENCY_NAME@: extracting... [rename]") file(REMOVE_RECURSE ${@DEPENDENCY_NAME@_DIR}) get_filename_component(contents ${contents} ABSOLUTE) file(RENAME ${contents} ${@DEPENDENCY_NAME@_DIR}) # Clean up: # message(STATUS "@DEPENDENCY_NAME@: extracting... [clean up]") file(REMOVE_RECURSE "${tmp_dir}") file(WRITE "${@DEPENDENCY_NAME@_DOT_CMDEP_SOURCE_FILE}" "${@DEPENDENCY_NAME@_URL}") set(@DEPENDENCY_NAME@_SOURCE_DIR ${@DEPENDENCY_NAME@_DIR} CACHE PATH "A path that points to a @DEPENDENCY_NAME@ source directory. If manually set, no downloading or extraction will take place and this will be used instead." FORCE) endif() # We are now done. We can unlock the CMake directory and proceed. # file(LOCK ${@DEPENDENCY_NAME@_LOCK} DIRECTORY RELEASE)