mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-05 21:31:08 -06:00
Merge topic 'ExternalData-recursive-match'
230f2d6eExternalData: Add option to recursively match under directories564c07f7ExternalData: Parameterize internal file(GLOB) operation selection
This commit is contained in:
@@ -244,7 +244,8 @@ associated file options. For example, the argument
|
||||
``DATA{MyDataDir/,REGEX:.*}`` will pass the full path to a ``MyDataDir``
|
||||
directory on the command line and ensure that the directory contains
|
||||
files corresponding to every file or content link in the ``MyDataDir``
|
||||
source directory.
|
||||
source directory. In order to match associated files in subdirectories,
|
||||
specify a ``RECURSE:`` option, e.g. ``DATA{MyDataDir/,RECURSE:,REGEX:.*}``.
|
||||
|
||||
Hash Algorithms
|
||||
^^^^^^^^^^^^^^^
|
||||
@@ -597,6 +598,7 @@ function(_ExternalData_arg target arg options var_file)
|
||||
|
||||
# Process options.
|
||||
set(series_option "")
|
||||
set(recurse_option "")
|
||||
set(associated_files "")
|
||||
set(associated_regex "")
|
||||
foreach(opt ${options})
|
||||
@@ -606,6 +608,9 @@ function(_ExternalData_arg target arg options var_file)
|
||||
elseif(opt STREQUAL ":")
|
||||
# Activate series matching.
|
||||
set(series_option "${opt}")
|
||||
elseif(opt STREQUAL "RECURSE:")
|
||||
# Activate recursive matching in directories.
|
||||
set(recurse_option "${opt}")
|
||||
elseif("x${opt}" MATCHES "^[^][:/*?]+$")
|
||||
# Specific associated file.
|
||||
list(APPEND associated_files "${opt}")
|
||||
@@ -622,6 +627,9 @@ function(_ExternalData_arg target arg options var_file)
|
||||
if(associated_files OR associated_regex)
|
||||
message(FATAL_ERROR "Series option \"${series_option}\" not allowed with associated files.")
|
||||
endif()
|
||||
if(recurse_option)
|
||||
message(FATAL_ERROR "Recurse option \"${recurse_option}\" allowed only with directories.")
|
||||
endif()
|
||||
# Load a whole file series.
|
||||
_ExternalData_arg_series()
|
||||
elseif(data_is_directory)
|
||||
@@ -634,6 +642,9 @@ function(_ExternalData_arg target arg options var_file)
|
||||
"must list associated files.")
|
||||
endif()
|
||||
else()
|
||||
if(recurse_option)
|
||||
message(FATAL_ERROR "Recurse option \"${recurse_option}\" allowed only with directories.")
|
||||
endif()
|
||||
# Load the named data file.
|
||||
_ExternalData_arg_single()
|
||||
if(associated_files OR associated_regex)
|
||||
@@ -681,11 +692,18 @@ macro(_ExternalData_arg_associated)
|
||||
set(reldir "${reldir}/")
|
||||
endif()
|
||||
_ExternalData_exact_regex(reldir_regex "${reldir}")
|
||||
if(recurse_option)
|
||||
set(glob GLOB_RECURSE)
|
||||
set(reldir_regex "${reldir_regex}(.+/)?")
|
||||
else()
|
||||
set(glob GLOB)
|
||||
endif()
|
||||
|
||||
# Find files named explicitly.
|
||||
foreach(file ${associated_files})
|
||||
_ExternalData_exact_regex(file_regex "${file}")
|
||||
_ExternalData_arg_find_files("${reldir}${file}" "${reldir_regex}${file_regex}")
|
||||
_ExternalData_arg_find_files(${glob} "${reldir}${file}"
|
||||
"${reldir_regex}${file_regex}")
|
||||
endforeach()
|
||||
|
||||
# Find files matching the given regular expressions.
|
||||
@@ -695,13 +713,13 @@ macro(_ExternalData_arg_associated)
|
||||
set(all "${all}${sep}${reldir_regex}${regex}")
|
||||
set(sep "|")
|
||||
endforeach()
|
||||
_ExternalData_arg_find_files("${reldir}" "${all}")
|
||||
_ExternalData_arg_find_files(${glob} "${reldir}" "${all}")
|
||||
endmacro()
|
||||
|
||||
macro(_ExternalData_arg_single)
|
||||
# Match only the named data by itself.
|
||||
_ExternalData_exact_regex(data_regex "${reldata}")
|
||||
_ExternalData_arg_find_files("${reldata}" "${data_regex}")
|
||||
_ExternalData_arg_find_files(GLOB "${reldata}" "${data_regex}")
|
||||
endmacro()
|
||||
|
||||
macro(_ExternalData_arg_series)
|
||||
@@ -756,12 +774,15 @@ macro(_ExternalData_arg_series)
|
||||
# Then match base, number, and extension.
|
||||
_ExternalData_exact_regex(series_base "${relbase}")
|
||||
_ExternalData_exact_regex(series_ext "${ext}")
|
||||
_ExternalData_arg_find_files("${relbase}*${ext}"
|
||||
_ExternalData_arg_find_files(GLOB "${relbase}*${ext}"
|
||||
"${series_base}${series_match}${series_ext}")
|
||||
endmacro()
|
||||
|
||||
function(_ExternalData_arg_find_files pattern regex)
|
||||
file(GLOB globbed RELATIVE "${top_src}" "${top_src}/${pattern}*")
|
||||
function(_ExternalData_arg_find_files glob pattern regex)
|
||||
cmake_policy(PUSH)
|
||||
cmake_policy(SET CMP0009 NEW)
|
||||
file(${glob} globbed RELATIVE "${top_src}" "${top_src}/${pattern}*")
|
||||
cmake_policy(POP)
|
||||
foreach(entry IN LISTS globbed)
|
||||
if("x${entry}" MATCHES "^x(.*)(\\.(${_ExternalData_REGEX_EXT}))$")
|
||||
set(relname "${CMAKE_MATCH_1}")
|
||||
|
||||
Reference in New Issue
Block a user