From e18d4e3ca330496cdaf9e5a7add8883829acb07d Mon Sep 17 00:00:00 2001
From: David Manthey <david.manthey@kitware.com>
Date: Wed, 7 Sep 2016 09:41:53 -0400
Subject: [PATCH] Allow external files in multiple tests.

If you added the same external data file in three or more separate tests, there was an error.
---
 Modules/ExternalData.cmake                       | 10 ++++++----
 Tests/Module/ExternalData/CMakeLists.txt         |  1 +
 Tests/Module/ExternalData/Data5/CMakeLists.txt   | 22 ++++++++++++++++++++++
 Tests/Module/ExternalData/Data5/Data5Check.cmake |  4 ++++
 4 files changed, 33 insertions(+), 4 deletions(-)
 create mode 100644 Tests/Module/ExternalData/Data5/CMakeLists.txt
 create mode 100644 Tests/Module/ExternalData/Data5/Data5Check.cmake

diff --git a/Modules/ExternalData.cmake b/Modules/ExternalData.cmake
index a0bffe7..1253a58 100644
--- a/Modules/ExternalData.cmake
+++ b/Modules/ExternalData.cmake
@@ -403,8 +403,9 @@ function(ExternalData_add_target target)
     string(REPLACE "|" ";" tuple "${entry}")
     list(GET tuple 0 file)
     list(GET tuple 1 name)
-    if(NOT DEFINED "_ExternalData_FILE_${file}")
-      set("_ExternalData_FILE_${file}" 1)
+    get_property(added DIRECTORY PROPERTY "_ExternalData_FILE_${file}" SET)
+    if(NOT "${added}")
+      set_property(DIRECTORY PROPERTY "_ExternalData_FILE_${file}" 1)
       add_custom_command(
         COMMENT "Generating ${file}"
         OUTPUT "${file}"
@@ -427,8 +428,9 @@ function(ExternalData_add_target target)
     list(GET tuple 1 name)
     list(GET tuple 2 ext)
     set(stamp "${ext}-stamp")
-    if(NOT DEFINED "_ExternalData_FILE_${file}")
-      set("_ExternalData_FILE_${file}" 1)
+    get_property(added DIRECTORY PROPERTY "_ExternalData_FILE_${file}" SET)
+    if(NOT "${added}")
+      set_property(DIRECTORY PROPERTY "_ExternalData_FILE_${file}" 1)
       add_custom_command(
         # Users care about the data file, so hide the hash/timestamp file.
         COMMENT "Generating ${file}"
diff --git a/Tests/Module/ExternalData/CMakeLists.txt b/Tests/Module/ExternalData/CMakeLists.txt
index f07ab71..1018dd8 100644
--- a/Tests/Module/ExternalData/CMakeLists.txt
+++ b/Tests/Module/ExternalData/CMakeLists.txt
@@ -53,4 +53,5 @@ ExternalData_Add_Target(Data1)
 add_subdirectory(Data2)
 add_subdirectory(Data3)
 add_subdirectory(Data4)
+add_subdirectory(Data5)
 add_subdirectory(DataNoSymlinks)
diff --git a/Tests/Module/ExternalData/Data5/CMakeLists.txt b/Tests/Module/ExternalData/Data5/CMakeLists.txt
new file mode 100644
index 0000000..13c7fab
--- /dev/null
+++ b/Tests/Module/ExternalData/Data5/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Test adding the same data file in multiple tests
+ExternalData_Add_Test(Data5.A
+  NAME Data5Check.A
+  COMMAND ${CMAKE_COMMAND}
+    -D Data5=DATA{../Data.dat}
+    -P ${CMAKE_CURRENT_SOURCE_DIR}/Data5Check.cmake
+  )
+ExternalData_Add_Target(Data5.A)
+ExternalData_Add_Test(Data5.B
+  NAME Data5Check.B
+  COMMAND ${CMAKE_COMMAND}
+    -D Data5=DATA{../Data.dat}
+    -P ${CMAKE_CURRENT_SOURCE_DIR}/Data5Check.cmake
+  )
+ExternalData_Add_Target(Data5.B)
+ExternalData_Add_Test(Data5.C
+  NAME Data5Check.C
+  COMMAND ${CMAKE_COMMAND}
+    -D Data5=DATA{../Data.dat}
+    -P ${CMAKE_CURRENT_SOURCE_DIR}/Data5Check.cmake
+  )
+ExternalData_Add_Target(Data5.C)
diff --git a/Tests/Module/ExternalData/Data5/Data5Check.cmake b/Tests/Module/ExternalData/Data5/Data5Check.cmake
new file mode 100644
index 0000000..4dea9a4
--- /dev/null
+++ b/Tests/Module/ExternalData/Data5/Data5Check.cmake
@@ -0,0 +1,4 @@
+file(STRINGS "${Data5}" lines LIMIT_INPUT 1024)
+if(NOT "x${lines}" STREQUAL "xInput file already transformed.")
+  message(SEND_ERROR "Input file:\n  ${Data5}\ndoes not have expected content, but [[${lines}]]")
+endif()
-- 
2.9.3

