Merge topic 'ExternalData-recursive-match'

230f2d6e ExternalData: Add option to recursively match under directories
564c07f7 ExternalData: Parameterize internal file(GLOB) operation selection
This commit is contained in:
Brad King 2015-03-30 09:27:48 -04:00 committed by CMake Topic Stage
commit 8bc6cfd727
23 changed files with 84 additions and 7 deletions

View File

@ -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.

View File

@ -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}")

View File

@ -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
) )

View File

@ -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})

View File

@ -0,0 +1 @@
9d980b06c2f0fec3d4872d68175b9822

View File

@ -0,0 +1 @@
8f4add4581551facf27237e6577fd662

View File

@ -0,0 +1 @@
c1030719c95f3435d8abc39c0d442946

View File

@ -0,0 +1 @@
9d980b06c2f0fec3d4872d68175b9822

View File

@ -0,0 +1 @@
8f4add4581551facf27237e6577fd662

View File

@ -0,0 +1 @@
c1030719c95f3435d8abc39c0d442946

View File

@ -0,0 +1 @@
9d980b06c2f0fec3d4872d68175b9822

View File

@ -0,0 +1 @@
8f4add4581551facf27237e6577fd662

View File

@ -0,0 +1 @@
c1030719c95f3435d8abc39c0d442946

View File

@ -0,0 +1 @@
1

View File

@ -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\)

View File

@ -0,0 +1,2 @@
include(ExternalData)
ExternalData_Expand_Arguments(Data args DATA{Series.txt,:,RECURSE:})

View File

@ -0,0 +1 @@
1

View File

@ -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\)

View File

@ -0,0 +1,2 @@
include(ExternalData)
ExternalData_Expand_Arguments(Data args DATA{Data.txt,RECURSE:})

View File

@ -0,0 +1 @@
1

View File

@ -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\)

View File

@ -0,0 +1,2 @@
include(ExternalData)
ExternalData_Expand_Arguments(Data args DATA{Directory1/,RECURSE:x,Data.dat})

View File

@ -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)