file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/dest1") file(TOUCH "${CMAKE_BINARY_DIR}/file1.txt") file(CREATE_LINK file1.txt "${CMAKE_BINARY_DIR}/file1.txt.sym" SYMBOLIC) file(TOUCH "${CMAKE_BINARY_DIR}/dest1/file1.txt.sym") file(TOUCH "${CMAKE_BINARY_DIR}/file2.txt") file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/file2") file(CREATE_LINK ../file2.txt "${CMAKE_BINARY_DIR}/file2/file2.txt.sym" SYMBOLIC) file(TOUCH "${CMAKE_BINARY_DIR}/file3.txt") file(CREATE_LINK "${CMAKE_BINARY_DIR}/file3.txt" "${CMAKE_BINARY_DIR}/file3.txt.sym" SYMBOLIC) file(TOUCH "${CMAKE_BINARY_DIR}/file4.txt") file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/file4") file(CREATE_LINK "${CMAKE_BINARY_DIR}/file4.txt" "${CMAKE_BINARY_DIR}/file4/file4.txt.sym" SYMBOLIC) file(TOUCH "${CMAKE_BINARY_DIR}/file5.txt") file(TOUCH "${CMAKE_BINARY_DIR}/file6.txt") file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/file6/file6") file(CREATE_LINK file6.txt "${CMAKE_BINARY_DIR}/file6.txt.sym.1" SYMBOLIC) file(CREATE_LINK ../file6.txt.sym.1 "${CMAKE_BINARY_DIR}/file6/file6.txt.sym.2" SYMBOLIC) file(CREATE_LINK "${CMAKE_BINARY_DIR}/file6/file6.txt.sym.2" "${CMAKE_BINARY_DIR}/file6/file6/file6.txt.sym.3" SYMBOLIC) file(CREATE_LINK file6.txt.sym.3 "${CMAKE_BINARY_DIR}/file6/file6/file6.txt.sym.4" SYMBOLIC) file(TOUCH "${CMAKE_BINARY_DIR}/file7.txt") file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/file7") file(TOUCH "${CMAKE_BINARY_DIR}/file8.txt") file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/file8") file(CREATE_LINK "${CMAKE_BINARY_DIR}/file8/../file8.txt" "${CMAKE_BINARY_DIR}/file8/file8.txt.sym" SYMBOLIC) file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/file9") file(TOUCH "${CMAKE_BINARY_DIR}/file9/file9.txt") file(CREATE_LINK "${CMAKE_BINARY_DIR}/file9" "${CMAKE_BINARY_DIR}/file9.sym" SYMBOLIC) file(TOUCH "${CMAKE_BINARY_DIR}/file10.txt") file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/file10") file(CREATE_LINK "." "${CMAKE_BINARY_DIR}/file10/file10" SYMBOLIC) file(CREATE_LINK "${CMAKE_BINARY_DIR}/file10/file10/../file10.txt" "${CMAKE_BINARY_DIR}/file10/file10.txt.sym" SYMBOLIC) file(INSTALL "${CMAKE_BINARY_DIR}/file1.txt.sym" DESTINATION "${CMAKE_BINARY_DIR}/dest1" FOLLOW_SYMLINK_CHAIN ) file(INSTALL "${CMAKE_BINARY_DIR}/file1.txt.sym" "${CMAKE_BINARY_DIR}/file2/file2.txt.sym" "${CMAKE_BINARY_DIR}/file3.txt.sym" "${CMAKE_BINARY_DIR}/file4/file4.txt.sym" "${CMAKE_BINARY_DIR}/file5.txt" "${CMAKE_BINARY_DIR}/file6/file6/file6.txt.sym.4" "${CMAKE_BINARY_DIR}/file8/file8.txt.sym" "${CMAKE_BINARY_DIR}/file7/../file7.txt" "${CMAKE_BINARY_DIR}/file8.txt" "${CMAKE_BINARY_DIR}/file9.sym/file9.txt" "${CMAKE_BINARY_DIR}/file10/file10/file10.txt.sym" DESTINATION "${CMAKE_BINARY_DIR}/dest2" FOLLOW_SYMLINK_CHAIN ) set(resolved_file1.txt.sym file1.txt) set(resolved_file10.txt.sym file10.txt) set(resolved_file2.txt.sym file2.txt) set(resolved_file3.txt.sym file3.txt) set(resolved_file4.txt.sym file4.txt) set(resolved_file6.txt.sym.1 file6.txt) set(resolved_file6.txt.sym.2 file6.txt.sym.1) set(resolved_file6.txt.sym.3 file6.txt.sym.2) set(resolved_file6.txt.sym.4 file6.txt.sym.3) set(resolved_file8.txt.sym file8.txt) set(syms) foreach(f file1.txt file1.txt.sym file10.txt file10.txt.sym file2.txt file2.txt.sym file3.txt file3.txt.sym file4.txt file4.txt.sym file5.txt file6.txt file6.txt.sym.1 file6.txt.sym.2 file6.txt.sym.3 file6.txt.sym.4 file7.txt file8.txt file8.txt.sym file9.txt ) string(REPLACE "." "\\." r "${f}") list(APPEND syms "[^;]*/Tests/RunCMake/file/INSTALL-FOLLOW_SYMLINK_CHAIN-build/dest2/${r}") set(filename "${CMAKE_BINARY_DIR}/dest2/${f}") if(DEFINED resolved_${f}) file(READ_SYMLINK "${filename}" resolved) if(NOT resolved STREQUAL "${resolved_${f}}") message(SEND_ERROR "Expected symlink resolution for ${f}: ${resolved_${f}}\nActual resolution: ${resolved}") endif() elseif(NOT EXISTS "${filename}" OR IS_SYMLINK "${filename}" OR IS_DIRECTORY "${filename}") message(SEND_ERROR "${f} should be a regular file") endif() endforeach() file(GLOB_RECURSE actual_syms LIST_DIRECTORIES true "${CMAKE_BINARY_DIR}/dest2/*") if(NOT actual_syms MATCHES "^${syms}$") message(SEND_ERROR "Expected files:\n\n ^${syms}$\n\nActual files:\n\n ${actual_syms}") endif() file(INSTALL "${CMAKE_BINARY_DIR}/file1.txt.sym" "${CMAKE_BINARY_DIR}/file2/file2.txt.sym" "${CMAKE_BINARY_DIR}/file3.txt.sym" "${CMAKE_BINARY_DIR}/file4/file4.txt.sym" "${CMAKE_BINARY_DIR}/file5.txt" "${CMAKE_BINARY_DIR}/file6/file6/file6.txt.sym.4" "${CMAKE_BINARY_DIR}/file8/file8.txt.sym" "${CMAKE_BINARY_DIR}/file7/../file7.txt" "${CMAKE_BINARY_DIR}/file8.txt" "${CMAKE_BINARY_DIR}/file9.sym/file9.txt" "${CMAKE_BINARY_DIR}/file10/file10/file10.txt.sym" DESTINATION "${CMAKE_BINARY_DIR}/dest3" ) set(resolved_file1.txt.sym [[^file1\.txt$]]) set(resolved_file10.txt.sym [[/Tests/RunCMake/file/INSTALL-FOLLOW_SYMLINK_CHAIN-build/file10/file10/\.\./file10\.txt$]]) set(resolved_file2.txt.sym [[^\.\./file2\.txt$]]) set(resolved_file3.txt.sym [[/Tests/RunCMake/file/INSTALL-FOLLOW_SYMLINK_CHAIN-build/file3\.txt$]]) set(resolved_file4.txt.sym [[/Tests/RunCMake/file/INSTALL-FOLLOW_SYMLINK_CHAIN-build/file4\.txt$]]) set(resolved_file6.txt.sym.4 [[^file6\.txt\.sym\.3$]]) set(resolved_file8.txt.sym [[/Tests/RunCMake/file/INSTALL-FOLLOW_SYMLINK_CHAIN-build/file8/\.\./file8\.txt$]]) set(syms) foreach(f file1.txt.sym file10.txt.sym file2.txt.sym file3.txt.sym file4.txt.sym file5.txt file6.txt.sym.4 file7.txt file8.txt file8.txt.sym file9.txt ) string(REPLACE "." "\\." r "${f}") list(APPEND syms "[^;]*/Tests/RunCMake/file/INSTALL-FOLLOW_SYMLINK_CHAIN-build/dest3/${r}") set(filename "${CMAKE_BINARY_DIR}/dest3/${f}") if(DEFINED resolved_${f}) file(READ_SYMLINK "${filename}" resolved) if(NOT resolved MATCHES "${resolved_${f}}") message(SEND_ERROR "Expected symlink resolution for ${f}: ${resolved_${f}}\nActual resolution: ${resolved}") endif() elseif(NOT EXISTS "${filename}" OR IS_SYMLINK "${filename}" OR IS_DIRECTORY "${filename}") message(SEND_ERROR "${f} should be a regular file") endif() endforeach() file(GLOB_RECURSE actual_syms LIST_DIRECTORIES true "${CMAKE_BINARY_DIR}/dest3/*") if(NOT actual_syms MATCHES "^${syms}$") message(SEND_ERROR "Expected files:\n\n ^${syms}$\n\nActual files:\n\n ${actual_syms}") endif()