From 0de47b05f74bd12d41b46634f00aea3bcb6f3678 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 22 May 2015 09:15:07 -0400 Subject: ExternalData: Add option to disable use of symlinks Add an ExternalData_NO_SYMLINKS to enable use of copies instead of symlinks to populate the real data files behind a DATA{} reference. This will be useful on UNIX-like systems when the underlying filesystem does not actually support symbolic links. Suggested-by: Matt McCormick --- Help/release/dev/ExternalData-no-symlinks.rst | 7 +++++++ Modules/ExternalData.cmake | 9 ++++++++- Modules/ExternalData_config.cmake.in | 1 + Tests/Module/ExternalData/CMakeLists.txt | 1 + Tests/Module/ExternalData/DataNoSymlinks/CMakeLists.txt | 8 ++++++++ Tests/Module/ExternalData/DataNoSymlinks/Data.dat.md5 | 1 + .../Module/ExternalData/DataNoSymlinks/DataNoSymlinksCheck.cmake | 6 ++++++ 7 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 Help/release/dev/ExternalData-no-symlinks.rst create mode 100644 Tests/Module/ExternalData/DataNoSymlinks/CMakeLists.txt create mode 100644 Tests/Module/ExternalData/DataNoSymlinks/Data.dat.md5 create mode 100644 Tests/Module/ExternalData/DataNoSymlinks/DataNoSymlinksCheck.cmake diff --git a/Help/release/dev/ExternalData-no-symlinks.rst b/Help/release/dev/ExternalData-no-symlinks.rst new file mode 100644 index 0000000..9323cca --- /dev/null +++ b/Help/release/dev/ExternalData-no-symlinks.rst @@ -0,0 +1,7 @@ +ExternalData-no-symlinks +------------------------ + +* The :module:`ExternalData` module learned a new + :variable:`ExternalData_NO_SYMLINKS` option to disable use of + symbolic links to populate the real data files and use copies + instead. diff --git a/Modules/ExternalData.cmake b/Modules/ExternalData.cmake index 883ab69..a3f460d 100644 --- a/Modules/ExternalData.cmake +++ b/Modules/ExternalData.cmake @@ -117,6 +117,13 @@ calling any of the functions provided by this module. data fetch rule created for the content link will use the staged object if it cannot be found using any URL template. +.. variable:: ExternalData_NO_SYMLINKS + + The real data files named by expanded ``DATA{}`` references may be made + available under ``ExternalData_BINARY_ROOT`` using symbolic links on + some platforms. The ``ExternalData_NO_SYMLINKS`` variable may be set + to disable use of symbolic links and enable use of copies instead. + .. variable:: ExternalData_OBJECT_STORES The ``ExternalData_OBJECT_STORES`` variable may be set to a list of local @@ -842,7 +849,7 @@ function(_ExternalData_link_or_copy src dst) file(MAKE_DIRECTORY "${dst_dir}") _ExternalData_random(random) set(tmp "${dst}.tmp${random}") - if(UNIX) + if(UNIX AND NOT ExternalData_NO_SYMLINKS) # Create a symbolic link. set(tgt "${src}") if(relative_top) diff --git a/Modules/ExternalData_config.cmake.in b/Modules/ExternalData_config.cmake.in index 4434e4b..18be6b3 100644 --- a/Modules/ExternalData_config.cmake.in +++ b/Modules/ExternalData_config.cmake.in @@ -2,4 +2,5 @@ set(ExternalData_OBJECT_STORES "@ExternalData_OBJECT_STORES@") set(ExternalData_URL_TEMPLATES "@ExternalData_URL_TEMPLATES@") set(ExternalData_TIMEOUT_INACTIVITY "@ExternalData_TIMEOUT_INACTIVITY@") set(ExternalData_TIMEOUT_ABSOLUTE "@ExternalData_TIMEOUT_ABSOLUTE@") +set(ExternalData_NO_SYMLINKS "@ExternalData_NO_SYMLINKS@") @_ExternalData_CONFIG_CODE@ diff --git a/Tests/Module/ExternalData/CMakeLists.txt b/Tests/Module/ExternalData/CMakeLists.txt index b6e24d2..f07ab71 100644 --- a/Tests/Module/ExternalData/CMakeLists.txt +++ b/Tests/Module/ExternalData/CMakeLists.txt @@ -53,3 +53,4 @@ ExternalData_Add_Target(Data1) add_subdirectory(Data2) add_subdirectory(Data3) add_subdirectory(Data4) +add_subdirectory(DataNoSymlinks) diff --git a/Tests/Module/ExternalData/DataNoSymlinks/CMakeLists.txt b/Tests/Module/ExternalData/DataNoSymlinks/CMakeLists.txt new file mode 100644 index 0000000..d3df7fc --- /dev/null +++ b/Tests/Module/ExternalData/DataNoSymlinks/CMakeLists.txt @@ -0,0 +1,8 @@ +set(ExternalData_NO_SYMLINKS 1) +ExternalData_Add_Test(DataNoSymlinks + NAME DataNoSymlinksCheck + COMMAND ${CMAKE_COMMAND} + -D Data=DATA{Data.dat} + -P ${CMAKE_CURRENT_SOURCE_DIR}/DataNoSymlinksCheck.cmake + ) +ExternalData_Add_Target(DataNoSymlinks) diff --git a/Tests/Module/ExternalData/DataNoSymlinks/Data.dat.md5 b/Tests/Module/ExternalData/DataNoSymlinks/Data.dat.md5 new file mode 100644 index 0000000..70e39bd --- /dev/null +++ b/Tests/Module/ExternalData/DataNoSymlinks/Data.dat.md5 @@ -0,0 +1 @@ +8c018830e3efa5caf3c7415028335a57 diff --git a/Tests/Module/ExternalData/DataNoSymlinks/DataNoSymlinksCheck.cmake b/Tests/Module/ExternalData/DataNoSymlinks/DataNoSymlinksCheck.cmake new file mode 100644 index 0000000..2be3571 --- /dev/null +++ b/Tests/Module/ExternalData/DataNoSymlinks/DataNoSymlinksCheck.cmake @@ -0,0 +1,6 @@ +if(NOT EXISTS "${Data}") + message(SEND_ERROR "Input file:\n ${Data}\ndoes not exist!") +endif() +if(IS_SYMLINK "${Data}") + message(SEND_ERROR "Input file:\n ${Data}\nis a symlink but should not be!") +endif() -- cgit v0.12