From 5a0fcfa54a01fd900061cacc751ad60488290a6f Mon Sep 17 00:00:00 2001 From: Bertrand Bellenot Date: Tue, 8 Apr 2025 14:45:08 +0200 Subject: [PATCH 1/2] [cmake][win] Fix issue #9354 Don't use the $ (Debug, Release, ...) subdirs for gtest --- cmake/modules/RootMacros.cmake | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cmake/modules/RootMacros.cmake b/cmake/modules/RootMacros.cmake index f8f02be27b490..9785b405ddfee 100644 --- a/cmake/modules/RootMacros.cmake +++ b/cmake/modules/RootMacros.cmake @@ -1891,6 +1891,14 @@ function(ROOT_ADD_GTEST test_suite) set(test_exports "/EXPORT:_Init_thread_abort /EXPORT:_Init_thread_epoch \ /EXPORT:_Init_thread_footer /EXPORT:_Init_thread_header /EXPORT:_tls_index") set_property(TARGET ${test_suite} APPEND_STRING PROPERTY LINK_FLAGS ${test_exports}) + if(NOT CMAKE_GENERATOR MATCHES Ninja) + foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) + set_target_properties(${test_suite} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_BINARY_DIR}) + set_target_properties(${test_suite} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_BINARY_DIR}) + set_target_properties(${test_suite} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_BINARY_DIR}) + endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES) + endif() endif() if(ARG_WILLFAIL) From c01fa4ab05ab04d68e58ee14aac6b7ed436e4c08 Mon Sep 17 00:00:00 2001 From: Bertrand Bellenot Date: Wed, 3 Dec 2025 16:10:34 +0100 Subject: [PATCH 2/2] [cmake] change outupt directories for the tests Use `CMAKE_CURRENT_BINARY_DIR` instead of `CMAKE_CURRENT_BINARY_DIR/$` --- cmake/modules/RootMacros.cmake | 65 +++++++++-------------- roottest/root/tree/cloning/CMakeLists.txt | 10 +--- test/CMakeLists.txt | 1 + tree/tree/test/CMakeLists.txt | 6 +-- 4 files changed, 28 insertions(+), 54 deletions(-) diff --git a/cmake/modules/RootMacros.cmake b/cmake/modules/RootMacros.cmake index 7053ee8224318..c5c802bdf18e7 100644 --- a/cmake/modules/RootMacros.cmake +++ b/cmake/modules/RootMacros.cmake @@ -1851,14 +1851,7 @@ function(ROOT_ADD_GTEST test_suite) set(test_exports "/EXPORT:_Init_thread_abort /EXPORT:_Init_thread_epoch \ /EXPORT:_Init_thread_footer /EXPORT:_Init_thread_header /EXPORT:_tls_index") set_property(TARGET ${test_suite} APPEND_STRING PROPERTY LINK_FLAGS ${test_exports}) - if(NOT CMAKE_GENERATOR MATCHES Ninja) - foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) - string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) - set_target_properties(${test_suite} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_BINARY_DIR}) - set_target_properties(${test_suite} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_BINARY_DIR}) - set_target_properties(${test_suite} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_BINARY_DIR}) - endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES) - endif() + ROOT_SET_OUTPUT_DIRECTORIES(${test_suite}) endif() if(ARG_WILLFAIL) @@ -2529,6 +2522,7 @@ macro(ROOTTEST_GENERATE_DICTIONARY dictname) set_target_properties(${targetname_libgen} PROPERTIES ${ROOT_LIBRARY_PROPERTIES}) set_target_properties(${targetname_libgen} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE) + ROOT_SET_OUTPUT_DIRECTORIES(${targetname_libgen}) target_link_libraries(${targetname_libgen} ${ROOT_LIBRARIES}) @@ -2570,16 +2564,6 @@ macro(ROOTTEST_GENERATE_DICTIONARY dictname) FIXTURES_REQUIRED ${ARG_FIXTURES_REQUIRED}) endif() - if(MSVC AND NOT CMAKE_GENERATOR MATCHES Ninja) - add_custom_command(TARGET ${targetname_libgen} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${dictname}_rdict.pcm - ${CMAKE_CURRENT_BINARY_DIR}/$/${dictname}_rdict.pcm - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/$/${dictname}.dll - ${CMAKE_CURRENT_BINARY_DIR}/${dictname}.dll - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/$/${dictname}.lib - ${CMAKE_CURRENT_BINARY_DIR}/${dictname}.lib) - endif() - endmacro(ROOTTEST_GENERATE_DICTIONARY) #------------------------------------------------------------------------------- @@ -2631,6 +2615,7 @@ macro(ROOTTEST_GENERATE_REFLEX_DICTIONARY dictionary) set_target_properties(${targetname_libgen} PROPERTIES ${ROOT_LIBRARY_PROPERTIES} ) set_property(TARGET ${targetname_libgen} PROPERTY BUILD_WITH_INSTALL_RPATH OFF) # will never be installed anyway set_target_properties(${targetname_libgen} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE) + ROOT_SET_OUTPUT_DIRECTORIES(${targetname_libgen}) if(ARG_LIBNAME) set_target_properties(${targetname_libgen} PROPERTIES PREFIX "") @@ -2687,18 +2672,6 @@ macro(ROOTTEST_GENERATE_REFLEX_DICTIONARY dictionary) FIXTURES_REQUIRED ${ARG_FIXTURES_REQUIRED}) endif() - if(MSVC AND NOT CMAKE_GENERATOR MATCHES Ninja) - if(ARG_LIBNAME) - add_custom_command(TARGET ${targetname_libgen} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/$/${ARG_LIBNAME}.dll - ${CMAKE_CURRENT_BINARY_DIR}/${ARG_LIBNAME}.dll) - else() - add_custom_command(TARGET ${targetname_libgen} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/$/lib${dictionary}_dictrflx.dll - ${CMAKE_CURRENT_BINARY_DIR}/lib${dictionary}_dictrflx.dll) - endif() - endif() - endmacro(ROOTTEST_GENERATE_REFLEX_DICTIONARY) #------------------------------------------------------------------------------- @@ -3483,26 +3456,38 @@ function(find_python_module module) set(PY_${module_upper}_FOUND ${PY_${module_upper}_FOUND} PARENT_SCOPE) endfunction() +#--------------------------------------------------------------------------------------------------- +# function ROOT_SET_OUTPUT_DIRECTORIES( ) +# +# this function simply sets the output directories from the standard outupt directory +# (CMAKE_CURRENT_BINARY_DIR/$) to its parent directory (CMAKE_CURRENT_BINARY_DIR) on Windows +# +#--------------------------------------------------------------------------------------------------- +function(ROOT_SET_OUTPUT_DIRECTORIES library) + if(MSVC AND NOT CMAKE_GENERATOR MATCHES Ninja) + foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) + set_target_properties(${library} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_BINARY_DIR}) + set_target_properties(${library} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_BINARY_DIR}) + set_target_properties(${library} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_BINARY_DIR}) + endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES) + endif() +endfunction() + #--------------------------------------------------------------------------------------------------- # function ROOTTEST_LINKER_LIBRARY( source1 source2 ...[TYPE STATIC|SHARED] [DLLEXPORT] # [NOINSTALL] LIBRARIES library1 library2 ... # DEPENDENCIES dep1 dep2 # BUILTINS dep1 dep2) # -# this function simply calls the ROOT function ROOT_LINKER_LIBRARY, and add a POST_BUILD custom -# command to copy the .dll and .lib from the standard config directory (Debug/Release) to its -# parent directory (CMAKE_CURRENT_BINARY_DIR) on Windows +# this function simply calls the ROOT function ROOT_LINKER_LIBRARY, and sets the output directories +# from the standard output directory (CMAKE_CURRENT_BINARY_DIR/$) to its parent directory +# (CMAKE_CURRENT_BINARY_DIR) on Windows # #--------------------------------------------------------------------------------------------------- function(ROOTTEST_LINKER_LIBRARY library) ROOT_LINKER_LIBRARY(${ARGV}) - if(MSVC AND NOT CMAKE_GENERATOR MATCHES Ninja) - add_custom_command(TARGET ${library} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/$/lib${library}.dll - ${CMAKE_CURRENT_BINARY_DIR}/lib${library}.dll - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/$/lib${library}.lib - ${CMAKE_CURRENT_BINARY_DIR}/lib${library}.lib) - endif() + ROOT_SET_OUTPUT_DIRECTORIES(${library}) endfunction() #--------------------------------------------------------------------------------------------------- diff --git a/roottest/root/tree/cloning/CMakeLists.txt b/roottest/root/tree/cloning/CMakeLists.txt index df13d5af97b12..4e53ba8756e81 100644 --- a/roottest/root/tree/cloning/CMakeLists.txt +++ b/roottest/root/tree/cloning/CMakeLists.txt @@ -2,15 +2,7 @@ # FIXME: it will be nice to move roottest-treeformula-event to CMake and add it as dependency # To fix runtime_cxxmodules, we need to use already build artefacts. -if(MSVC) - if(CMAKE_GENERATOR MATCHES Ninja) - set(test_bin_dir "${ROOTSYS}/test") - else() - set(test_bin_dir "${ROOTSYS}/test/$") - endif() -else() - set(test_bin_dir "${CMAKE_BINARY_DIR}/test") -endif() +set(test_bin_dir "${CMAKE_BINARY_DIR}/test") ROOTTEST_ADD_TEST(hsimple-create MACRO ${CMAKE_SOURCE_DIR}/tutorials/hsimple.C diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3a1a683967550..dfedf7febde1d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -65,6 +65,7 @@ if(MSVC AND NOT CMAKE_GENERATOR MATCHES Ninja) endif() endif() ROOT_EXECUTABLE(eventexe MainEvent.cxx LIBRARIES Event RIO Tree TreePlayer Hist Net) +ROOT_SET_OUTPUT_DIRECTORIES(eventexe) ROOT_ADD_TEST(test-event COMMAND eventexe) #---guitest------------------------------------------------------------------------------------ diff --git a/tree/tree/test/CMakeLists.txt b/tree/tree/test/CMakeLists.txt index bac430b124a65..4e903b06daafc 100644 --- a/tree/tree/test/CMakeLists.txt +++ b/tree/tree/test/CMakeLists.txt @@ -9,13 +9,9 @@ ROOT_GENERATE_DICTIONARY(ElementStructDict ElementStruct.h LINKDEF ElementStruct ROOT_ADD_GTEST(testTOffsetGeneration TOffsetGeneration.cxx ElementStruct.cxx ElementStructDict.cxx LIBRARIES RIO Tree MathCore ) -if(MSVC AND NOT CMAKE_GENERATOR MATCHES Ninja) - add_custom_command(TARGET testTOffsetGeneration POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/libElementStructDict_rdict.pcm - ${CMAKE_CURRENT_BINARY_DIR}/$/libElementStructDict_rdict.pcm) -endif() target_include_directories(testTOffsetGeneration PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) ROOT_STANDARD_LIBRARY_PACKAGE(SillyStruct NO_INSTALL_HEADERS HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/SillyStruct.h SOURCES SillyStruct.cxx LINKDEF SillyStructLinkDef.h DEPENDENCIES RIO) +ROOT_SET_OUTPUT_DIRECTORIES(SillyStruct) ROOT_ADD_GTEST(testBulkApi BulkApi.cxx LIBRARIES RIO Tree TreePlayer) #FIXME: tests are having timeout on 32bit CERN VM (in docker container everything is fine), # to be reverted after investigation.