From e2e0d2e3c7108d5ce41f032ad9089155c6b4735c Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 30 Jan 2013 14:44:49 -0500 Subject: [PATCH] ExternalData: Collapse ../ components in DATA{} paths Relative path components need to be normalized out even if they appear in the middle of a caller-supplied string. --- Modules/ExternalData.cmake | 3 ++- Tests/Module/ExternalData/Data2/CMakeLists.txt | 1 + Tests/Module/ExternalData/Data2/Data2Check.cmake | 9 ++++++--- Tests/Module/ExternalData/Data2b.dat.md5 | 1 + Tests/RunCMake/ExternalData/SubDirectory1-stdout.txt | 3 ++- .../ExternalData/SubDirectory1/CMakeLists.txt | 12 +++++++++++- 6 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 Tests/Module/ExternalData/Data2b.dat.md5 diff --git a/Modules/ExternalData.cmake b/Modules/ExternalData.cmake index 26b0f99ab..825b7b871 100644 --- a/Modules/ExternalData.cmake +++ b/Modules/ExternalData.cmake @@ -334,8 +334,9 @@ function(_ExternalData_arg target arg options var_file) if(IS_ABSOLUTE "${data}") set(absdata "${data}") else() - get_filename_component(absdata "${CMAKE_CURRENT_SOURCE_DIR}/${data}" ABSOLUTE) + set(absdata "${CMAKE_CURRENT_SOURCE_DIR}/${data}") endif() + get_filename_component(absdata "${absdata}" ABSOLUTE) # Convert to relative path under the source tree. if(NOT ExternalData_SOURCE_ROOT) diff --git a/Tests/Module/ExternalData/Data2/CMakeLists.txt b/Tests/Module/ExternalData/Data2/CMakeLists.txt index e6d8767a6..c5b79ac05 100644 --- a/Tests/Module/ExternalData/Data2/CMakeLists.txt +++ b/Tests/Module/ExternalData/Data2/CMakeLists.txt @@ -4,6 +4,7 @@ ExternalData_Add_Test(Data2 NAME Data2Check COMMAND ${CMAKE_COMMAND} -D Data2=DATA{../Data2.dat} + -D Data2b=DATA{${CMAKE_CURRENT_SOURCE_DIR}/../Data2b.dat} -D SeriesC=DATA{SeriesC_1_.my.dat,:} -P ${CMAKE_CURRENT_SOURCE_DIR}/Data2Check.cmake ) diff --git a/Tests/Module/ExternalData/Data2/Data2Check.cmake b/Tests/Module/ExternalData/Data2/Data2Check.cmake index a1dd5091d..d5b0c7b68 100644 --- a/Tests/Module/ExternalData/Data2/Data2Check.cmake +++ b/Tests/Module/ExternalData/Data2/Data2Check.cmake @@ -1,6 +1,9 @@ -if(NOT EXISTS "${Data2}") - message(SEND_ERROR "Input file:\n ${Data2}\ndoes not exist!") -endif() +foreach(d "${Data2}" "${Data2b}") + file(STRINGS "${d}" lines LIMIT_INPUT 1024) + if(NOT "x${lines}" STREQUAL "xInput file already transformed.") + message(SEND_ERROR "Input file:\n ${d}\ndoes not have expected content, but [[${lines}]]") + endif() +endforeach() foreach(n 1 2 3) string(REGEX REPLACE "_1_\\.my\\.dat$" "_${n}_.my.dat" SeriesCFile "${SeriesC}") if(NOT EXISTS "${SeriesCFile}") diff --git a/Tests/Module/ExternalData/Data2b.dat.md5 b/Tests/Module/ExternalData/Data2b.dat.md5 new file mode 100644 index 000000000..70e39bd5d --- /dev/null +++ b/Tests/Module/ExternalData/Data2b.dat.md5 @@ -0,0 +1 @@ +8c018830e3efa5caf3c7415028335a57 diff --git a/Tests/RunCMake/ExternalData/SubDirectory1-stdout.txt b/Tests/RunCMake/ExternalData/SubDirectory1-stdout.txt index 35a8cc172..03924cb5b 100644 --- a/Tests/RunCMake/ExternalData/SubDirectory1-stdout.txt +++ b/Tests/RunCMake/ExternalData/SubDirectory1-stdout.txt @@ -1,2 +1,3 @@ --- Data reference correctly transformed in parent dir! +-- Data reference correctly transformed in parent dir 1! +-- Data reference correctly transformed in parent dir 2! -- Data reference correctly transformed in current dir! diff --git a/Tests/RunCMake/ExternalData/SubDirectory1/CMakeLists.txt b/Tests/RunCMake/ExternalData/SubDirectory1/CMakeLists.txt index 07824608c..881ff5c2c 100644 --- a/Tests/RunCMake/ExternalData/SubDirectory1/CMakeLists.txt +++ b/Tests/RunCMake/ExternalData/SubDirectory1/CMakeLists.txt @@ -2,7 +2,17 @@ set(input ../Data.txt) set(output ${CMAKE_BINARY_DIR}/Data.txt) ExternalData_Expand_Arguments(Data args DATA{${input}}) if("x${args}" STREQUAL "x${output}") - message(STATUS "Data reference correctly transformed in parent dir!") + message(STATUS "Data reference correctly transformed in parent dir 1!") +else() + message(FATAL_ERROR "Data reference transformed to:\n ${args}\n" + "but we expected:\n ${output}") +endif() + +set(input ${CMAKE_CURRENT_SOURCE_DIR}/../Data.txt) +set(output ${CMAKE_BINARY_DIR}/Data.txt) +ExternalData_Expand_Arguments(Data args DATA{${input}}) +if("x${args}" STREQUAL "x${output}") + message(STATUS "Data reference correctly transformed in parent dir 2!") else() message(FATAL_ERROR "Data reference transformed to:\n ${args}\n" "but we expected:\n ${output}")