Skip to content

Commit d0603e5

Browse files
authored
Merge pull request #70 from dav-og/feature/testing-framework
test(build,docs): integrate testing framework; migrate regression suites; add Windows build script - Introduces regression testing framework and helpers. - Migrates suites: sphere decay, RM3, OSWEC, F3OF DT1/DT2/DT3. - Unifies reference data and comparison scripts; improves test logging. - Adds `quick-build.ps1` and `build-config.example.json`; ignores machine-local `build-config.json`. - Updates README with config-driven Windows build instructions and DLL notes. - CMake: link Chrono/Eigen as imported targets (PUBLIC) and make include discovery robust when `Chrono_DIR` points to a build tree. - Updates `.gitignore`. No known breaking changes.
2 parents d4766c3 + a88d575 commit d0603e5

97 files changed

Lines changed: 1307027 additions & 303 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# IDE Specific
22
.vs/
33
*.launch
4-
*.json
54
.editorconfig
65

76
# Compiled source
@@ -50,3 +49,8 @@ demos/F3OF/f3of/
5049
sandbox/
5150
Testing/Temporary/CTestCostData.txt
5251
Testing/Temporary/LastTest.log
52+
53+
# Test results (ignore all results/ directories)
54+
results/
55+
**/results/
56+
build-config.json

CMakeLists.txt

Lines changed: 117 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ endif()
3535
#--------------------------------------------------------------
3636

3737
project(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)
5959
option (HYDROCHRONO_ENABLE_DEMOS "Enable demo executables" ON)
6060
option (HYDROCHRONO_ENABLE_USER_DOC "User's documentation" OFF)
6161
option (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)
7475
endif(HYDROCHRONO_ENABLE_IRRLICHT)
7576

7677
set(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+
7782
find_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
102139
endif()
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

117176
add_library(HydroChrono STATIC ${HYDROCHRONO_SOURCES} )
118177

119178
target_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

135205
target_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
143214
target_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(
179255
target_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
191265
target_compile_options(HydroChronoGUI BEFORE
@@ -199,10 +273,15 @@ target_link_options(HydroChronoGUI BEFORE
199273
)
200274
201275
target_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
233317
endif(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

Comments
 (0)