@@ -7,6 +7,8 @@ cmake_minimum_required(VERSION 3.18.2)
77
88# CMP0091: Enable MSVC runtime library selection via CMAKE_MSVC_RUNTIME_LIBRARY
99cmake_policy (SET CMP0091 NEW )
10+ # CMP0074: Use <PackageName>_ROOT variables for find_package()
11+ cmake_policy (SET CMP0074 NEW )
1012
1113# Guard against in-source builds to prevent polluting source directory
1214if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
@@ -86,6 +88,11 @@ include_directories(${CMAKE_BINARY_DIR}/generated)
8688# Add the cmake folder so the FindSphinx module is found
8789set (CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR} /cmake" ${CMAKE_MODULE_PATH} )
8890
91+ # Deterministic dependency discovery (avoid ambient PATH/registry drift)
92+ set (CMAKE_FIND_PACKAGE_PREFER_CONFIG ON )
93+ set (CMAKE_FIND_USE_PACKAGE_REGISTRY OFF )
94+ set (CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH OFF )
95+
8996# Force Release by default so CI builds are optimized and users get good performance
9097if (NOT DEFINED HYDROCHRONO_DEFAULT_BUILD_TYPE)
9198 set (HYDROCHRONO_DEFAULT_BUILD_TYPE "Release" )
@@ -104,9 +111,9 @@ endif()
104111# ═══════════════════════════════════════════════════════════════════════════════
105112
106113option (HYDROCHRONO_ENABLE_TESTS "Enable tests" ON )
107- option (HYDROCHRONO_ENABLE_IRRLICHT "Enable irrlicht visualization library" ON )
108- option (HYDROCHRONO_ENABLE_DEMOS "Enable demo executables" ON )
109- option (HYDROCHRONO_ENABLE_YAML_RUNNER "Enable YAML-based CLI runner" ON )
114+ option (HYDROCHRONO_ENABLE_IRRLICHT "Enable irrlicht visualization library" OFF )
115+ option (HYDROCHRONO_ENABLE_DEMOS "Enable demo executables" OFF )
116+ option (HYDROCHRONO_ENABLE_YAML_RUNNER "Enable YAML-based CLI runner" OFF )
110117option (HYDROCHRONO_ENABLE_USER_DOC "User's documentation" OFF )
111118option (HYDROCHRONO_ENABLE_PROG_DOC "Programmer's documentation" OFF )
112119option (HYDROCHRONO_ENABLE_LOGGING "Enable debug logging" OFF )
@@ -120,6 +127,9 @@ option(HYDROCHRONO_ENABLE_LOGGING "Enable debug logging" OFF)
120127# as the one used to build the Chrono libraries.
121128set (CXX_STANDARD_REQUIRED ON )
122129set (CMAKE_CXX_STANDARD ${CHRONO_CXX_STANDARD} )
130+ if (NOT CMAKE_CXX_STANDARD )
131+ set (CMAKE_CXX_STANDARD 17)
132+ endif ()
123133
124134# Add Chrono's cmake path so its custom FindIrrlicht module is discoverable
125135if (DEFINED Chrono_DIR)
@@ -164,10 +174,20 @@ else()
164174endif ()
165175
166176# ── HDF5 Integration ──
167- # Force static linking to avoid DLL deployment issues
168- set (HDF5_USE_STATIC_LIBRARIES ON )
177+ # Prefer config package at provided root; avoid environment/registry
178+ if (DEFINED HDF5_DIR AND NOT DEFINED HDF5_ROOT)
179+ set (HDF5_ROOT "${HDF5_DIR} " )
180+ endif ()
169181set (HDF5_ROOT "${HDF5_ROOT} " CACHE PATH "HDF5 root directory" )
170- find_package (HDF5 REQUIRED COMPONENTS CXX )
182+ if (DEFINED HDF5_ROOT)
183+ # Prepend so our supplied root wins
184+ if (CMAKE_PREFIX_PATH )
185+ set (CMAKE_PREFIX_PATH "${HDF5_ROOT} ;${CMAKE_PREFIX_PATH} " )
186+ else ()
187+ set (CMAKE_PREFIX_PATH "${HDF5_ROOT} " )
188+ endif ()
189+ endif ()
190+ find_package (HDF5 CONFIG REQUIRED COMPONENTS CXX )
171191
172192# ---- Eigen: support both CONFIG and module modes ----
173193find_package (Eigen3 QUIET CONFIG )
@@ -281,6 +301,13 @@ endfunction()
281301function (configure_test_environment )
282302 # Set up DLL search paths for Windows testing
283303 set (CHRONO_DLL_DIR "${Chrono_DIR} /../bin/Release" )
304+ # Always include our build output bin directories for all common configs
305+ set (HC_BIN_DIRS "${CMAKE_BINARY_DIR} /bin/Release;${CMAKE_BINARY_DIR} /bin/RelWithDebInfo;${CMAKE_BINARY_DIR} /bin/MinSizeRel;${CMAKE_BINARY_DIR} /bin/Debug" )
306+ # Include HDF5 bin if available to stabilize test runtime on clean systems
307+ set (HDF5_DLL_DIR "" )
308+ if (DEFINED HDF5_ROOT AND EXISTS "${HDF5_ROOT} /bin" )
309+ set (HDF5_DLL_DIR "${HDF5_ROOT} /bin" )
310+ endif ()
284311 # Derive Irrlicht DLL dir from Irrlicht_ROOT provided by user config
285312 set (IRRLICHT_DLL_DIR "" )
286313 if (DEFINED Irrlicht_ROOT AND EXISTS "${Irrlicht_ROOT} /bin/Win64-VisualStudio" )
@@ -289,9 +316,17 @@ function(configure_test_environment)
289316 set (IRRLICHT_DLL_DIR "${Irrlicht_ROOT} /bin" )
290317 endif ()
291318 if (IRRLICHT_DLL_DIR)
292- set (TEST_ENVIRONMENT "PATH=${CHRONO_DLL_DIR} ;${IRRLICHT_DLL_DIR} ;$ENV{PATH} " PARENT_SCOPE )
319+ if (HDF5_DLL_DIR)
320+ set (TEST_ENVIRONMENT "PATH=${HC_BIN_DIRS} ;${CHRONO_DLL_DIR} ;${IRRLICHT_DLL_DIR} ;${HDF5_DLL_DIR} ;$ENV{PATH} " PARENT_SCOPE )
321+ else ()
322+ set (TEST_ENVIRONMENT "PATH=${HC_BIN_DIRS} ;${CHRONO_DLL_DIR} ;${IRRLICHT_DLL_DIR} ;$ENV{PATH} " PARENT_SCOPE )
323+ endif ()
293324 else ()
294- set (TEST_ENVIRONMENT "PATH=${CHRONO_DLL_DIR} ;$ENV{PATH} " PARENT_SCOPE )
325+ if (HDF5_DLL_DIR)
326+ set (TEST_ENVIRONMENT "PATH=${HC_BIN_DIRS} ;${CHRONO_DLL_DIR} ;${HDF5_DLL_DIR} ;$ENV{PATH} " PARENT_SCOPE )
327+ else ()
328+ set (TEST_ENVIRONMENT "PATH=${HC_BIN_DIRS} ;${CHRONO_DLL_DIR} ;$ENV{PATH} " PARENT_SCOPE )
329+ endif ()
295330 endif ()
296331endfunction ()
297332
@@ -316,9 +351,61 @@ set(HYDROCHRONO_SOURCES
316351add_library (HydroChrono ${HYDROCHRONO_SOURCES} )
317352configure_hydro_target (HydroChrono )
318353
319- # Add HDF5 as private dependency (don't expose to users)
320- target_include_directories (HydroChrono PRIVATE ${HDF5_INCLUDE_DIRS} )
321- target_link_libraries (HydroChrono PRIVATE ${HDF5_LIBRARIES} )
354+ # Add HDF5 as private dependency via imported targets (headers/flags propagate)
355+ set (HC_HDF5_TARGETS)
356+ if (TARGET HDF5::HDF5_CXX)
357+ list (APPEND HC_HDF5_TARGETS HDF5::HDF5_CXX)
358+ endif ()
359+ if (TARGET HDF5::HDF5)
360+ list (APPEND HC_HDF5_TARGETS HDF5::HDF5)
361+ endif ()
362+ if (TARGET hdf5::hdf5_cpp)
363+ list (APPEND HC_HDF5_TARGETS hdf5::hdf5_cpp)
364+ endif ()
365+ if (TARGET hdf5::hdf5)
366+ list (APPEND HC_HDF5_TARGETS hdf5::hdf5)
367+ endif ()
368+ if (TARGET hdf5::hdf5_cpp-shared)
369+ list (APPEND HC_HDF5_TARGETS hdf5::hdf5_cpp-shared)
370+ endif ()
371+ if (TARGET hdf5::hdf5-shared)
372+ list (APPEND HC_HDF5_TARGETS hdf5::hdf5-shared)
373+ endif ()
374+ if (HC_HDF5_TARGETS)
375+ # PUBLIC so static library link dependencies propagate to executables
376+ target_link_libraries (HydroChrono PUBLIC ${HC_HDF5_TARGETS} )
377+ else ()
378+ # Module-mode fallback variables (older FindHDF5)
379+ if (DEFINED HDF5_CXX_LIBRARIES OR DEFINED HDF5_LIBRARIES)
380+ target_link_libraries (HydroChrono PUBLIC ${HDF5_CXX_LIBRARIES} ${HDF5_LIBRARIES} )
381+ endif ()
382+ endif ()
383+
384+ # Fallback: some HDF5 packages set HDF5_INCLUDE_DIRS instead of INTERFACE includes
385+ if (DEFINED HDF5_INCLUDE_DIRS)
386+ target_include_directories (HydroChrono PRIVATE ${HDF5_INCLUDE_DIRS} )
387+ elseif (DEFINED HDF5_INCLUDE_DIR)
388+ target_include_directories (HydroChrono PRIVATE ${HDF5_INCLUDE_DIR} )
389+ elseif (DEFINED HDF5_CXX_INCLUDE_DIR)
390+ target_include_directories (HydroChrono PRIVATE ${HDF5_CXX_INCLUDE_DIR} )
391+ else ()
392+ # Try to derive includes from imported target if available
393+ if (TARGET HDF5::HDF5_CXX)
394+ get_target_property (_H5_INCS HDF5::HDF5_CXX INTERFACE_INCLUDE_DIRECTORIES )
395+ if (_H5_INCS)
396+ target_include_directories (HydroChrono PRIVATE ${_H5_INCS} )
397+ endif ()
398+ elseif (TARGET hdf5::hdf5_cpp)
399+ get_target_property (_H5_INCS hdf5::hdf5_cpp INTERFACE_INCLUDE_DIRECTORIES )
400+ if (_H5_INCS)
401+ target_include_directories (HydroChrono PRIVATE ${_H5_INCS} )
402+ endif ()
403+ endif ()
404+ # Last-resort fallback: include from HDF5_ROOT/include if it contains H5Cpp.h
405+ if (NOT _H5_INCS AND DEFINED HDF5_ROOT AND EXISTS "${HDF5_ROOT} /include/H5Cpp.h" )
406+ target_include_directories (HydroChrono PRIVATE "${HDF5_ROOT} /include" )
407+ endif ()
408+ endif ()
322409target_compile_features (HydroChrono PUBLIC cxx_std_17 )
323410
324411# target_include_directories(
@@ -343,7 +430,6 @@ target_include_directories(HydroChrono
343430 PRIVATE
344431 ${CMAKE_CURRENT_SOURCE_DIR}
345432 ${CMAKE_CURRENT_SOURCE_DIR} /include
346- ${HDF5_INCLUDE_DIRS}
347433)
348434
349435# Library-specific compile definitions
@@ -374,6 +460,13 @@ if(HYDROCHRONO_ENABLE_YAML_RUNNER)
374460 PRIVATE HydroChrono HydroChronoGUI Chrono::Chrono_parsers
375461 )
376462
463+ # Safety net: if HDF5 was not propagated, link executable explicitly as well
464+ if (HC_HDF5_TARGETS)
465+ target_link_libraries (run_hydrochrono PRIVATE ${HC_HDF5_TARGETS} )
466+ elseif (DEFINED HDF5_CXX_LIBRARIES OR DEFINED HDF5_LIBRARIES)
467+ target_link_libraries (run_hydrochrono PRIVATE ${HDF5_CXX_LIBRARIES} ${HDF5_LIBRARIES} )
468+ endif ()
469+
377470 target_include_directories (run_hydrochrono
378471 PRIVATE
379472 ${PROJECT_SOURCE_DIR} /include
@@ -395,8 +488,6 @@ target_link_libraries(HydroChrono
395488 PUBLIC
396489 ${CHRONO_TARGETS} # Chrono::Chrono_core;Chrono::Chrono_irrlicht;...
397490 $<$<TARGET_EXISTS :Eigen3 ::Eigen >:Eigen3 ::Eigen >
398- PRIVATE
399- ${HDF5_LIBRARIES}
400491)
401492
402493# If Eigen is module-mode (no imported target), include its dir
@@ -582,6 +673,28 @@ install(FILES
582673 "${CMAKE_BINARY_DIR} /bin/Debug/yaml-cpp.dll"
583674 DESTINATION bin COMPONENT runtime OPTIONAL )
584675
676+ # HDF5 runtime DLLs (prefer imported targets, fallback to bin under HDF5_ROOT)
677+ set (HDF5_DLLS)
678+ foreach (tgt IN ITEMS HDF5::HDF5 HDF5::HDF5_CXX hdf5::hdf5 hdf5::hdf5_cpp hdf5::hdf5-shared hdf5::hdf5_cpp-shared)
679+ if (TARGET ${tgt} )
680+ list (APPEND HDF5_DLLS "$<TARGET_FILE :${tgt} >" )
681+ endif ()
682+ endforeach ()
683+ if (HDF5_DLLS)
684+ install (FILES ${HDF5_DLLS} DESTINATION bin COMPONENT runtime )
685+ else ()
686+ if (DEFINED HDF5_ROOT)
687+ install (CODE "
688+ file(GLOB _H5_DLLS \" ${HDF5_ROOT} /bin/*.dll\" )
689+ foreach(_f IN LISTS _H5_DLLS)
690+ if(EXISTS \" ${_f} \" )
691+ file(INSTALL DESTINATION \" ${CMAKE_INSTALL_PREFIX} /bin\" TYPE FILE FILES \" ${_f} \" )
692+ endif()
693+ endforeach()
694+ " )
695+ endif ()
696+ endif ()
697+
585698# Fallback: copy all Chrono-built DLLs for the active config into bin
586699install (CODE "
587700 file(GLOB _ALL_DLLS \" ${Chrono_DIR} /../bin/${CMAKE_INSTALL_CONFIG_NAME} /*.dll\" )
0 commit comments