From 19f8fcfd24217ec635131027bc6c1903d845df60 Mon Sep 17 00:00:00 2001 From: Tyler Yankee Date: Wed, 15 Apr 2026 16:18:53 -0400 Subject: [PATCH 1/2] Tests/File_Archive: Relax more stderr line matching Much the same flavor as commit 6e638ce109 (Tests/File_Archive: Relax stderr line matching, 2026-04-14, v4.3.2~9^2~1). --- .../argument-validation-compression-level-1-stderr.txt | 2 +- .../argument-validation-compression-level-2-stderr.txt | 2 +- .../File_Archive/argument-validation-threads-stderr.txt | 2 +- .../File_Archive/unsupported-compression-level-stderr.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/RunCMake/File_Archive/argument-validation-compression-level-1-stderr.txt b/Tests/RunCMake/File_Archive/argument-validation-compression-level-1-stderr.txt index 53cd7f59c4..41501a5c4b 100644 --- a/Tests/RunCMake/File_Archive/argument-validation-compression-level-1-stderr.txt +++ b/Tests/RunCMake/File_Archive/argument-validation-compression-level-1-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at compression-level\.cmake:39 \(file\): +^CMake Error at compression-level\.cmake:[0-9]+ \(file\): file compression level 100 for GZip should be in range 0 to 9 Call Stack \(most recent call first\): argument-validation-compression-level-1\.cmake:8 \(check_compression_level\) diff --git a/Tests/RunCMake/File_Archive/argument-validation-compression-level-2-stderr.txt b/Tests/RunCMake/File_Archive/argument-validation-compression-level-2-stderr.txt index 4a8bc0c9e8..d1220122a2 100644 --- a/Tests/RunCMake/File_Archive/argument-validation-compression-level-2-stderr.txt +++ b/Tests/RunCMake/File_Archive/argument-validation-compression-level-2-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at compression-level\.cmake:39 \(file\): +^CMake Error at compression-level\.cmake:[0-9]+ \(file\): file compression level high for GZip should be in range 0 to 9 Call Stack \(most recent call first\): argument-validation-compression-level-2\.cmake:8 \(check_compression_level\) diff --git a/Tests/RunCMake/File_Archive/argument-validation-threads-stderr.txt b/Tests/RunCMake/File_Archive/argument-validation-threads-stderr.txt index efbeb0c1a1..61d38f5978 100644 --- a/Tests/RunCMake/File_Archive/argument-validation-threads-stderr.txt +++ b/Tests/RunCMake/File_Archive/argument-validation-threads-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at threads\.cmake:39 \(file\): +^CMake Error at threads\.cmake:[0-9]+ \(file\): file number of threads -1 should be at least 0 Call Stack \(most recent call first\): argument-validation-threads\.cmake:8 \(check_threads\) diff --git a/Tests/RunCMake/File_Archive/unsupported-compression-level-stderr.txt b/Tests/RunCMake/File_Archive/unsupported-compression-level-stderr.txt index 9c3678d753..b43fc1ff84 100644 --- a/Tests/RunCMake/File_Archive/unsupported-compression-level-stderr.txt +++ b/Tests/RunCMake/File_Archive/unsupported-compression-level-stderr.txt @@ -1,4 +1,4 @@ -CMake Error at compression-level\.cmake:39 \(file\): +CMake Error at compression-level\.cmake:[0-9]+ \(file\): file compression level is not supported for compression "None"\. Provided compression level: 1 Call Stack \(most recent call first\): From 4229667859f7309d13f0694102619ca989c7da34 Mon Sep 17 00:00:00 2001 From: Tyler Yankee Date: Wed, 15 Apr 2026 16:20:31 -0400 Subject: [PATCH 2/2] Tests: Extend symlink-related archive tests to cross-platform Use `cmake -E create_symlink` or `file(CREATE_LINK)` as appropriate instead of `ln -sf` on UNIX only to extend cases of (a) symlinks inside archives and (b) archive extraction to a directory symlink to non-UNIX platforms where either of these modes may be supported. The latter relies on the NEW behavior of CMP0205 as it uses `COPY_ON_ERROR` for platforms where directory symlinks aren't supported. Issue: #27756 --- Tests/RunCMake/CommandLineTar/roundtrip.cmake | 22 ++++++++++++++----- .../File_Archive/compression-level.cmake | 10 +++++++-- Tests/RunCMake/File_Archive/roundtrip.cmake | 22 ++++++++++++++----- Tests/RunCMake/File_Archive/threads.cmake | 10 +++++++-- 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/Tests/RunCMake/CommandLineTar/roundtrip.cmake b/Tests/RunCMake/CommandLineTar/roundtrip.cmake index eeafcdbf1c..53bbbc6bc4 100644 --- a/Tests/RunCMake/CommandLineTar/roundtrip.cmake +++ b/Tests/RunCMake/CommandLineTar/roundtrip.cmake @@ -37,17 +37,29 @@ foreach(file ${CHECK_FILES}) configure_file(${CMAKE_CURRENT_LIST_FILE} ${FULL_COMPRESS_DIR}/${file} COPYONLY) endforeach() -if(UNIX) - execute_process(COMMAND ln -sf f1.txt ${FULL_COMPRESS_DIR}/d1/f2.txt) +# Test a (file) symlink inside the archive on platforms which support it. +execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink f1.txt ${FULL_COMPRESS_DIR}/d1/f2.txt + OUTPUT_VARIABLE create_symlink_stdout + ERROR_VARIABLE create_symlink_stderr + RESULT_VARIABLE create_symlink_result +) +if(create_symlink_result EQUAL 0 AND EXISTS "${FULL_COMPRESS_DIR}/d1/f2.txt") list(APPEND CHECK_FILES "d1/f2.txt") endif() file(REMOVE ${FULL_OUTPUT_NAME}) file(REMOVE_RECURSE ${FULL_DECOMPRESS_DIR}) -if(DESTINATION_SYMLINK AND UNIX) +if(DESTINATION_SYMLINK) + # If specified, test extraction to a directory symlink on platforms which + # support it, but fall back to a plain directory otherwise. + cmake_policy(SET CMP0205 NEW) file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}-dir) - execute_process(COMMAND ln -sf - ${FULL_DECOMPRESS_DIR}-dir ${FULL_DECOMPRESS_DIR}) + file(CREATE_LINK + ${FULL_DECOMPRESS_DIR}-dir ${FULL_DECOMPRESS_DIR} + COPY_ON_ERROR + SYMBOLIC + ) else() file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}) endif() diff --git a/Tests/RunCMake/File_Archive/compression-level.cmake b/Tests/RunCMake/File_Archive/compression-level.cmake index 2f5141df18..4d5a6178ab 100644 --- a/Tests/RunCMake/File_Archive/compression-level.cmake +++ b/Tests/RunCMake/File_Archive/compression-level.cmake @@ -27,8 +27,14 @@ function(check_compression_level COMPRESSION_LEVEL) configure_file(${CMAKE_CURRENT_LIST_FILE} ${FULL_COMPRESS_DIR}/${file} COPYONLY) endforeach() - if(UNIX) - execute_process(COMMAND ln -sf f1.txt ${FULL_COMPRESS_DIR}/d1/f2.txt) + # Test a (file) symlink inside the archive on platforms which support it. + execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink f1.txt ${FULL_COMPRESS_DIR}/d1/f2.txt + OUTPUT_VARIABLE create_symlink_stdout + ERROR_VARIABLE create_symlink_stderr + RESULT_VARIABLE create_symlink_result + ) + if(create_symlink_result EQUAL 0 AND EXISTS "${FULL_COMPRESS_DIR}/d1/f2.txt") list(APPEND CHECK_FILES "d1/f2.txt") endif() diff --git a/Tests/RunCMake/File_Archive/roundtrip.cmake b/Tests/RunCMake/File_Archive/roundtrip.cmake index a2048930de..78a138db94 100644 --- a/Tests/RunCMake/File_Archive/roundtrip.cmake +++ b/Tests/RunCMake/File_Archive/roundtrip.cmake @@ -26,17 +26,29 @@ foreach(file ${CHECK_FILES}) configure_file(${CMAKE_CURRENT_LIST_FILE} ${FULL_COMPRESS_DIR}/${file} COPYONLY) endforeach() -if(UNIX) - execute_process(COMMAND ln -sf f1.txt ${FULL_COMPRESS_DIR}/d1/f2.txt) +# Test a (file) symlink inside the archive on platforms which support it. +execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink f1.txt ${FULL_COMPRESS_DIR}/d1/f2.txt + OUTPUT_VARIABLE create_symlink_stdout + ERROR_VARIABLE create_symlink_stderr + RESULT_VARIABLE create_symlink_result +) +if(create_symlink_result EQUAL 0 AND EXISTS "${FULL_COMPRESS_DIR}/d1/f2.txt") list(APPEND CHECK_FILES "d1/f2.txt") endif() file(REMOVE ${FULL_OUTPUT_NAME}) file(REMOVE_RECURSE ${FULL_DECOMPRESS_DIR}) -if(DESTINATION_SYMLINK AND UNIX) +if(DESTINATION_SYMLINK) + # If specified, test extraction to a directory symlink on platforms which + # support it, but fall back to a plain directory otherwise. + cmake_policy(SET CMP0205 NEW) file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}-dir) - execute_process(COMMAND ln -sf - ${FULL_DECOMPRESS_DIR}-dir ${FULL_DECOMPRESS_DIR}) + file(CREATE_LINK + ${FULL_DECOMPRESS_DIR}-dir ${FULL_DECOMPRESS_DIR} + COPY_ON_ERROR + SYMBOLIC + ) else() file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}) endif() diff --git a/Tests/RunCMake/File_Archive/threads.cmake b/Tests/RunCMake/File_Archive/threads.cmake index 6a44ab77fa..2376e2077d 100644 --- a/Tests/RunCMake/File_Archive/threads.cmake +++ b/Tests/RunCMake/File_Archive/threads.cmake @@ -27,8 +27,14 @@ function(check_threads THREADS) configure_file(${CMAKE_CURRENT_LIST_FILE} ${FULL_COMPRESS_DIR}/${file} COPYONLY) endforeach() - if(UNIX) - execute_process(COMMAND ln -sf f1.txt ${FULL_COMPRESS_DIR}/d1/f2.txt) + # Test a (file) symlink inside the archive on platforms which support it. + execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink f1.txt ${FULL_COMPRESS_DIR}/d1/f2.txt + OUTPUT_VARIABLE create_symlink_stdout + ERROR_VARIABLE create_symlink_stderr + RESULT_VARIABLE create_symlink_result + ) + if(create_symlink_result EQUAL 0 AND EXISTS "${FULL_COMPRESS_DIR}/d1/f2.txt") list(APPEND CHECK_FILES "d1/f2.txt") endif()