diff --git a/cmake/modules/DuneMacros.cmake b/cmake/modules/DuneMacros.cmake index d612c26049497b2e68483766502614da23d7f097..f6fc2b9f4342f9a0230809c389efe9fb7f8b5a99 100644 --- a/cmake/modules/DuneMacros.cmake +++ b/cmake/modules/DuneMacros.cmake @@ -1161,3 +1161,28 @@ macro(add_dune_all_flags targets) target_link_libraries(${target} ${DUNE_LIBS} ${libs}) endforeach() endmacro(add_dune_all_flags targets) + +# add a symlink called src_dir to all directories in the build tree. +# That symlink points to the corresponding directory in the source tree. +# Call the macro from the toplevel CMakeLists.txt file of your project. +# You can also call it from some other directory, creating only symlinks +# in that directory and all directories below. A warning is issued on +# Windows systems. +macro(dune_symlink_to_source_tree) + # check for Windows to issue a warning + if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + if(NOT DEFINED DUNE_WINDOWS_SYMLINK_WARNING) + message(WARNING "Your module wanted to create symlinks, but you cannot do that on your platform.") + set(DUNE_WINDOWS_SYMLINK_WARNING) + endif() + else() + # get a list of all files in the current source directory and below. + file(GLOB_RECURSE files RELATIVE ${CMAKE_SOURCE_DIR} "*") + + # iterate over all files, extract the directory name and write a symlink in the corresponding build directory + foreach(f ${files}) + get_filename_component(dir ${f} DIRECTORY) + execute_process(COMMAND ${CMAKE_COMMAND} "-E" "create_symlink" "${CMAKE_SOURCE_DIR}/${dir}" "${CMAKE_BINARY_DIR}/${dir}/src_dir") + endforeach() + endif() +endmacro(dune_symlink_to_source_tree)