00576a3bf9
Also update the README banner so that the background grid lines scale more reliably to different screen PPI. PiperOrigin-RevId: 473598837 Change-Id: I43434b35333714922128f8fd625aa6eb62521a7f
248 lines
8.1 KiB
CMake
248 lines
8.1 KiB
CMake
# 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)
|
|
|
|
# INTERPROCEDURAL_OPTIMIZATION is enforced when enabled.
|
|
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
|
|
# Default to GLVND if available.
|
|
set(CMAKE_POLICY_DEFAULT_CMP0072 NEW)
|
|
|
|
# This line has to appear before 'PROJECT' in order to be able to disable incremental linking
|
|
set(MSVC_INCREMENTAL_DEFAULT ON)
|
|
|
|
set(MUJOCO_DEP_VERSION_lodepng
|
|
b4ed2cd7ecf61d29076169b49199371456d4f90b
|
|
CACHE STRING "Version of `lodepng` to be fetched."
|
|
)
|
|
|
|
project(
|
|
mujoco_simulate
|
|
VERSION 2.2.2
|
|
DESCRIPTION "MuJoCo simulate binaries"
|
|
HOMEPAGE_URL "https://mujoco.org"
|
|
)
|
|
|
|
enable_language(C)
|
|
enable_language(CXX)
|
|
if(APPLE)
|
|
enable_language(OBJC)
|
|
enable_language(OBJCXX)
|
|
endif()
|
|
|
|
# Check if we are building as standalone project.
|
|
set(SIMULATE_STANDALONE OFF)
|
|
set(_INSTALL_SIMULATE ON)
|
|
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|
set(SIMULATE_STANDALONE ON)
|
|
# If standalone, do not install the samples.
|
|
set(_INSTALL_SIMULATE OFF)
|
|
endif()
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/../cmake")
|
|
|
|
if(SIMULATE_STANDALONE)
|
|
include(SimulateOptions)
|
|
else()
|
|
enforce_mujoco_macosx_min_version()
|
|
endif()
|
|
include(SimulateDependencies)
|
|
|
|
set(MUJOCO_SIMULATE_COMPILE_OPTIONS "${AVX_COMPILE_OPTIONS}" "${EXTRA_COMPILE_OPTIONS}")
|
|
set(MUJOCO_SIMULATE_LINK_OPTIONS "${EXTRA_LINK_OPTIONS}")
|
|
|
|
if(MUJOCO_HARDEN)
|
|
if(WIN32)
|
|
set(MUJOCO_SIMULATE_LINK_OPTIONS "${MUJOCO_SIMULATE_LINK_OPTIONS}" -Wl,/DYNAMICBASE)
|
|
else()
|
|
set(MUJOCO_SIMULATE_COMPILE_OPTIONS "${MUJOCO_SIMULATE_COMPILE_OPTIONS}" -fPIE -fPIC)
|
|
if(APPLE)
|
|
set(MUJOCO_SIMULATE_LINK_OPTIONS "${MUJOCO_SIMULATE_LINK_OPTIONS}" -Wl,-pie)
|
|
else()
|
|
set(MUJOCO_SIMULATE_LINK_OPTIONS "${MUJOCO_SIMULATE_LINK_OPTIONS}" -pie)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
# Fetch lodepng dependency.
|
|
if(NOT TARGET lodepng)
|
|
FetchContent_Declare(
|
|
lodepng
|
|
GIT_REPOSITORY https://github.com/lvandeve/lodepng.git
|
|
GIT_TAG ${MUJOCO_DEP_VERSION_lodepng}
|
|
)
|
|
|
|
FetchContent_GetProperties(lodepng)
|
|
if(NOT lodepng_POPULATED)
|
|
FetchContent_Populate(lodepng)
|
|
# This is not a CMake project.
|
|
set(LODEPNG_SRCS ${lodepng_SOURCE_DIR}/lodepng.cpp)
|
|
set(LODEPNG_HEADERS ${lodepng_SOURCE_DIR}/lodepng.h)
|
|
add_library(lodepng STATIC ${LODEPNG_HEADERS} ${LODEPNG_SRCS})
|
|
target_compile_options(lodepng PRIVATE ${MUJOCO_MACOS_COMPILE_OPTIONS})
|
|
target_link_options(lodepng PRIVATE ${MUJOCO_MACOS_LINK_OPTIONS})
|
|
target_include_directories(lodepng PUBLIC ${lodepng_SOURCE_DIR})
|
|
endif()
|
|
endif()
|
|
|
|
# Simulate library
|
|
add_library(libsimulate STATIC)
|
|
add_library(mujoco::libsimulate ALIAS libsimulate)
|
|
|
|
target_sources(
|
|
libsimulate
|
|
PUBLIC simulate.h
|
|
array_safety.h
|
|
glfw_dispatch.h
|
|
glfw_dispatch.cc
|
|
simulate.cc
|
|
uitools.h
|
|
uitools.cc
|
|
)
|
|
target_include_directories(libsimulate PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
|
target_compile_definitions(libsimulate PUBLIC MJSIMULATE_STATIC)
|
|
target_compile_options(libsimulate PUBLIC ${MUJOCO_SIMULATE_COMPILE_OPTIONS})
|
|
target_link_libraries(libsimulate PUBLIC glfw lodepng mujoco::mujoco)
|
|
target_link_options(libsimulate PRIVATE ${MUJOCO_SIMULATE_LINK_OPTIONS})
|
|
|
|
if(APPLE)
|
|
target_sources(libsimulate PRIVATE macos_save.mm)
|
|
target_link_libraries(libsimulate PUBLIC "-framework Cocoa")
|
|
endif()
|
|
|
|
# Build simulate executable
|
|
if(APPLE)
|
|
set(SIMULATE_RESOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../dist/mujoco.icns)
|
|
elseif(WIN32)
|
|
set(SIMULATE_RESOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../dist/simulate.rc)
|
|
else()
|
|
set(SIMULATE_RESOURCE_FILES "")
|
|
endif()
|
|
|
|
add_executable(simulate main.cc array_safety.h ${SIMULATE_RESOURCE_FILES})
|
|
target_compile_options(simulate PUBLIC ${MUJOCO_SIMULATE_COMPILE_OPTIONS})
|
|
if(WIN32)
|
|
add_custom_command(
|
|
TARGET simulate
|
|
PRE_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../dist/mujoco.ico
|
|
${CMAKE_CURRENT_SOURCE_DIR}
|
|
POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E rm ${CMAKE_CURRENT_SOURCE_DIR}/mujoco.ico
|
|
)
|
|
endif()
|
|
|
|
target_link_libraries(
|
|
simulate
|
|
libsimulate
|
|
mujoco::mujoco
|
|
glfw
|
|
Threads::Threads
|
|
lodepng
|
|
)
|
|
|
|
target_link_options(simulate PRIVATE ${MUJOCO_SIMULATE_LINK_OPTIONS})
|
|
|
|
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(
|
|
${target}
|
|
PROPERTIES INSTALL_RPATH @executable_path/../Frameworks
|
|
BUILD_WITH_INSTALL_RPATH TRUE
|
|
RUNTIME_OUTPUT_DIRECTORY $<TARGET_FILE_DIR:simulate>
|
|
)
|
|
endmacro()
|
|
|
|
# Embed mujoco.framework inside the App bundle ane move the icon file over too.
|
|
add_custom_command(
|
|
TARGET simulate
|
|
POST_BUILD
|
|
COMMAND mkdir -p $<TARGET_FILE_DIR:simulate>/../Frameworks
|
|
COMMAND rm -rf $<TARGET_FILE_DIR:simulate>/../Frameworks/mujoco.framework
|
|
COMMAND cp -a $<TARGET_FILE_DIR:mujoco::mujoco>/../../../mujoco.framework
|
|
$<TARGET_FILE_DIR:simulate>/../Frameworks/
|
|
# Delete the symlink and the TBD, otherwise we can't sign and notarize.
|
|
COMMAND rm -rf $<TARGET_FILE_DIR:simulate>/../Frameworks/mujoco.framework/mujoco.tbd
|
|
COMMAND rm -rf
|
|
$<TARGET_FILE_DIR:simulate>/../Frameworks/mujoco.framework/Versions/A/libmujoco.dylib
|
|
)
|
|
endif()
|
|
|
|
# Do not install if macOS Bundles are created as RPATH is managed manually there.
|
|
if(APPLE AND MUJOCO_BUILD_MACOS_FRAMEWORKS)
|
|
set(_INSTALL_SIMULATE OFF)
|
|
endif()
|
|
|
|
if(_INSTALL_SIMULATE)
|
|
|
|
include(TargetAddRpath)
|
|
|
|
# Add support to RPATH for the samples.
|
|
target_add_rpath(
|
|
TARGETS
|
|
simulate
|
|
INSTALL_DIRECTORY
|
|
"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}"
|
|
LIB_DIRS
|
|
"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}"
|
|
DEPENDS
|
|
MUJOCO_ENABLE_RPATH
|
|
)
|
|
|
|
install(
|
|
TARGETS simulate
|
|
EXPORT ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT simulate
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT simulate
|
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT simulate
|
|
BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT simulate
|
|
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT simulate
|
|
)
|
|
|
|
if(NOT MUJOCO_SIMULATE_USE_SYSTEM_GLFW)
|
|
# We downloaded GLFW. Depending if it is a static or shared LIBRARY we might
|
|
# need to install it.
|
|
get_target_property(MJ_GLFW_LIBRARY_TYPE glfw TYPE)
|
|
if(MJ_GLFW_LIBRARY_TYPE STREQUAL SHARED_LIBRARY)
|
|
install(
|
|
TARGETS glfw
|
|
EXPORT ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT simulate
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT simulate
|
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT simulate
|
|
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT simulate
|
|
)
|
|
endif()
|
|
endif()
|
|
endif()
|