From 756a8d716ab374e37a504aeac85913b36702771d Mon Sep 17 00:00:00 2001 From: Silvio Date: Sat, 7 Dec 2024 16:01:45 +0100 Subject: [PATCH 1/5] Reduce cmake test boilerplate All instances of mujoco_test in the code base were followed by a call to target_link_libraries( fixture gmock). As anyhow mujoco_test already was calling target_link_libraries to some predefined list of targets (mujoco and gtest_main), this PR adds to the list of default linked targets also fixture and gmock, to reduce the boilerplate. Furthermore, to completly remove the need for calling target_link_libraries after a call to mujoco_test, this PR also add to the mujoco_test macro the ADDITIONAL_LINK_LIBRARIES argument, that can be used if a given test needs to link some additional targets beside the default ones. To permit to use these new features also for mujoco benchmarks, this PR adds a MAIN_TARGET parameter to mujoco_test, to select if gtest_main or another target is used to provide the main entry point to the test executable. --- test/CMakeLists.txt | 30 ++++++++-- test/benchmark/CMakeLists.txt | 83 +++++++-------------------- test/engine/CMakeLists.txt | 43 ++------------ test/plugin/actuator/CMakeLists.txt | 5 +- test/plugin/elasticity/CMakeLists.txt | 1 - test/plugin/sensor/CMakeLists.txt | 1 - test/thread/CMakeLists.txt | 2 - test/user/CMakeLists.txt | 19 +----- test/xml/CMakeLists.txt | 10 +--- 9 files changed, 59 insertions(+), 135 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 122760a962..0f92803d6c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -17,10 +17,22 @@ set(MUJOCO_TEST_WORKING_DIR ${CMAKE_CURRENT_SOURCE_DIR}) include(GoogleTest) +# This macro is used to add a C++ test to MuJoCo CMake build system +# +# The CMake targets linked by default with target_link_libraries are: +# mujoco fixture gmock +# +# The macro supports the following parameters: +# * PROPERTIES: multiple value parameter, its value is set as test properties +# via the set_tests_properties( PROPERTIES ) function +# * ADDITIONAL_LINK_LIBRARIES: multiple value parameter, additional libraries linked +# to the test via target_link_libraries +# * MAIN_TARGET: single value parameter, used to specify the target linked to the tests +# that define the main entry poiny. If not indicated, gest_main is used macro(mujoco_test name) set(options) - set(oneValueArgs) - set(multiValueArgs PROPERTIES) + set(oneValueArgs MAIN_TARGET) + set(multiValueArgs PROPERTIES ADDITIONAL_LINK_LIBRARIES) cmake_parse_arguments( _ARGS "${options}" @@ -30,7 +42,15 @@ macro(mujoco_test name) ) add_executable(${name} ${name}.cc) - target_link_libraries(${name} gtest_main mujoco) + target_link_libraries(${name} mujoco fixture gmock) + if(_ARGS_MAIN_TARGET) + target_link_libraries(${name} ${_ARGS_MAIN_TARGET}) + else() + target_link_libraries(${name} gtest_main) + endif() + if(_ARGS_ADDITIONAL_LINK_LIBRARIES) + target_link_libraries(${name} ${_ARGS_ADDITIONAL_LINK_LIBRARIES}) + endif() target_include_directories(${name} PRIVATE ${MUJOCO_TEST_INCLUDE}) set_target_properties(${name} PROPERTIES BUILD_RPATH ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) # gtest_discover_tests is recommended over gtest_add_tests, but has some issues in Windows. @@ -48,6 +68,7 @@ macro(mujoco_test name) if(_ARGS_PROPERTIES) set_tests_properties(${testList} PROPERTIES ${_ARGS_PROPERTIES}) endif() + endmacro() add_library(fixture STATIC fixture.h fixture.cc) @@ -67,13 +88,10 @@ target_link_libraries( target_include_directories(fixture PRIVATE ${mujoco_SOURCE_DIR}/include gmock) mujoco_test(fixture_test) -target_link_libraries(fixture_test fixture gmock) mujoco_test(header_test) -target_link_libraries(header_test fixture gmock) mujoco_test(pipeline_test) -target_link_libraries(pipeline_test fixture gmock) add_subdirectory(benchmark) add_subdirectory(engine) diff --git a/test/benchmark/CMakeLists.txt b/test/benchmark/CMakeLists.txt index dea826ffdc..658e063972 100644 --- a/test/benchmark/CMakeLists.txt +++ b/test/benchmark/CMakeLists.txt @@ -12,86 +12,45 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Macro for benchmarks that don't use GL (same as mujoco_api_test, but uses -# benchmark::benchmark_main). -macro(mujoco_benchmark_test name) - add_executable(${name} ${name}.cc) - target_link_libraries( - ${name} - benchmark::benchmark_main - mujoco - absl::core_headers - ) - target_include_directories(${name} PRIVATE ${MUJOCO_TEST_INCLUDE}) - # TODO(fraromano) Check RPATH settings - set_target_properties(${name} PROPERTIES BUILD_RPATH ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) - # gtest_discover_tests is recommended over gtest_add_tests, but has some issues in Windows. - gtest_add_tests( - TARGET ${name} - SOURCES ${name}.cc - WORKING_DIRECTORY ${MUJOCO_TEST_WORKING_DIR} - TEST_LIST testList - ) - if(WIN32) - set_tests_properties( - ${testList} PROPERTIES ENVIRONMENT "PATH=$;$ENV{PATH}" - ) - endif() -endmacro() - -mujoco_benchmark_test(ccd_benchmark_test) -target_link_libraries( +mujoco_test( ccd_benchmark_test - fixture - gmock - benchmark::benchmark + MAIN_TARGET benchmark::benchmark_main + ADDITIONAL_LINK_LIBRARIES benchmark::benchmark absl::core_headers ) -mujoco_benchmark_test(step_benchmark_test) -target_link_libraries( +mujoco_test( step_benchmark_test - fixture - gmock - benchmark::benchmark + MAIN_TARGET benchmark::benchmark_main + ADDITIONAL_LINK_LIBRARIES benchmark::benchmark absl::core_headers ) -mujoco_benchmark_test(thread_performance_test) -target_link_libraries( +mujoco_test( thread_performance_test - fixture - gmock - benchmark::benchmark + MAIN_TARGET benchmark::benchmark_main + ADDITIONAL_LINK_LIBRARIES benchmark::benchmark absl::core_headers ) -mujoco_benchmark_test(parse_benchmark_test) -target_link_libraries( +mujoco_test( parse_benchmark_test - fixture - gmock - benchmark::benchmark + MAIN_TARGET benchmark::benchmark_main + ADDITIONAL_LINK_LIBRARIES benchmark::benchmark absl::core_headers ) -mujoco_benchmark_test(engine_util_spatial_benchmark_test) -target_link_libraries( +mujoco_test( engine_util_spatial_benchmark_test - fixture - gmock - benchmark::benchmark + MAIN_TARGET benchmark::benchmark_main + ADDITIONAL_LINK_LIBRARIES benchmark::benchmark absl::core_headers ) -mujoco_benchmark_test(engine_core_smooth_benchmark_test) -target_link_libraries( +mujoco_test( engine_core_smooth_benchmark_test - fixture - gmock - benchmark::benchmark + MAIN_TARGET benchmark::benchmark_main + ADDITIONAL_LINK_LIBRARIES benchmark::benchmark absl::core_headers ) -mujoco_benchmark_test(engine_util_sparse_benchmark_test) -target_link_libraries( +mujoco_test( engine_util_sparse_benchmark_test - fixture - gmock - benchmark::benchmark + MAIN_TARGET benchmark::benchmark_main + ADDITIONAL_LINK_LIBRARIES benchmark::benchmark absl::core_headers ) diff --git a/test/engine/CMakeLists.txt b/test/engine/CMakeLists.txt index b562e585ee..625a0cbf87 100644 --- a/test/engine/CMakeLists.txt +++ b/test/engine/CMakeLists.txt @@ -13,91 +13,59 @@ # limitations under the License. mujoco_test(engine_collision_box_test) -target_link_libraries(engine_collision_box_test fixture gmock) mujoco_test(engine_collision_convex_test) -target_link_libraries(engine_collision_convex_test fixture gmock) mujoco_test(engine_collision_driver_test) -target_link_libraries(engine_collision_driver_test fixture gmock) -mujoco_test(engine_collision_gjk_test) -target_link_libraries(engine_collision_gjk_test fixture gmock ccd) +mujoco_test(engine_collision_gjk_test ADDITIONAL_LINK_LIBRARIES ccd) mujoco_test(engine_core_constraint_test) -target_link_libraries(engine_core_constraint_test fixture gmock) -mujoco_test(engine_core_smooth_test) -target_link_libraries(engine_core_smooth_test fixture gmock absl::span) +mujoco_test(engine_core_smooth_test ADDITIONAL_LINK_LIBRARIES absl::span) mujoco_test(engine_derivative_test) -target_link_libraries(engine_derivative_test fixture gmock) mujoco_test(engine_forward_test) -target_link_libraries(engine_forward_test fixture gmock) mujoco_test(engine_inverse_test) -target_link_libraries(engine_inverse_test fixture gmock) mujoco_test(engine_island_test) -target_link_libraries(engine_island_test fixture gmock) -mujoco_test(engine_io_test) -target_link_libraries( - engine_io_test - fixture - gmock - absl::str_format -) +mujoco_test(engine_io_test ADDITIONAL_LINK_LIBRARIES absl::str_format) mujoco_test( engine_plugin_test + ADDITIONAL_LINK_LIBRARIES + absl::str_format PROPERTIES ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" ) -target_link_libraries( - engine_plugin_test - fixture - gmock - absl::str_format -) mujoco_test(engine_passive_test) -target_link_libraries(engine_passive_test fixture gmock) mujoco_test(engine_print_test) -target_link_libraries(engine_print_test fixture gmock) mujoco_test(engine_ray_test) -target_link_libraries(engine_ray_test fixture gmock) mujoco_test(engine_sensor_test) -target_link_libraries(engine_sensor_test fixture gmock) mujoco_test(engine_solver_test) -target_link_libraries(engine_solver_test fixture gmock) mujoco_test(engine_sort_test) -target_link_libraries(engine_sort_test fixture gmock) mujoco_test(engine_support_test) -target_link_libraries(engine_support_test fixture gmock) mujoco_test(engine_thread_test) -target_link_libraries(engine_thread_test fixture gmock) mujoco_test(engine_util_blas_test) -target_link_libraries(engine_util_blas_test fixture gmock) mujoco_test(engine_util_errmem_test) -target_link_libraries(engine_util_errmem_test fixture gmock) mujoco_test(engine_util_solve_test) -target_link_libraries(engine_util_solve_test fixture gmock) mujoco_test(engine_util_spatial_test) -target_link_libraries(engine_util_spatial_test fixture gmock) mujoco_test( engine_vis_state_test @@ -105,4 +73,3 @@ mujoco_test( ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" ) -target_link_libraries(engine_vis_state_test fixture gmock) diff --git a/test/plugin/actuator/CMakeLists.txt b/test/plugin/actuator/CMakeLists.txt index ac79562522..b8e0f10bf0 100644 --- a/test/plugin/actuator/CMakeLists.txt +++ b/test/plugin/actuator/CMakeLists.txt @@ -14,8 +14,11 @@ mujoco_test( pid_test + ADDITIONAL_LINK_LIBRARIES + absl::cleanup + absl::strings PROPERTIES ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" ) -target_link_libraries(pid_test fixture gmock absl::cleanup absl::strings) +target_link_libraries(pid_test fixture gmock ) diff --git a/test/plugin/elasticity/CMakeLists.txt b/test/plugin/elasticity/CMakeLists.txt index 008ae8be75..93883937c8 100644 --- a/test/plugin/elasticity/CMakeLists.txt +++ b/test/plugin/elasticity/CMakeLists.txt @@ -18,4 +18,3 @@ mujoco_test( ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" ) -target_link_libraries(elasticity_test fixture gmock) diff --git a/test/plugin/sensor/CMakeLists.txt b/test/plugin/sensor/CMakeLists.txt index 4adcba2918..e634d16cc4 100644 --- a/test/plugin/sensor/CMakeLists.txt +++ b/test/plugin/sensor/CMakeLists.txt @@ -18,4 +18,3 @@ mujoco_test( ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" ) -target_link_libraries(sensor_test fixture gmock) diff --git a/test/thread/CMakeLists.txt b/test/thread/CMakeLists.txt index 920bea0d64..ada7b7ef20 100644 --- a/test/thread/CMakeLists.txt +++ b/test/thread/CMakeLists.txt @@ -13,7 +13,5 @@ # limitations under the License. mujoco_test(thread_pool_test) -target_link_libraries(thread_pool_test fixture gmock) mujoco_test(thread_queue_test) -target_link_libraries(thread_queue_test fixture gmock) diff --git a/test/user/CMakeLists.txt b/test/user/CMakeLists.txt index ac4dc7b3c3..c176c3bda2 100644 --- a/test/user/CMakeLists.txt +++ b/test/user/CMakeLists.txt @@ -12,11 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -mujoco_test(user_model_test) -target_link_libraries(user_model_test fixture gmock absl::str_format) +mujoco_test(user_model_test ADDITIONAL_LINK_LIBRARIES absl::str_format) mujoco_test(user_objects_test) -target_link_libraries(user_objects_test fixture gmock) mujoco_test( user_api_test @@ -24,24 +22,13 @@ mujoco_test( ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" ) -target_link_libraries(user_api_test fixture gmock) mujoco_test(user_flex_test) -target_link_libraries(user_flex_test fixture gmock) - -mujoco_test(user_mesh_test) -target_link_libraries( - user_mesh_test - fixture - gmock - absl::str_format -) + +mujoco_test(user_mesh_test ADDITIONAL_LINK_LIBRARIES absl::str_format) mujoco_test(user_composite_test) -target_link_libraries(user_composite_test fixture gmock) mujoco_test(user_resource_test) -target_link_libraries(user_resource_test fixture gmock) mujoco_test(user_vfs_test) -target_link_libraries(user_vfs_test fixture gmock) diff --git a/test/xml/CMakeLists.txt b/test/xml/CMakeLists.txt index 537a991fcb..917531749a 100644 --- a/test/xml/CMakeLists.txt +++ b/test/xml/CMakeLists.txt @@ -13,20 +13,14 @@ # limitations under the License. mujoco_test(xml_api_test) -target_link_libraries(xml_api_test fixture gmock) mujoco_test(xml_native_reader_test) -target_link_libraries(xml_native_reader_test fixture gmock) mujoco_test( xml_native_writer_test + ADDITIONAL_LINK_LIBRARIES + absl::flat_hash_set PROPERTIES ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" ) -target_link_libraries( - xml_native_writer_test - fixture - gmock - absl::flat_hash_set -) From 54f0db6af415af5785130bc74ff13ffee3e4c48c Mon Sep 17 00:00:00 2001 From: Silvio Date: Sat, 30 Nov 2024 17:03:31 +0100 Subject: [PATCH 2/5] Add option MUJOCO_USE_SINGLE_PRECISION to enable compilation of MuJoCo with single precision --- CMakeLists.txt | 4 ++++ cmake/MujocoDependencies.cmake | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aaac4e381f..3067819ce3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,7 @@ list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") option(MUJOCO_BUILD_EXAMPLES "Build samples for MuJoCo" ON) option(MUJOCO_BUILD_SIMULATE "Build simulate library for MuJoCo" ON) option(MUJOCO_BUILD_TESTS "Build tests for MuJoCo" ON) +option(MUJOCO_USE_SINGLE_PRECISION "Build MuJoCo using single precision scalars" OFF) option(MUJOCO_TEST_PYTHON_UTIL "Build and test utility libraries for Python bindings" ON) if(APPLE AND (MUJOCO_BUILD_EXAMPLES OR MUJOCO_BUILD_SIMULATE)) @@ -99,6 +100,9 @@ target_compile_definitions(mujoco PRIVATE _GNU_SOURCE CCD_STATIC_DEFINE MUJOCO_D if(MUJOCO_ENABLE_AVX_INTRINSICS) target_compile_definitions(mujoco PUBLIC mjUSEPLATFORMSIMD) endif() +if(MUJOCO_USE_SINGLE_PRECISION) + target_compile_definitions(mujoco PUBLIC mjUSESINGLE) +endif() target_compile_options( mujoco diff --git a/cmake/MujocoDependencies.cmake b/cmake/MujocoDependencies.cmake index 77a52decb6..7dfbb405ba 100644 --- a/cmake/MujocoDependencies.cmake +++ b/cmake/MujocoDependencies.cmake @@ -205,7 +205,12 @@ findorfetch( target_compile_options(SdfLib PRIVATE ${MUJOCO_MACOS_COMPILE_OPTIONS}) target_link_options(SdfLib PRIVATE ${MUJOCO_MACOS_LINK_OPTIONS}) -set(ENABLE_DOUBLE_PRECISION ON) +if(MUJOCO_USE_SINGLE_PRECISION) + set(ENABLE_DOUBLE_PRECISION OFF) +else() + set(ENABLE_DOUBLE_PRECISION ON) +endif() +message(STATUS "======> ENABLE_DOUBLE_PRECISION: ${ENABLE_DOUBLE_PRECISION}") set(CCD_HIDE_ALL_SYMBOLS ON) findorfetch( USE_SYSTEM_PACKAGE From a4be3c983fa462a480d1b55306aa37f8637c6c60 Mon Sep 17 00:00:00 2001 From: Silvio Date: Sat, 30 Nov 2024 17:03:52 +0100 Subject: [PATCH 3/5] Permit compilation of tests with MUJOCO_USE_SINGLE_PRECISION set to ON --- cmake/ShellTests.cmake | 15 ++++++++++++ test/CMakeLists.txt | 22 ++++++++++++----- test/engine/CMakeLists.txt | 34 +++++++++++++++------------ test/plugin/actuator/CMakeLists.txt | 2 +- test/plugin/elasticity/CMakeLists.txt | 2 ++ test/sample/CMakeLists.txt | 2 +- test/user/CMakeLists.txt | 8 +++---- test/xml/CMakeLists.txt | 4 +++- 8 files changed, 61 insertions(+), 28 deletions(-) diff --git a/cmake/ShellTests.cmake b/cmake/ShellTests.cmake index b26b165850..a17fdd2cc1 100644 --- a/cmake/ShellTests.cmake +++ b/cmake/ShellTests.cmake @@ -13,6 +13,21 @@ # limitations under the License. function(add_mujoco_shell_test TEST_NAME TARGET_BINARY) + set(options) + set(oneValueArgs) + set(multiValueArgs TAGS) + cmake_parse_arguments( + _ARGS + "${options}" + "${oneValueArgs}" + "${multiValueArgs}" + ${ARGN} + ) + # If TAGS include nofloat32 and MUJOCO_USE_SINGLE_PRECISION is enabled, + # we do not compile or add the tests + if("nofloat32" IN_LIST _ARGS_TAGS AND MUJOCO_USE_SINGLE_PRECISION) + return() + endif() find_program(BASH_PROGRAM bash) if(BASH_PROGRAM) # Set up the test directory diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0f92803d6c..7858168b7c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -17,22 +17,26 @@ set(MUJOCO_TEST_WORKING_DIR ${CMAKE_CURRENT_SOURCE_DIR}) include(GoogleTest) -# This macro is used to add a C++ test to MuJoCo CMake build system +# This function is used to add a C++ test to MuJoCo CMake build system # # The CMake targets linked by default with target_link_libraries are: # mujoco fixture gmock # -# The macro supports the following parameters: +# This function supports the following parameters: # * PROPERTIES: multiple value parameter, its value is set as test properties # via the set_tests_properties( PROPERTIES ) function # * ADDITIONAL_LINK_LIBRARIES: multiple value parameter, additional libraries linked # to the test via target_link_libraries # * MAIN_TARGET: single value parameter, used to specify the target linked to the tests # that define the main entry poiny. If not indicated, gest_main is used -macro(mujoco_test name) +# * TAGS: multiple value parameter, used to annotate the test if it belongs to a given +# category. The macro supports the following tags: +# * nofloat32: Used to annotate the tests should be skipped if +# MUJOCO_USE_SINGLE_PRECISION option is enabled +function(mujoco_test name) set(options) set(oneValueArgs MAIN_TARGET) - set(multiValueArgs PROPERTIES ADDITIONAL_LINK_LIBRARIES) + set(multiValueArgs PROPERTIES ADDITIONAL_LINK_LIBRARIES TAGS) cmake_parse_arguments( _ARGS "${options}" @@ -41,6 +45,12 @@ macro(mujoco_test name) ${ARGN} ) + # If TAGS include nofloat32 and MUJOCO_USE_SINGLE_PRECISION is enabled, + # we do not compile or add the tests + if("nofloat32" IN_LIST _ARGS_TAGS AND MUJOCO_USE_SINGLE_PRECISION) + return() + endif() + add_executable(${name} ${name}.cc) target_link_libraries(${name} mujoco fixture gmock) if(_ARGS_MAIN_TARGET) @@ -69,7 +79,7 @@ macro(mujoco_test name) set_tests_properties(${testList} PROPERTIES ${_ARGS_PROPERTIES}) endif() -endmacro() +endfunction() add_library(fixture STATIC fixture.h fixture.cc) target_include_directories(fixture PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..) @@ -91,7 +101,7 @@ mujoco_test(fixture_test) mujoco_test(header_test) -mujoco_test(pipeline_test) +mujoco_test(pipeline_test TAGS nofloat32) add_subdirectory(benchmark) add_subdirectory(engine) diff --git a/test/engine/CMakeLists.txt b/test/engine/CMakeLists.txt index 625a0cbf87..8a11d94cf7 100644 --- a/test/engine/CMakeLists.txt +++ b/test/engine/CMakeLists.txt @@ -12,23 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -mujoco_test(engine_collision_box_test) +mujoco_test(engine_collision_box_test TAGS nofloat32) mujoco_test(engine_collision_convex_test) mujoco_test(engine_collision_driver_test) -mujoco_test(engine_collision_gjk_test ADDITIONAL_LINK_LIBRARIES ccd) +mujoco_test(engine_collision_gjk_test ADDITIONAL_LINK_LIBRARIES ccd TAGS nofloat32) -mujoco_test(engine_core_constraint_test) +mujoco_test(engine_core_constraint_test TAGS nofloat32) -mujoco_test(engine_core_smooth_test ADDITIONAL_LINK_LIBRARIES absl::span) +mujoco_test(engine_core_smooth_test ADDITIONAL_LINK_LIBRARIES absl::span TAGS nofloat32) -mujoco_test(engine_derivative_test) +mujoco_test(engine_derivative_test TAGS nofloat32) -mujoco_test(engine_forward_test) +mujoco_test(engine_forward_test TAGS nofloat32) -mujoco_test(engine_inverse_test) +mujoco_test(engine_inverse_test TAGS nofloat32) mujoco_test(engine_island_test) @@ -41,35 +41,39 @@ mujoco_test( PROPERTIES ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" + TAGS + nofloat32 ) -mujoco_test(engine_passive_test) +mujoco_test(engine_passive_test TAGS nofloat32) mujoco_test(engine_print_test) -mujoco_test(engine_ray_test) +mujoco_test(engine_ray_test TAGS nofloat32) -mujoco_test(engine_sensor_test) +mujoco_test(engine_sensor_test TAGS nofloat32) -mujoco_test(engine_solver_test) +mujoco_test(engine_solver_test TAGS nofloat32) mujoco_test(engine_sort_test) -mujoco_test(engine_support_test) +mujoco_test(engine_support_test TAGS nofloat32) mujoco_test(engine_thread_test) -mujoco_test(engine_util_blas_test) +mujoco_test(engine_util_blas_test TAGS nofloat32) mujoco_test(engine_util_errmem_test) -mujoco_test(engine_util_solve_test) +mujoco_test(engine_util_solve_test TAGS nofloat32) -mujoco_test(engine_util_spatial_test) +mujoco_test(engine_util_spatial_test TAGS nofloat32) mujoco_test( engine_vis_state_test PROPERTIES ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" + TAGS + nofloat32 ) diff --git a/test/plugin/actuator/CMakeLists.txt b/test/plugin/actuator/CMakeLists.txt index b8e0f10bf0..6d7505891e 100644 --- a/test/plugin/actuator/CMakeLists.txt +++ b/test/plugin/actuator/CMakeLists.txt @@ -20,5 +20,5 @@ mujoco_test( PROPERTIES ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" + TAGS nofloat32 ) -target_link_libraries(pid_test fixture gmock ) diff --git a/test/plugin/elasticity/CMakeLists.txt b/test/plugin/elasticity/CMakeLists.txt index 93883937c8..1c649585a6 100644 --- a/test/plugin/elasticity/CMakeLists.txt +++ b/test/plugin/elasticity/CMakeLists.txt @@ -17,4 +17,6 @@ mujoco_test( PROPERTIES ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" + TAGS + nofloat32 ) diff --git a/test/sample/CMakeLists.txt b/test/sample/CMakeLists.txt index 0d1061e387..969fedf8e6 100644 --- a/test/sample/CMakeLists.txt +++ b/test/sample/CMakeLists.txt @@ -16,5 +16,5 @@ if(MUJOCO_BUILD_EXAMPLES) include(ShellTests) add_mujoco_shell_test(compile_test compile) - add_mujoco_shell_test(testspeed_test testspeed) + add_mujoco_shell_test(testspeed_test testspeed TAGS nofloat32) endif() diff --git a/test/user/CMakeLists.txt b/test/user/CMakeLists.txt index c176c3bda2..8048834ceb 100644 --- a/test/user/CMakeLists.txt +++ b/test/user/CMakeLists.txt @@ -12,9 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -mujoco_test(user_model_test ADDITIONAL_LINK_LIBRARIES absl::str_format) +mujoco_test(user_model_test ADDITIONAL_LINK_LIBRARIES absl::str_format TAGS nofloat32) -mujoco_test(user_objects_test) +mujoco_test(user_objects_test TAGS nofloat32) mujoco_test( user_api_test @@ -23,9 +23,9 @@ mujoco_test( "MUJOCO_PLUGIN_DIR=$" ) -mujoco_test(user_flex_test) +mujoco_test(user_flex_test TAGS nofloat32) -mujoco_test(user_mesh_test ADDITIONAL_LINK_LIBRARIES absl::str_format) +mujoco_test(user_mesh_test ADDITIONAL_LINK_LIBRARIES absl::str_format TAGS nofloat32) mujoco_test(user_composite_test) diff --git a/test/xml/CMakeLists.txt b/test/xml/CMakeLists.txt index 917531749a..df65bc782c 100644 --- a/test/xml/CMakeLists.txt +++ b/test/xml/CMakeLists.txt @@ -14,7 +14,7 @@ mujoco_test(xml_api_test) -mujoco_test(xml_native_reader_test) +mujoco_test(xml_native_reader_test TAGS nofloat32) mujoco_test( xml_native_writer_test @@ -23,4 +23,6 @@ mujoco_test( PROPERTIES ENVIRONMENT "MUJOCO_PLUGIN_DIR=$" + TAGS + nofloat32 ) From 44884117435fc285f0cf47778e8bdb1652bb4e9b Mon Sep 17 00:00:00 2001 From: Silvio Date: Sat, 7 Dec 2024 17:23:25 +0100 Subject: [PATCH 4/5] Add GitHub Actions jobs to test MUJOCO_USE_SINGLE_PRECISION CMake option --- .github/workflows/build.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b22215b6a2..65ed33b8d3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,6 +32,15 @@ jobs: -DCMAKE_CXX_COMPILER:STRING=g++-12 -DCMAKE_EXE_LINKER_FLAGS:STRING=-Wl,--no-as-needed tmpdir: "/tmp" + - os: ubuntu-22.04 + additional_label: "-gcc-12-single-precision" + cmake_args: >- + -G Ninja + -DCMAKE_C_COMPILER:STRING=gcc-12 + -DCMAKE_CXX_COMPILER:STRING=g++-12 + -DCMAKE_EXE_LINKER_FLAGS:STRING=-Wl,--no-as-needed + -DMUJOCO_USE_SINGLE_PRECISION:BOOL=ON + tmpdir: "/tmp" - os: ubuntu-22.04 additional_label: "-gcc-11" cmake_args: >- @@ -64,6 +73,15 @@ jobs: -DCMAKE_CXX_COMPILER:STRING=clang++-14 -DMUJOCO_HARDEN:BOOL=ON tmpdir: "/tmp" + - os: ubuntu-22.04 + additional_label: "-clang-14-single-precision" + cmake_args: >- + -G Ninja + -DCMAKE_C_COMPILER:STRING=clang-14 + -DCMAKE_CXX_COMPILER:STRING=clang++-14 + -DMUJOCO_HARDEN:BOOL=ON + -DMUJOCO_USE_SINGLE_PRECISION:BOOL=ON + tmpdir: "/tmp" - os: ubuntu-22.04 additional_label: "-clang-13" cmake_args: >- From 20b4ab86c5632efe2715133f295f8ccab283ec9d Mon Sep 17 00:00:00 2001 From: Silvio Date: Sun, 15 Dec 2024 19:05:10 +0100 Subject: [PATCH 5/5] Export mjUSESINGLE definition in mjtnum.h if MUJOCO_USE_SINGLE_PRECISION CMake option is enabled --- CMakeLists.txt | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3067819ce3..e2b2675148 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,13 +63,44 @@ set(MUJOCO_HEADERS include/mujoco/mjsan.h include/mujoco/mjspec.h include/mujoco/mjthread.h - include/mujoco/mjtnum.h include/mujoco/mjui.h include/mujoco/mjvisualize.h include/mujoco/mjxmacro.h include/mujoco/mujoco.h ) +# Depending on the value of MUJOCO_USE_SINGLE_PRECISION, +# we either install the regular include/mujoco/mjtnum.h, +# that defines mjtNum as double, or a patched version +# that defines mjUSESINGLE +if(NOT MUJOCO_USE_SINGLE_PRECISION) + list(APPEND MUJOCO_HEADERS "include/mujoco/mjtnum.h") +else() + # Otherwise, we create a new file ${CMAKE_CURRENT_BINARY_DIR}/include/mujoco/mjtnum.h + # that also contains the code snippet: + # #ifndef mjUSESINGLE + # #define mjUSESINGLE + # #endif + + # Read original include/mujoco/mjtnum.h + file(READ "${CMAKE_CURRENT_SOURCE_DIR}/include/mujoco/mjtnum.h" mjtnum_original_header) + + # Define the point in which we insert the mjUSESINGLE definition, and the definition itself + set(insertion_point "#define MUJOCO_INCLUDE_MJTNUM_H_") + set(directive "\n#ifndef mjUSESINGLE\n#define mjUSESINGLE\n#endif\n") + + # Define the insertion point and the directive to insert + set(insertion_point "#define MUJOCO_INCLUDE_MJTNUM_H_") + set(directive "\n\n// This definition is added by CMake as it was configured with MUJOCO_USE_SINGLE_PRECISION set to ON\n#ifndef mjUSESINGLE\n#define mjUSESINGLE\n#endif\n") + + # Add the definition + string(REPLACE "${insertion_point}" "${insertion_point}${directive}" mjtnum_modified_header "${mjtnum_original_header}") + + # Write the modified header and add to the headers to install + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/include/mujoco/mjtnum.h" "${mjtnum_modified_header}") + list(APPEND MUJOCO_HEADERS "${CMAKE_CURRENT_BINARY_DIR}/include/mujoco/mjtnum.h" ) +endif() + # Add metadata to mujoco.dll when building on Windows. if(WIN32) set(MUJOCO_RESOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/dist/mujoco.rc)