Files
Mujoco_WASM/python/mujoco/experimental/netimgui/CMakeLists.txt
T
Matija Kecman ca5337161d Export netimgui files in MuJoCo Copybara configuration for use with the upcoming Web Viewer
PiperOrigin-RevId: 954769526
Change-Id: I4cdee083082f7d55c2babd5e664ec0283a2aaf63
2026-07-27 12:33:41 -07:00

76 lines
3.0 KiB
CMake

# Copyright 2026 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.
# NetImgui client library (vendored, MIT licensed — see LICENSE).
#
# This CMakeLists is included from two different build contexts:
# 1. The main MuJoCo tree under Emscripten (for the web viewer WASM client),
# where the `dear_imgui` target exists.
# 2. The Python bindings build (for the headless_ui pybind module), where Dear
# ImGui is an imported archive named `mujoco::dep::dear_imgui`.
if(TARGET netimgui)
return()
endif()
# Resolve the Dear ImGui target for the current build context. Check the
# imported archive first: in the Python bindings build a pybind module named
# `dear_imgui` is also defined (the Python ImGui bindings), which must not be
# confused with the C++ library.
if(TARGET mujoco::dep::dear_imgui)
set(NETIMGUI_IMGUI_TARGET mujoco::dep::dear_imgui)
elseif(TARGET dear_imgui)
set(NETIMGUI_IMGUI_TARGET dear_imgui)
else()
message(WARNING "No Dear ImGui target found. netimgui will not be built.")
return()
endif()
add_library(netimgui STATIC
Code/Client/Private/NetImgui_Api.cpp
Code/Client/Private/NetImgui_Client.cpp
Code/Client/Private/NetImgui_CmdPackets_DrawFrame.cpp
)
if(EMSCRIPTEN)
# WebSocket-based networking for the browser (WASM) build.
target_sources(netimgui PRIVATE google/NetImgui_NetworkWASM.cpp)
# emscripten_websocket_* requires the JS websocket library.
target_link_options(netimgui PUBLIC -lwebsocket.js)
elseif(WIN32)
# Winsock2 networking for Windows.
target_sources(netimgui PRIVATE Code/Client/Private/NetImgui_NetworkWin32.cpp)
# The source self-links ws2_32 via `#pragma comment(lib, ...)` under MSVC;
# link it explicitly so non-MSVC toolchains (e.g. clang-cl) resolve it too.
target_link_libraries(netimgui PUBLIC ws2_32)
elseif(UNIX)
# BSD-socket networking for Linux and macOS (both are UNIX).
target_sources(netimgui PRIVATE Code/Client/Private/NetImgui_NetworkPosix.cpp)
else()
message(WARNING "NetImgui networking is not available on this platform. "
"netimgui will not be built.")
return()
endif()
target_include_directories(netimgui
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR} # google/logging.h
${CMAKE_CURRENT_SOURCE_DIR}/Code/Client # NetImgui_Api.h
${CMAKE_CURRENT_SOURCE_DIR}/Code/Client/Private # NetImgui_CmdPackets.h etc.
)
target_link_libraries(netimgui PUBLIC ${NETIMGUI_IMGUI_TARGET})
set_target_properties(netimgui PROPERTIES POSITION_INDEPENDENT_CODE ON)