mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-25 09:58:37 -05:00
4f3d1abbb4
The mkdir, download, update and patch steps are used by FetchContent during the configure phase of the main build. Because these steps need a target, this has so far required a sub-build to be set up. The changes here factor out the preparation of the scripts from the creation of the targets, allowing future work to leverage these steps without a sub-build (see #21703). As part of the refactoring, some rationalisation of the stamp files, repository info files and script names was done to make things more consistent between download methods and step implementations. Every download method now records its own specific repository info in a file and that file is a dependency of the download step. The source directory is also written to that file, so if the SOURCE_DIR changes, the download will be retriggered (the existing implementation fails in this scenario). Each download method now also has just one driver script that implements the whole step (it may pull in other scripts to do its task though). The patch step gained support for USES_TERMINAL as a result of generalising the implementation for custom commands. Fixes: #21748
64 lines
1.7 KiB
CMake
64 lines
1.7 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
|
|
cmake_minimum_required(VERSION 3.5)
|
|
|
|
# Make file names absolute:
|
|
#
|
|
get_filename_component(filename "@filename@" ABSOLUTE)
|
|
get_filename_component(directory "@directory@" ABSOLUTE)
|
|
|
|
message(STATUS "extracting...
|
|
src='${filename}'
|
|
dst='${directory}'")
|
|
|
|
if(NOT EXISTS "${filename}")
|
|
message(FATAL_ERROR "File to extract does not exist: '${filename}'")
|
|
endif()
|
|
|
|
# Prepare a space for extracting:
|
|
#
|
|
set(i 1234)
|
|
while(EXISTS "${directory}/../ex-@name@${i}")
|
|
math(EXPR i "${i} + 1")
|
|
endwhile()
|
|
set(ut_dir "${directory}/../ex-@name@${i}")
|
|
file(MAKE_DIRECTORY "${ut_dir}")
|
|
|
|
# Extract it:
|
|
#
|
|
message(STATUS "extracting... [tar @args@]")
|
|
execute_process(COMMAND ${CMAKE_COMMAND} -E tar @args@ ${filename}
|
|
WORKING_DIRECTORY ${ut_dir}
|
|
RESULT_VARIABLE rv)
|
|
|
|
if(NOT rv EQUAL 0)
|
|
message(STATUS "extracting... [error clean up]")
|
|
file(REMOVE_RECURSE "${ut_dir}")
|
|
message(FATAL_ERROR "Extract of '${filename}' failed")
|
|
endif()
|
|
|
|
# Analyze what came out of the tar file:
|
|
#
|
|
message(STATUS "extracting... [analysis]")
|
|
file(GLOB contents "${ut_dir}/*")
|
|
list(REMOVE_ITEM contents "${ut_dir}/.DS_Store")
|
|
list(LENGTH contents n)
|
|
if(NOT n EQUAL 1 OR NOT IS_DIRECTORY "${contents}")
|
|
set(contents "${ut_dir}")
|
|
endif()
|
|
|
|
# Move "the one" directory to the final directory:
|
|
#
|
|
message(STATUS "extracting... [rename]")
|
|
file(REMOVE_RECURSE ${directory})
|
|
get_filename_component(contents ${contents} ABSOLUTE)
|
|
file(RENAME ${contents} ${directory})
|
|
|
|
# Clean up:
|
|
#
|
|
message(STATUS "extracting... [clean up]")
|
|
file(REMOVE_RECURSE "${ut_dir}")
|
|
|
|
message(STATUS "extracting... done")
|