diff --git a/CMakeLists.txt b/CMakeLists.txt index 87a54605..f1a91843 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,18 +112,6 @@ set_target_properties( # 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) - include(DuplicateTarget) - duplicate_target( - TARGET - mujoco - NEW_TARGET_NAME - mujoco_framework - ) - - # Do not add mujoco::mujoco to the ALL target. We do this to speed up the - # build assuming the user is interested in the Frameworks. - set_target_properties(mujoco PROPERTIES EXCLUDE_FROM_ALL TRUE) - set(TAPI "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi" ) @@ -132,31 +120,27 @@ if(APPLE AND MUJOCO_BUILD_MACOS_FRAMEWORKS) ${CMAKE_CURRENT_SOURCE_DIR}/dist/Info.framework.plist ) set_target_properties( - mujoco_framework + 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" - OUTPUT_NAME "mujoco" ) add_custom_command( - TARGET mujoco_framework + 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 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 ln -fhs A $/../Current - COMMAND ${TAPI} stubify $ -o - $/../../mujoco.tbd - COMMAND ln -fhs Versions/Current/Headers $/../../Headers - COMMAND ln -fhs Versions/Current/Modules $/../../Modules - COMMAND ln -fhs Versions/Current/Resources $/../../Resources + $/Resources/Info.plist + COMMAND ln -fhs A $/../Current + COMMAND ${TAPI} stubify $ -o $/../../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() @@ -181,48 +165,50 @@ if(BUILD_TESTING AND MUJOCO_TEST_PYTHON_UTIL) add_subdirectory(python/mujoco/util) endif() -# 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} COMPONENT dev -) +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} COMPONENT dev + ) -set(CONFIG_PACKAGE_LOCATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") + 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" -) + # 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) + include(CMakePackageConfigHelpers) -write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" - VERSION ${mujoco_VERSION} - COMPATIBILITY AnyNewerVersion -) + 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} -) + 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(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 -) + # Install also models into share folder. + install( + DIRECTORY model + DESTINATION "${CMAKE_INSTALL_DATADIR}/mujoco" + PATTERN "CMakeLists.txt" EXCLUDE + ) +endif() \ No newline at end of file diff --git a/cmake/DuplicateTarget.cmake b/cmake/DuplicateTarget.cmake deleted file mode 100644 index 6ce03737..00000000 --- a/cmake/DuplicateTarget.cmake +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright 2022 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. -# -#.rst: -# duplicate_target -# ---------------------- -# -# Duplicates the specified target. -# -# duplicate_target(TARGET target NEW_TARGET_NAME new_target_name) -# -# Duplicates the specified target by creating a new target with the name -# specified by ``NEW_TARGET_NAME`` and copying all properties defined by -# ``TARGET``. -# The command has the following parameters: -# -# Arguments: -# - ``TARGET`` Target to be duplicated. -# - ``NEW_TARGET_NAME`` name of the new target. -# - -if(COMMAND duplicate_target) - return() -endif() - -macro(duplicate_target) - # Parse arguments. - set(options) - set(one_value_args TARGET NEW_TARGET_NAME) - set(multi_value_args) - cmake_parse_arguments( - _ARGS - "${options}" - "${one_value_args}" - "${multi_value_args}" - ${ARGN} - ) - - # Check required variables are defined. - if(NOT _ARGS_TARGET) - message(FATAL_ERROR "duplicate_target: TARGET must be specified.") - endif() - if(NOT _ARGS_NEW_TARGET_NAME) - message(FATAL_ERROR "duplicate_target: NEW_TARGET_NAME must be specified.") - endif() - - # Check for the target to exist. - if(NOT TARGET ${_ARGS_TARGET}) - message(FATAL_ERROR "duplicate_target: TARGET ${_ARGS_TARGET} not found.") - endif() - - # Non-exausitve list. - set(PROPERTIES_TO_SKIP) - get_target_property(TARGET_TYPE ${_ARGS_TARGET} TYPE) - if(${TARGET_TYPE} STREQUAL "STATIC_LIBRARY") - add_library(${_ARGS_NEW_TARGET_NAME} STATIC) - list(APPEND PROPERTIES_TO_SKIP "IMPORTED_GLOBAL") - elseif(${TARGET_TYPE} STREQUAL "SHARED_LIBRARY") - add_library(${_ARGS_NEW_TARGET_NAME} SHARED) - list(APPEND PROPERTIES_TO_SKIP "IMPORTED_GLOBAL") - elseif(${TARGET_TYPE} STREQUAL "OBJECT_LIBRARY") - add_library(${_ARGS_NEW_TARGET_NAME} OBJECT) - list(APPEND PROPERTIES_TO_SKIP "IMPORTED_GLOBAL") - elseif(${TARGET_TYPE} STREQUAL "INTERFACE_LIBRARY") - add_library(${_ARGS_NEW_TARGET_NAME} INTERFACE) - elseif(${TARGET_TYPE} STREQUAL "EXECUTABLE") - add_executable(${_ARGS_NEW_TARGET_NAME}) - list(APPEND PROPERTIES_TO_SKIP "IMPORTED_GLOBAL") - endif() - - set(IGNORED_PROPERTIES "HEADER_SETS;INTERFACE_HEADER_SETS;NAME;TYPE") - - # Get all CMake target properties. - if(NOT CMAKE_ALL_PROPERTY_LIST) - execute_process(COMMAND cmake --help-property-list OUTPUT_VARIABLE ALL_PROPERTIES) - - # Convert command output into a CMake list - string( - REGEX - REPLACE ";" - "\\\\;" - ALL_PROPERTIES - "${ALL_PROPERTIES}" - ) - string( - REGEX - REPLACE "\n" - ";" - ALL_PROPERTIES - "${ALL_PROPERTIES}" - ) - - # Post process the properties. We: - # - Remove all properties listed in ``IGNORED_PROPERTIES``. - # - Remove LOCATION as it should not be accessed, See https://stackoverflow.com/questions/32197663/how-can-i-remove-the-the-location-property-may-not-be-read-from-target-error-i - # - Substitute with all the possible build types. This is needed for multi-config generators as they can change the type of build without invoking again CMake. - set(CMAKE_ALL_PROPERTY_LIST "") - foreach(PROPERTY ${ALL_PROPERTIES}) - # Skip reading the LOCAION property as they should not be read. - # See https://stackoverflow.com/questions/32197663/how-can-i-remove-the-the-location-property-may-not-be-read-from-target-error-i - if(PROPERTY STREQUAL "LOCATION" - OR PROPERTY MATCHES "^LOCATION_" - OR PROPERTY MATCHES "_LOCATION$" - ) - continue() - endif() - - set(_ignore OFF) - foreach(_pro ${IGNORED_PROPERTIES}) - if(PROPERTY STREQUAL ${_pro}) - set(_ignore ON) - break() - endif() - endforeach() - - if(_ignore) - continue() - endif() - - string(FIND ${PROPERTY} "" FOUND) - if(${FOUND} EQUAL -1) - # Simply append the property. - list(APPEND CMAKE_ALL_PROPERTY_LIST ${PROPERTY}) - else() - # Iterate on the build types to add the correct property. - foreach(BUILD_TYPE ${BUILD_TYPES}) - string( - REPLACE "" - "${BUILD_TYPE}" - CONFIG_PROPERTY - ${PROPERTY} - ) - list(APPEND CMAKE_ALL_PROPERTY_LIST ${CONFIG_PROPERTY}) - endforeach() - endif() - - endforeach() - - endif() - - foreach(PROPERTY ${CMAKE_ALL_PROPERTY_LIST}) - # Search if we should skip this property. - - list( - FIND - PROPERTIES_TO_SKIP - ${PROPERTY} - SHOULD_SKIP - ) - if(${SHOULD_SKIP} GREATER_EQUAL 0) - continue() - endif() - - # First check if the property was set on the target - get_property( - PROPERTY_FOUND - TARGET ${_ARGS_TARGET} - PROPERTY ${PROPERTY} - SET - ) - if(PROPERTY_FOUND) - get_target_property(PROPERTY_VALUE ${_ARGS_TARGET} ${PROPERTY}) - set_target_properties(${_ARGS_NEW_TARGET_NAME} PROPERTIES ${PROPERTY} "${PROPERTY_VALUE}") - endif() - endforeach() -endmacro() diff --git a/doc/APIreference.rst b/doc/APIreference.rst index 9d171bb0..2258e60a 100644 --- a/doc/APIreference.rst +++ b/doc/APIreference.rst @@ -3242,7 +3242,7 @@ users of MuJoCo -- we do our own work with the public library instead of relying Activation ^^^^^^^^^^ -The functions in this section are maintained for backward compatibillity with the now-removed activation mechanism. +The functions in this section are maintained for backward compatibility with the now-removed activation mechanism. .. _mj_activate: diff --git a/doc/changelog.rst b/doc/changelog.rst index 8f0aa56e..f6b589fa 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -58,9 +58,10 @@ General Bug fixes ^^^^^^^^^ + 10. Antialiasing was disabled for segmentation rendering. Before this change, if the :ref:`offsamples` attribute was greater than 0 (the default value is 4), pixels that overlapped with multiple geoms would receive - averaged segmentation IDs, leading to incorrect or non-existant IDs. After this change :at:`offsamples` is ignored + averaged segmentation IDs, leading to incorrect or non-existent IDs. After this change :at:`offsamples` is ignored during segmentation rendering. #. The value of the enable flag for the experimental multiCCD feature was made sequential with other enable flags. @@ -397,7 +398,7 @@ License manager ^^^^^^^^^^^^^^^ 23. Removed the entire license manager. The functions ``mj_activate`` and ``mj_deactivate`` are still there for - backward compabitibily, but now they do nothing and it is no longer necessary to call them. + backward compatibility, but now they do nothing and it is no longer necessary to call them. #. Removed the remote license certificate functions ``mj_certXXX``. Earlier versions diff --git a/doc/modeling.rst b/doc/modeling.rst index 4e34ac61..1204859f 100644 --- a/doc/modeling.rst +++ b/doc/modeling.rst @@ -1207,7 +1207,7 @@ existing URDF models have non-physical dynamics parameters which MuJoCo's built- unmodified. This extension is also needed to specify mesh directories. Note that the while MJCF models are checked against a custom XML schema by the parser, URDF models are not. Even the -MuJoCo-specific elements emebdded in the URDF file are not checked. As a result, mis-typed attribute names are +MuJoCo-specific elements embedded in the URDF file are not checked. As a result, mis-typed attribute names are silently ignored, which can result in major confusion if the typo remains unnoticed. Here is an example extension section of a URDF model: diff --git a/doc/overview.rst b/doc/overview.rst index d949739c..fc8f0b1d 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -602,7 +602,7 @@ Divergence of a simulation happens when elements of the state tend quickly to in manifested as an :ref:`mjWARN_BADQACC` warning. Divergence is endemic to all physics simulation and is not necessarily indicative of a bad model or bug in the simulator, but is rather a hint that the timestep is too large for the given choice of integrator. In physics simulation there is always a tension between speed (large time steps) and -stabillity (small timesteps). A model which is well-tuned for speed has the largest possible timestep that does not +stability (small timesteps). A model which is well-tuned for speed has the largest possible timestep that does not diverge, which usually means that it *can* be made to diverge under extreme conditions. In that sense *rare* cases of divergence can actually be indicative of a well-tuned model. In all cases it should be possible to prevent divergence by reducing the timestep and/or switching to a more stable :ref:`integrator `. If that fails, the culprit is diff --git a/doc/python.rst b/doc/python.rst index 662da3fe..7326bdd8 100644 --- a/doc/python.rst +++ b/doc/python.rst @@ -238,7 +238,7 @@ to terminate the process, otherwise the behavior of MuJoCo after the callback re sufficient to ensure that error callbacks do not return *to MuJoCo*, but it is permitted to use `longjmp `__ to skip MuJoCo's call stack back to the external callsite. -The Python bindings utilises longjmp to allow it to convert irrecoverable MuJoCo errors into Python exceptions of type +The Python bindings utilizes longjmp to allow it to convert irrecoverable MuJoCo errors into Python exceptions of type ``mujoco.FatalError`` that can be caught and processed in the usual Pythonic way. Furthermore, it installs its error callback in a thread-local manner using a currently private API, thus allowing for concurrent calls into MuJoCo from multiple threads. @@ -270,7 +270,7 @@ Migration Notes for mujoco-py ----------------------------- In mujoco-py, the main entry point is the `MjSim `_ -class. Users constuct a stateful ``MjSim`` instance from an MJCF model (similar to ``dm_control.Physics``), and this +class. Users construct a stateful ``MjSim`` instance from an MJCF model (similar to ``dm_control.Physics``), and this instance holds references to an ``mjModel`` instance and its associated ``mjData``. In contrast, the MuJoCo Python bindings (``mujoco``) take a more low-level approach, as explained above: following the design principle of the C library, the ``mujoco`` module itself is stateless, and merely wraps the underlying native structs and functions. diff --git a/sample/CMakeLists.txt b/sample/CMakeLists.txt index d8759d08..e284ff78 100644 --- a/sample/CMakeLists.txt +++ b/sample/CMakeLists.txt @@ -24,7 +24,7 @@ set(MSVC_INCREMENTAL_DEFAULT ON) project( mujoco_samples - VERSION 2.1.5 + VERSION 2.2.0 DESCRIPTION "MuJoCo samples binaries" HOMEPAGE_URL "https://mujoco.org" ) @@ -161,145 +161,54 @@ if(APPLE) target_link_libraries(simulate "-framework Cocoa") endif() -if(NOT SAMPLE_STANDALONE) - if(APPLE AND MUJOCO_BUILD_MACOS_FRAMEWORKS) - - macro(link_to_mujoco_framework target) - get_target_property(interface_link_libraries ${target} INTERFACE_LINK_LIBRARIES) - get_target_property(link_libraries ${target} LINK_LIBRARIES) - # Remove mujoco::mujoco target which is the not-framework library. - list(REMOVE_ITEM interface_link_libraries mujoco::mujoco) - list(REMOVE_ITEM link_libraries mujoco::mujoco) - set_target_properties( - ${target} PROPERTIES INTERFACE_LINK_LIBRARIES "${interface_link_libraries}" - ) - set_target_properties(${target} PROPERTIES LINK_LIBRARIES "${link_libraries}") - - # Add mujoco_framework. - target_link_libraries(${target} mujoco_framework) - endmacro() - - include(DuplicateTarget) - duplicate_target( - TARGET - simulate - NEW_TARGET_NAME - simulate_macos - ) - link_to_mujoco_framework(simulate_macos) +if(APPLE AND MUJOCO_BUILD_MACOS_FRAMEWORKS) + set_target_properties( + simulate + PROPERTIES INSTALL_RPATH @executable_path/../Frameworks + BUILD_WITH_INSTALL_RPATH TRUE + RESOURCE ${SIMULATE_RESOURCE_FILES} + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/../dist/Info.plist.simulate.in + MACOSX_BUNDLE_BUNDLE_NAME "MuJoCo" + MACOSX_BUNDLE_GUI_IDENTIFIER "org.mujoco.mujoco" + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_INFO_STRING ${PROJECT_VERSION} + MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION} + MACOSX_BUNDLE_ICON_FILE "mujoco.icns" + MACOSX_BUNDLE_COPYRIGHT "Copyright 2021 DeepMind Technologies Limited." + ) + macro(embed_in_bundle target) + add_dependencies(${target} simulate) set_target_properties( - simulate_macos + ${target} PROPERTIES INSTALL_RPATH @executable_path/../Frameworks BUILD_WITH_INSTALL_RPATH TRUE - RESOURCE ${SIMULATE_RESOURCE_FILES} - MACOSX_BUNDLE TRUE - MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/../dist/Info.plist.simulate.in - MACOSX_BUNDLE_BUNDLE_NAME "MuJoCo" - MACOSX_BUNDLE_GUI_IDENTIFIER "org.mujoco.mujoco" - MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} - MACOSX_BUNDLE_INFO_STRING ${PROJECT_VERSION} - MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION} - MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION} - MACOSX_BUNDLE_ICON_FILE "mujoco.icns" - MACOSX_BUNDLE_COPYRIGHT "Copyright 2021 DeepMind Technologies Limited." - OUTPUT_NAME "simulate" + RUNTIME_OUTPUT_DIRECTORY $ ) + endmacro() - macro(embed_in_bundle target) - add_dependencies(${target} simulate_macos) - set_target_properties( - ${target} - PROPERTIES INSTALL_RPATH @executable_path/../Frameworks - BUILD_WITH_INSTALL_RPATH TRUE - RUNTIME_OUTPUT_DIRECTORY $ - ) - endmacro() + embed_in_bundle(basic simulate) + embed_in_bundle(compile simulate) + embed_in_bundle(derivative simulate) + embed_in_bundle(record simulate) + embed_in_bundle(testspeed simulate) + embed_in_bundle(testxml simulate) - duplicate_target( - TARGET - basic - NEW_TARGET_NAME - basic_macos - ) - set_target_properties(basic_macos PROPERTIES OUTPUT_NAME basic) - link_to_mujoco_framework(basic_macos) - embed_in_bundle(basic_macos simulate_macos) - - duplicate_target( - TARGET - compile - NEW_TARGET_NAME - compile_macos - ) - set_target_properties(compile_macos PROPERTIES OUTPUT_NAME compile) - link_to_mujoco_framework(compile_macos) - embed_in_bundle(compile_macos simulate_macos) - - duplicate_target( - TARGET - derivative - NEW_TARGET_NAME - derivative_macos - ) - set_target_properties(derivative_macos PROPERTIES OUTPUT_NAME derivative) - link_to_mujoco_framework(derivative_macos) - embed_in_bundle(derivative_macos simulate_macos) - - duplicate_target( - TARGET - record - NEW_TARGET_NAME - record_macos - ) - set_target_properties(record_macos PROPERTIES OUTPUT_NAME record) - link_to_mujoco_framework(record_macos) - embed_in_bundle(record_macos simulate_macos) - - duplicate_target( - TARGET - testspeed - NEW_TARGET_NAME - testspeed_macos - ) - set_target_properties(testspeed_macos PROPERTIES OUTPUT_NAME testspeed) - link_to_mujoco_framework(testspeed_macos) - embed_in_bundle(testspeed_macos simulate_macos) - - duplicate_target( - TARGET - testxml - NEW_TARGET_NAME - testxml_macos - ) - set_target_properties(testxml_macos PROPERTIES OUTPUT_NAME testxml) - link_to_mujoco_framework(testxml_macos) - embed_in_bundle(testxml_macos simulate_macos) - - # Do not add the original binaries to the ALL target. We do this to speed up the - # build assuming the user is interested in the Frameworks. - set_target_properties(simulate PROPERTIES EXCLUDE_FROM_ALL TRUE) - set_target_properties(basic PROPERTIES EXCLUDE_FROM_ALL TRUE) - set_target_properties(derivative PROPERTIES EXCLUDE_FROM_ALL TRUE) - set_target_properties(record PROPERTIES EXCLUDE_FROM_ALL TRUE) - set_target_properties(testxml PROPERTIES EXCLUDE_FROM_ALL TRUE) - # Note: compile and testspeed are needed by the tests. - - # Embed mujoco.framework inside the App bundle ane move the icon file over too. - add_custom_command( - TARGET simulate_macos - POST_BUILD - COMMAND mkdir -p $/../Frameworks - COMMAND rm -rf $/../Frameworks/mujoco.framework - COMMAND cp -a $/../../../mujoco.framework - $/../Frameworks/ - # Delete the symlink and the TBD, otherwise we can't sign and notarize. - COMMAND rm -rf $/../Frameworks/mujoco.framework/mujoco.tbd - COMMAND - rm -rf - $/../Frameworks/mujoco.framework/Versions/A/libmujoco.dylib - ) - endif() + # Embed mujoco.framework inside the App bundle ane move the icon file over too. + add_custom_command( + TARGET simulate + POST_BUILD + COMMAND mkdir -p $/../Frameworks + COMMAND rm -rf $/../Frameworks/mujoco.framework + COMMAND cp -a $/../../../mujoco.framework + $/../Frameworks/ + # Delete the symlink and the TBD, otherwise we can't sign and notarize. + COMMAND rm -rf $/../Frameworks/mujoco.framework/mujoco.tbd + COMMAND rm -rf + $/../Frameworks/mujoco.framework/Versions/A/libmujoco.dylib + ) endif() # Do not install if macOS Bundles are created as RPATH is managed manually there.