@@ -35,7 +35,7 @@ endif()
3535#--------------------------------------------------------------
3636
3737project (HydroChrono
38- VERSION 0.2.5
38+ VERSION 0.2.6
3939 DESCRIPTION "A hydrodynamic library for use with Project Chrono."
4040 LANGUAGES CXX
4141)
@@ -59,6 +59,7 @@ option (HYDROCHRONO_ENABLE_IRRLICHT "Enable irrlicht visualization library" ON)
5959option (HYDROCHRONO_ENABLE_DEMOS "Enable demo executables" ON )
6060option (HYDROCHRONO_ENABLE_USER_DOC "User's documentation" OFF )
6161option (HYDROCHRONO_ENABLE_PROG_DOC "Programmer's documentation" OFF )
62+ option (HYDROCHRONO_ENABLE_LOGGING "Enable debug logging" OFF )
6263
6364
6465# find required packages and libraries to make HydroChrono library
@@ -74,8 +75,44 @@ else(HYDROCHRONO_ENABLE_IRRLICHT)
7475endif (HYDROCHRONO_ENABLE_IRRLICHT )
7576
7677set (HDF5_USE_STATIC_LIBRARIES ON )
78+
79+ # Configure HDF5 to find its dependencies from its installation
80+ set (HDF5_ROOT "${HDF5_ROOT} " CACHE PATH "HDF5 root directory" )
81+
7782find_package (HDF5 REQUIRED COMPONENTS CXX )
7883
84+ # ---- Eigen: support both CONFIG and module modes ----
85+ find_package (Eigen3 QUIET CONFIG )
86+ if (NOT Eigen3_FOUND)
87+ find_package (Eigen3 REQUIRED ) # module mode -> EIGEN3_INCLUDE_DIR
88+ endif ()
89+
90+ # ---- Chrono include path: prefer imported target; fall back to vars; fall back to build tree ----
91+ set (HC_CHRONO_INCLUDE_DIRS "" )
92+
93+ # Prefer INTERFACE includes from an imported target, if provided
94+ if (TARGET Chrono::Chrono_core)
95+ get_target_property (HC_CHRONO_INCLUDE_DIRS Chrono::Chrono_core INTERFACE_INCLUDE_DIRECTORIES )
96+ endif ()
97+
98+ # Fallback to legacy variable if the package sets it
99+ if (NOT HC_CHRONO_INCLUDE_DIRS AND DEFINED CHRONO_INCLUDE_DIRS)
100+ set (HC_CHRONO_INCLUDE_DIRS ${CHRONO_INCLUDE_DIRS} )
101+ endif ()
102+
103+ # Derive from Chrono_DIR when using Chrono from a build tree (headers live under <chrono_root>/src)
104+ if (NOT HC_CHRONO_INCLUDE_DIRS AND DEFINED Chrono_DIR)
105+ get_filename_component (_CHR_CMAKE_DIR "${Chrono_DIR} " ABSOLUTE ) # .../chrono/build/cmake
106+ get_filename_component (_CHR_BUILD_DIR "${_CHR_CMAKE_DIR} " DIRECTORY )# .../chrono/build
107+ get_filename_component (_CHR_ROOT "${_CHR_BUILD_DIR} " DIRECTORY )# .../chrono
108+ set (_CHR_INC_CAND "${_CHR_ROOT} /src" )
109+ if (EXISTS "${_CHR_INC_CAND} /chrono/core/ChMatrix.h" )
110+ set (HC_CHRONO_INCLUDE_DIRS "${_CHR_INC_CAND} " )
111+ endif ()
112+ endif ()
113+
114+
115+
79116
80117#-----------------------------------------------------------------------------
81118# Fix for VS 2017 15.8 and newer to handle alignment specification with Eigen
@@ -101,6 +138,27 @@ if(MSVC)
101138 add_compile_options (/wd4251 ) # class needs to have dll-interface
102139endif ()
103140
141+ # --------------------------------------------------
142+ # Global output directory structure
143+ # --------------------------------------------------
144+ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /bin)
145+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /bin)
146+ set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /lib)
147+
148+ # Replicate for multi-config generators (e.g. Visual Studio, Xcode, Ninja Multi-Config)
149+ if (CMAKE_CONFIGURATION_TYPES )
150+ foreach (cfg ${CMAKE_CONFIGURATION_TYPES} )
151+ string (TOUPPER "${cfg} " cfg_uc)
152+ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_${cfg_uc} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} )
153+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_${cfg_uc} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} )
154+ set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${cfg_uc} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} )
155+ endforeach ()
156+ endif ()
157+
158+ # Category-specific output folders
159+ set (HYDROCHRONO_DEMO_OUTPUT_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /demos CACHE PATH "Output directory for demo executables" )
160+ set (HYDROCHRONO_TEST_OUTPUT_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /tests CACHE PATH "Output directory for test executables" )
161+
104162# =======================
105163# HydroChrono Library
106164# =======================
@@ -111,33 +169,46 @@ set(HYDROCHRONO_SOURCES
111169 src/hydro_forces.cpp
112170 src/helper.cpp
113171 src/wave_types.cpp
172+ src/logging.cpp
114173
115174)
116175
117176add_library (HydroChrono STATIC ${HYDROCHRONO_SOURCES} )
118177
119178target_compile_features (HydroChrono PUBLIC cxx_std_17 )
120179
121- target_include_directories (
122- HydroChrono
123-
124- PUBLIC
125- $<BUILD_INTERFACE :${PROJECT_SOURCE_DIR} /include >
126- $<INSTALL_INTERFACE :include >
127- ${CHRONO_INCLUDE_DIRS}
128-
129- PRIVATE
130- ${CMAKE_CURRENT_SOURCE_DIR} /
131- ${CMAKE_CURRENT_SOURCE_DIR} /include
132- ${HDF5_INCLUDE_DIRS}
180+ # target_include_directories(
181+ # HydroChrono
182+
183+ # PUBLIC
184+ # $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
185+ # $<INSTALL_INTERFACE:include>
186+ # ${CHRONO_INCLUDE_DIRS}
187+
188+ # PRIVATE
189+ # ${CMAKE_CURRENT_SOURCE_DIR}/
190+ # ${CMAKE_CURRENT_SOURCE_DIR}/include
191+ # ${HDF5_INCLUDE_DIRS}
192+ # )
193+
194+ target_include_directories (HydroChrono
195+ PUBLIC
196+ $<BUILD_INTERFACE :${PROJECT_SOURCE_DIR} /include >
197+ $<INSTALL_INTERFACE :include >
198+ ${HC_CHRONO_INCLUDE_DIRS} # <— ensures chrono/ headers are visible
199+ PRIVATE
200+ ${CMAKE_CURRENT_SOURCE_DIR}
201+ ${CMAKE_CURRENT_SOURCE_DIR} /include
202+ ${HDF5_INCLUDE_DIRS}
133203)
134204
135205target_compile_definitions (HydroChrono
136-
137206 PUBLIC
138207 CHRONO_DATA_DIR= \"${CHRONO_DATA_DIR} \"
208+ HYDROCHRONO_VERSION=\" ${PROJECT_VERSION} \"
209+ HYDROCHRONO_BUILD_TYPE=\" $<IF :$<CONFIG :Debug >,Debug ,$<IF :$<CONFIG :Release >,Release ,$<IF :$<CONFIG :RelWithDebInfo >,RelWithDebInfo ,$<IF :$<CONFIG :MinSizeRel >,MinSizeRel ,Unknown >>>>\"
139210 PRIVATE
140-
211+ $<$< BOOL : ${HYDROCHRONO_ENABLE_LOGGING} >: HYDROCHRONO_ENABLE_LOGGING =1>
141212)
142213
143214target_compile_options(HydroChrono BEFORE
@@ -155,14 +226,19 @@ set_target_properties(HydroChrono
155226 POSITION_INDEPENDENT_CODE ON
156227)
157228
158- target_link_libraries(HydroChrono
159- PUBLIC
160- ${CHRONO_LIBRARIES}
161- PRIVATE
162- ${HDF5_LIBRARIES}
163-
229+ target_link_libraries(HydroChrono
230+ PUBLIC
231+ ${CHRONO_TARGETS} # Chrono::Chrono_core;Chrono::Chrono_irrlicht;...
232+ $<$< TARGET_EXISTS : Eigen3 :: Eigen >: Eigen3 :: Eigen >
233+ PRIVATE
234+ ${HDF5_LIBRARIES}
164235)
165236
237+ # If Eigen is module-mode (no imported target), include its dir
238+ if (NOT TARGET Eigen3::Eigen AND DEFINED EIGEN3_INCLUDE_DIR)
239+ target_include_directories(HydroChrono PUBLIC ${EIGEN3_INCLUDE_DIR} )
240+ endif()
241+
166242# ====================
167243# Irrlicht GUI helper
168244# ====================
@@ -179,13 +255,11 @@ target_sources(
179255target_compile_features(HydroChronoGUI PUBLIC cxx_std_17)
180256
181257
182- target_include_directories(
183- HydroChronoGUI
184-
185- PUBLIC
186- $<BUILD_INTERFACE :${PROJECT_SOURCE_DIR} /include >
187- $<INSTALL_INTERFACE :include >
188- ${CHRONO_INCLUDE_DIRS}
258+ target_include_directories(HydroChronoGUI
259+ PUBLIC
260+ $<BUILD_INTERFACE :${PROJECT_SOURCE_DIR} /include >
261+ $<INSTALL_INTERFACE :include >
262+ ${HC_CHRONO_INCLUDE_DIRS}
189263)
190264
191265target_compile_options(HydroChronoGUI BEFORE
@@ -199,10 +273,15 @@ target_link_options(HydroChronoGUI BEFORE
199273)
200274
201275target_link_libraries(HydroChronoGUI
202- PRIVATE
203- ${CHRONO_LIBRARIES}
276+ PUBLIC
277+ ${CHRONO_TARGETS}
278+ $<$<TARGET_EXISTS :Eigen3 ::Eigen >:Eigen3 ::Eigen >
204279)
205280
281+ if (NOT TARGET Eigen3::Eigen AND DEFINED EIGEN3_INCLUDE_DIR)
282+ target_include_directories(HydroChronoGUI PUBLIC ${EIGEN3_INCLUDE_DIR} )
283+ endif()
284+
206285
207286
208287# ====================
@@ -227,8 +306,13 @@ if(HYDROCHRONO_ENABLE_TESTS)
227306
228307 include(CTest)
229308 enable_testing()
309+
310+ set(CHRONO_DLL_DIR " ${Chrono_DIR} /../bin/Release ")
311+ set(IRRLICHT_DLL_DIR " C:/libs/irrlicht-1.8.4/bin/Win64-VisualStudio ")
312+ set(TEST_ENVIRONMENT " PATH =${CHRONO_DLL_DIR};${IRRLICHT_DLL_DIR};$ENV{PATH} ")
230313
231314 add_subdirectory(tests)
315+ add_subdirectory(tests/regression)
232316
233317endif(HYDROCHRONO_ENABLE_TESTS)
234318
@@ -280,3 +364,6 @@ export(
280364 FILE " ${CMAKE_CURRENT_BINARY_DIR} /cmake/HydroChronoTargets.cmake "
281365 NAMESPACE HydroChrono::
282366)
367+
368+ # Set build type to Release but enable debug symbols
369+ set(CMAKE_CXX_FLAGS_RELEASE " ${CMAKE_CXX_FLAGS_RELEASE} /Zi /O2 ")
0 commit comments