From 4329b47f1dc151f45a8f6d8654065fa127301cc9 Mon Sep 17 00:00:00 2001 From: Timo Sachsenberg Date: Wed, 25 Mar 2026 08:53:25 +0100 Subject: [PATCH] fix: use cmake tar for Arrow extraction on Windows to avoid symlink errors Arrow 23.0.0's archive contains symbolic links (e.g., python/cmake_modules -> ../cpp/cmake_modules). 7-Zip cannot create symlinks on Windows without admin privileges, causing extraction to fail for non-elevated users. Replace 7-Zip with cmake -E tar for Arrow extraction on Windows, which handles symlinks gracefully by copying target content instead of creating actual symlinks. Fixes #177 Co-Authored-By: Claude Opus 4.6 (1M context) --- libraries.cmake/arrow.cmake | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/libraries.cmake/arrow.cmake b/libraries.cmake/arrow.cmake index cd8bb8b..b9767d8 100644 --- a/libraries.cmake/arrow.cmake +++ b/libraries.cmake/arrow.cmake @@ -6,12 +6,34 @@ MACRO( OPENMS_CONTRIB_BUILD_ARROW ) OPENMS_LOGHEADER_LIBRARY("arrow") #extract: (takes very long.. so skip if possible) if(MSVC) - # -snl allows dangerous symlinks (Arrow has symlinks like python/cmake_modules -> ../cpp/cmake_modules) - set(ZIP_ARGS x -y -snld20 -osrc) + # Arrow's archive contains symbolic links (e.g., python/cmake_modules -> ../cpp/cmake_modules). + # 7-Zip cannot create symlinks on Windows without admin privileges (issue #177). + # Use cmake -E tar instead, which handles symlinks gracefully by copying target content. + download_contrib_archive(ARROW) + if(NOT EXISTS ${ARROW_DIR}/CMakeLists.txt) + message(STATUS "Extracting ARROW ..") + file(MAKE_DIRECTORY "${CONTRIB_BIN_SOURCE_DIR}") + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xzf "${PROJECT_BINARY_DIR}/archives/${ARCHIVE_ARROW}" + WORKING_DIRECTORY "${CONTRIB_BIN_SOURCE_DIR}" + OUTPUT_VARIABLE ZIP_OUT + ERROR_VARIABLE ZIP_ERR + RESULT_VARIABLE EXTRACT_SUCCESS + ) + if(NOT EXTRACT_SUCCESS EQUAL 0) + message(STATUS "Extracting ARROW .. failed") + message(STATUS "${ZIP_ERR}") + message(FATAL_ERROR "${ZIP_OUT}") + else() + message(STATUS "Extracting ARROW .. done") + endif() + else() + message(STATUS "Extracting ARROW .. skipped (already exists)") + endif() else() set(ZIP_ARGS xzf) + OPENMS_SMARTEXTRACT(ZIP_ARGS ARCHIVE_ARROW "ARROW" "README") endif() -OPENMS_SMARTEXTRACT(ZIP_ARGS ARCHIVE_ARROW "ARROW" "README") ## Arrow dependencies not built by the contrib (Snappy, zstd, Thrift, xsimd, RapidJSON) ## are fetched and built as bundled dependencies by Arrow's own build system.