Merge topic 'ExternalData-recursive-match'
230f2d6e
ExternalData: Add option to recursively match under directories564c07f7
ExternalData: Parameterize internal file(GLOB) operation selection
This commit is contained in:
commit
8bc6cfd727
|
@ -0,0 +1,7 @@
|
||||||
|
ExternalData-recursive-match
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
* The :module:`ExternalData` module learned a new ``RECURSE:``
|
||||||
|
option in ``DATA{}`` references specifying directories.
|
||||||
|
This allows an entire directory tree of associated files
|
||||||
|
to be matched.
|
|
@ -244,7 +244,8 @@ associated file options. For example, the argument
|
||||||
``DATA{MyDataDir/,REGEX:.*}`` will pass the full path to a ``MyDataDir``
|
``DATA{MyDataDir/,REGEX:.*}`` will pass the full path to a ``MyDataDir``
|
||||||
directory on the command line and ensure that the directory contains
|
directory on the command line and ensure that the directory contains
|
||||||
files corresponding to every file or content link in the ``MyDataDir``
|
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
|
Hash Algorithms
|
||||||
^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^
|
||||||
|
@ -597,6 +598,7 @@ function(_ExternalData_arg target arg options var_file)
|
||||||
|
|
||||||
# Process options.
|
# Process options.
|
||||||
set(series_option "")
|
set(series_option "")
|
||||||
|
set(recurse_option "")
|
||||||
set(associated_files "")
|
set(associated_files "")
|
||||||
set(associated_regex "")
|
set(associated_regex "")
|
||||||
foreach(opt ${options})
|
foreach(opt ${options})
|
||||||
|
@ -606,6 +608,9 @@ function(_ExternalData_arg target arg options var_file)
|
||||||
elseif(opt STREQUAL ":")
|
elseif(opt STREQUAL ":")
|
||||||
# Activate series matching.
|
# Activate series matching.
|
||||||
set(series_option "${opt}")
|
set(series_option "${opt}")
|
||||||
|
elseif(opt STREQUAL "RECURSE:")
|
||||||
|
# Activate recursive matching in directories.
|
||||||
|
set(recurse_option "${opt}")
|
||||||
elseif("x${opt}" MATCHES "^[^][:/*?]+$")
|
elseif("x${opt}" MATCHES "^[^][:/*?]+$")
|
||||||
# Specific associated file.
|
# Specific associated file.
|
||||||
list(APPEND associated_files "${opt}")
|
list(APPEND associated_files "${opt}")
|
||||||
|
@ -622,6 +627,9 @@ function(_ExternalData_arg target arg options var_file)
|
||||||
if(associated_files OR associated_regex)
|
if(associated_files OR associated_regex)
|
||||||
message(FATAL_ERROR "Series option \"${series_option}\" not allowed with associated files.")
|
message(FATAL_ERROR "Series option \"${series_option}\" not allowed with associated files.")
|
||||||
endif()
|
endif()
|
||||||
|
if(recurse_option)
|
||||||
|
message(FATAL_ERROR "Recurse option \"${recurse_option}\" allowed only with directories.")
|
||||||
|
endif()
|
||||||
# Load a whole file series.
|
# Load a whole file series.
|
||||||
_ExternalData_arg_series()
|
_ExternalData_arg_series()
|
||||||
elseif(data_is_directory)
|
elseif(data_is_directory)
|
||||||
|
@ -634,6 +642,9 @@ function(_ExternalData_arg target arg options var_file)
|
||||||
"must list associated files.")
|
"must list associated files.")
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
|
if(recurse_option)
|
||||||
|
message(FATAL_ERROR "Recurse option \"${recurse_option}\" allowed only with directories.")
|
||||||
|
endif()
|
||||||
# Load the named data file.
|
# Load the named data file.
|
||||||
_ExternalData_arg_single()
|
_ExternalData_arg_single()
|
||||||
if(associated_files OR associated_regex)
|
if(associated_files OR associated_regex)
|
||||||
|
@ -681,11 +692,18 @@ macro(_ExternalData_arg_associated)
|
||||||
set(reldir "${reldir}/")
|
set(reldir "${reldir}/")
|
||||||
endif()
|
endif()
|
||||||
_ExternalData_exact_regex(reldir_regex "${reldir}")
|
_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.
|
# Find files named explicitly.
|
||||||
foreach(file ${associated_files})
|
foreach(file ${associated_files})
|
||||||
_ExternalData_exact_regex(file_regex "${file}")
|
_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()
|
endforeach()
|
||||||
|
|
||||||
# Find files matching the given regular expressions.
|
# Find files matching the given regular expressions.
|
||||||
|
@ -695,13 +713,13 @@ macro(_ExternalData_arg_associated)
|
||||||
set(all "${all}${sep}${reldir_regex}${regex}")
|
set(all "${all}${sep}${reldir_regex}${regex}")
|
||||||
set(sep "|")
|
set(sep "|")
|
||||||
endforeach()
|
endforeach()
|
||||||
_ExternalData_arg_find_files("${reldir}" "${all}")
|
_ExternalData_arg_find_files(${glob} "${reldir}" "${all}")
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
macro(_ExternalData_arg_single)
|
macro(_ExternalData_arg_single)
|
||||||
# Match only the named data by itself.
|
# Match only the named data by itself.
|
||||||
_ExternalData_exact_regex(data_regex "${reldata}")
|
_ExternalData_exact_regex(data_regex "${reldata}")
|
||||||
_ExternalData_arg_find_files("${reldata}" "${data_regex}")
|
_ExternalData_arg_find_files(GLOB "${reldata}" "${data_regex}")
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
macro(_ExternalData_arg_series)
|
macro(_ExternalData_arg_series)
|
||||||
|
@ -756,12 +774,15 @@ macro(_ExternalData_arg_series)
|
||||||
# Then match base, number, and extension.
|
# Then match base, number, and extension.
|
||||||
_ExternalData_exact_regex(series_base "${relbase}")
|
_ExternalData_exact_regex(series_base "${relbase}")
|
||||||
_ExternalData_exact_regex(series_ext "${ext}")
|
_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}")
|
"${series_base}${series_match}${series_ext}")
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
function(_ExternalData_arg_find_files pattern regex)
|
function(_ExternalData_arg_find_files glob pattern regex)
|
||||||
file(GLOB globbed RELATIVE "${top_src}" "${top_src}/${pattern}*")
|
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)
|
foreach(entry IN LISTS globbed)
|
||||||
if("x${entry}" MATCHES "^x(.*)(\\.(${_ExternalData_REGEX_EXT}))$")
|
if("x${entry}" MATCHES "^x(.*)(\\.(${_ExternalData_REGEX_EXT}))$")
|
||||||
set(relname "${CMAKE_MATCH_1}")
|
set(relname "${CMAKE_MATCH_1}")
|
||||||
|
|
|
@ -44,6 +44,7 @@ ExternalData_Add_Test(Data1
|
||||||
-D Paired=DATA{PairedA.dat,PairedB.dat}
|
-D Paired=DATA{PairedA.dat,PairedB.dat}
|
||||||
-D Meta=DATA{MetaTop.dat,REGEX:Meta[ABC].dat}
|
-D Meta=DATA{MetaTop.dat,REGEX:Meta[ABC].dat}
|
||||||
-D Directory=DATA{Directory/,A.dat,REGEX:[BC].dat}
|
-D Directory=DATA{Directory/,A.dat,REGEX:[BC].dat}
|
||||||
|
-D DirRecurse=DATA{DirRecurse/,RECURSE:,A.dat,REGEX:[BC].dat}
|
||||||
-D "Semicolons=DATA{Data.dat}\\;DATA{Data.dat}"
|
-D "Semicolons=DATA{Data.dat}\\;DATA{Data.dat}"
|
||||||
-P ${CMAKE_CURRENT_SOURCE_DIR}/Data1Check.cmake
|
-P ${CMAKE_CURRENT_SOURCE_DIR}/Data1Check.cmake
|
||||||
)
|
)
|
||||||
|
|
|
@ -90,6 +90,12 @@ foreach(n A B C)
|
||||||
message(SEND_ERROR "Input file:\n ${file}\ndoes not exist!")
|
message(SEND_ERROR "Input file:\n ${file}\ndoes not exist!")
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
foreach(n A Sub1/A Sub2/Dir/A B Sub1/B Sub2/Dir/B C Sub1/C Sub2/Dir/C)
|
||||||
|
set(file "${DirRecurse}/${n}.dat")
|
||||||
|
if(NOT EXISTS "${file}")
|
||||||
|
message(SEND_ERROR "Input file:\n ${file}\ndoes not exist!")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
list(LENGTH Semicolons len)
|
list(LENGTH Semicolons len)
|
||||||
if("${len}" EQUAL 2)
|
if("${len}" EQUAL 2)
|
||||||
foreach(file ${Semicolons})
|
foreach(file ${Semicolons})
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
9d980b06c2f0fec3d4872d68175b9822
|
|
@ -0,0 +1 @@
|
||||||
|
8f4add4581551facf27237e6577fd662
|
|
@ -0,0 +1 @@
|
||||||
|
c1030719c95f3435d8abc39c0d442946
|
|
@ -0,0 +1 @@
|
||||||
|
9d980b06c2f0fec3d4872d68175b9822
|
|
@ -0,0 +1 @@
|
||||||
|
8f4add4581551facf27237e6577fd662
|
|
@ -0,0 +1 @@
|
||||||
|
c1030719c95f3435d8abc39c0d442946
|
|
@ -0,0 +1 @@
|
||||||
|
9d980b06c2f0fec3d4872d68175b9822
|
|
@ -0,0 +1 @@
|
||||||
|
8f4add4581551facf27237e6577fd662
|
|
@ -0,0 +1 @@
|
||||||
|
c1030719c95f3435d8abc39c0d442946
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1,6 @@
|
||||||
|
CMake Error at .*/Modules/ExternalData.cmake:[0-9]+ \(message\):
|
||||||
|
Recurse option "RECURSE:" allowed only with directories.
|
||||||
|
Call Stack \(most recent call first\):
|
||||||
|
.*
|
||||||
|
BadRecurse1.cmake:2 \(ExternalData_Expand_Arguments\)
|
||||||
|
CMakeLists.txt:3 \(include\)
|
|
@ -0,0 +1,2 @@
|
||||||
|
include(ExternalData)
|
||||||
|
ExternalData_Expand_Arguments(Data args DATA{Series.txt,:,RECURSE:})
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1,6 @@
|
||||||
|
CMake Error at .*/Modules/ExternalData.cmake:[0-9]+ \(message\):
|
||||||
|
Recurse option "RECURSE:" allowed only with directories.
|
||||||
|
Call Stack \(most recent call first\):
|
||||||
|
.*
|
||||||
|
BadRecurse2.cmake:2 \(ExternalData_Expand_Arguments\)
|
||||||
|
CMakeLists.txt:3 \(include\)
|
|
@ -0,0 +1,2 @@
|
||||||
|
include(ExternalData)
|
||||||
|
ExternalData_Expand_Arguments(Data args DATA{Data.txt,RECURSE:})
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1,9 @@
|
||||||
|
CMake Error at .*/Modules/ExternalData.cmake:[0-9]+ \(message\):
|
||||||
|
Unknown option "RECURSE:x" in argument
|
||||||
|
|
||||||
|
DATA{Directory1/,RECURSE:x,Data.dat}
|
||||||
|
|
||||||
|
Call Stack \(most recent call first\):
|
||||||
|
.*
|
||||||
|
BadRecurse3.cmake:2 \(ExternalData_Expand_Arguments\)
|
||||||
|
CMakeLists.txt:3 \(include\)
|
|
@ -0,0 +1,2 @@
|
||||||
|
include(ExternalData)
|
||||||
|
ExternalData_Expand_Arguments(Data args DATA{Directory1/,RECURSE:x,Data.dat})
|
|
@ -9,6 +9,9 @@ run_cmake(BadCustom4)
|
||||||
run_cmake(BadHashAlgo1)
|
run_cmake(BadHashAlgo1)
|
||||||
run_cmake(BadOption1)
|
run_cmake(BadOption1)
|
||||||
run_cmake(BadOption2)
|
run_cmake(BadOption2)
|
||||||
|
run_cmake(BadRecurse1)
|
||||||
|
run_cmake(BadRecurse2)
|
||||||
|
run_cmake(BadRecurse3)
|
||||||
run_cmake(BadSeries1)
|
run_cmake(BadSeries1)
|
||||||
run_cmake(BadSeries2)
|
run_cmake(BadSeries2)
|
||||||
run_cmake(BadSeries3)
|
run_cmake(BadSeries3)
|
||||||
|
|
Loading…
Reference in New Issue