# Copyright 2021 DeepMind Technologies Limited # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. cmake_minimum_required(VERSION 3.16) # Make CMAKE_C_VISIBILITY_PRESET work properly. set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) # INTERPROCEDURAL_OPTIMIZATION is enforced when enabled. set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) # Default to GLVND if available. set(CMAKE_POLICY_DEFAULT_CMP0072 NEW) # Avoid BUILD_SHARED_LIBS getting overridden by an option() in ccd. set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) # This line has to appear before 'PROJECT' in order to be able to disable incremental linking set(MSVC_INCREMENTAL_DEFAULT ON) project( mujoco VERSION 3.2.7 DESCRIPTION "MuJoCo Physics Simulator" HOMEPAGE_URL "https://mujoco.org" ) enable_language(C) enable_language(CXX) 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_TEST_PYTHON_UTIL "Build and test utility libraries for Python bindings" ON) if(APPLE AND (MUJOCO_BUILD_EXAMPLES OR MUJOCO_BUILD_SIMULATE)) enable_language(OBJC) enable_language(OBJCXX) endif() include(MujocoOptions) include(MujocoMacOS) include(MujocoDependencies) set(MUJOCO_HEADERS include/mujoco/mjdata.h include/mujoco/mjexport.h include/mujoco/mjmacro.h include/mujoco/mjmodel.h include/mujoco/mjplugin.h include/mujoco/mjrender.h 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 ) # Add metadata to mujoco.dll when building on Windows. if(WIN32) set(MUJOCO_RESOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/dist/mujoco.rc) else() set(MUJOCO_RESOURCE_FILES "") endif() add_library(mujoco SHARED ${MUJOCO_RESOURCE_FILES}) target_include_directories( mujoco PUBLIC $ $ PRIVATE src ) add_subdirectory(plugin/elasticity) add_subdirectory(plugin/actuator) add_subdirectory(plugin/sensor) add_subdirectory(plugin/sdf) add_subdirectory(src/engine) add_subdirectory(src/user) add_subdirectory(src/xml) add_subdirectory(src/render) add_subdirectory(src/thread) add_subdirectory(src/ui) target_compile_definitions(mujoco PRIVATE _GNU_SOURCE CCD_STATIC_DEFINE MUJOCO_DLL_EXPORTS -DMC_IMPLEM_ENABLE) if(MUJOCO_ENABLE_AVX_INTRINSICS) target_compile_definitions(mujoco PUBLIC mjUSEPLATFORMSIMD) endif() target_compile_options( mujoco PRIVATE ${AVX_COMPILE_OPTIONS} ${MUJOCO_MACOS_COMPILE_OPTIONS} ${EXTRA_COMPILE_OPTIONS} ${MUJOCO_CXX_FLAGS} ) target_link_options( mujoco PRIVATE ${MUJOCO_MACOS_LINK_OPTIONS} ${EXTRA_LINK_OPTIONS} ) target_link_libraries( mujoco PRIVATE ccd lodepng qhullstatic_r tinyobjloader tinyxml2 ) set_target_properties( mujoco PROPERTIES VERSION "${mujoco_VERSION}" PUBLIC_HEADER "${MUJOCO_HEADERS}" ) # CMake's built-in FRAMEWORK option doesn't give us control over the dylib name inside the # Framework. We instead make our own Framework here. if(APPLE AND MUJOCO_BUILD_MACOS_FRAMEWORKS) set(TAPI "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi" ) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/dist/Info.plist.framework.in ${CMAKE_CURRENT_SOURCE_DIR}/dist/Info.framework.plist ) set_target_properties( mujoco PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/mujoco.framework/Versions/A" BUILD_WITH_INSTALL_NAME_DIR TRUE INSTALL_NAME_DIR "@rpath/mujoco.framework/Versions/A" ) add_custom_command( TARGET mujoco POST_BUILD COMMAND mkdir -p $/Headers COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && cp ${MUJOCO_HEADERS} $/Headers COMMAND mkdir -p $/Modules COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/dist/module.modulemap $/Modules COMMAND mkdir -p $/Resources COMMAND mv ${CMAKE_CURRENT_SOURCE_DIR}/dist/Info.framework.plist $/Resources/Info.plist COMMAND ${TAPI} stubify $ -o $/mujoco.tbd COMMAND ln -fhs A $/../Current COMMAND ln -fhs Versions/Current/mujoco.tbd $/../../mujoco.tbd COMMAND ln -fhs Versions/Current/Headers $/../../Headers COMMAND ln -fhs Versions/Current/Modules $/../../Modules COMMAND ln -fhs Versions/Current/Resources $/../../Resources COMMAND_EXPAND_LISTS ) endif() # Add a namespace alias to mujoco to be used by the examples. # This simulates the install interface when building with sources. add_library(mujoco::mujoco ALIAS mujoco) add_subdirectory(model) # `simulate` defines a macro, embed_in_bundle, that's used by `sample`, so that # subdirectory needs to be added first. # TODO: Remove this order dependency. if(MUJOCO_BUILD_SIMULATE) add_subdirectory(simulate) endif() if(MUJOCO_BUILD_EXAMPLES) add_subdirectory(sample) endif() if(BUILD_TESTING AND MUJOCO_BUILD_TESTS) enable_testing() add_subdirectory(test) if(MUJOCO_TEST_PYTHON_UTIL) add_subdirectory(python/mujoco/util) endif() endif() if(NOT (APPLE AND MUJOCO_BUILD_MACOS_FRAMEWORKS)) # Install the libraries. install( TARGETS mujoco EXPORT ${PROJECT_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT runtime LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT runtime ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT dev PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mujoco" COMPONENT dev ) set(CONFIG_PACKAGE_LOCATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") # Generate and install the mujocoTargets.cmake file. This defines the targets as # IMPORTED libraries for downstream users. install( EXPORT ${PROJECT_NAME} DESTINATION ${CONFIG_PACKAGE_LOCATION} NAMESPACE mujoco:: FILE "${PROJECT_NAME}Targets.cmake" ) include(CMakePackageConfigHelpers) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" VERSION ${mujoco_VERSION} COMPATIBILITY AnyNewerVersion ) configure_package_config_file( cmake/${PROJECT_NAME}Config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" INSTALL_DESTINATION ${CONFIG_PACKAGE_LOCATION} ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" DESTINATION ${CONFIG_PACKAGE_LOCATION} ) # Install also models into share folder. install( DIRECTORY model DESTINATION "${CMAKE_INSTALL_DATADIR}/mujoco" PATTERN "CMakeLists.txt" EXCLUDE ) endif()