feat: add cpp controller build support

This commit is contained in:
insleker 2026-05-20 20:14:51 +08:00
parent 535f4271a5
commit c25f13adb4
7 changed files with 146 additions and 2 deletions

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.21) cmake_minimum_required(VERSION 3.21)
project(webots_controller VERSION 0.1.0 LANGUAGES C) project(webots_controller VERSION 0.1.0 LANGUAGES C CXX)
option(WEBOTS_CONTROLLER_NO_PLUGINS "Disable runtime plugin loading (dlopen/LoadLibrary paths)." ON) option(WEBOTS_CONTROLLER_NO_PLUGINS "Disable runtime plugin loading (dlopen/LoadLibrary paths)." ON)

View File

@ -49,4 +49,4 @@ class WebotsControllerConan(ConanFile):
copy(self, "LICENSE", src=self.source_folder, dst=f"{self.package_folder}/licenses") copy(self, "LICENSE", src=self.source_folder, dst=f"{self.package_folder}/licenses")
def package_info(self): def package_info(self):
self.cpp_info.libs = ["webots_controller"] self.cpp_info.libs = ["webots_cpp_controller", "webots_controller"]

View File

@ -1 +1,2 @@
add_subdirectory(c) add_subdirectory(c)
add_subdirectory(cpp)

View File

@ -0,0 +1,57 @@
set(WEBOTS_CONTROLLER_CPP_SOURCES
Accelerometer.cpp
Altimeter.cpp
Brake.cpp
Camera.cpp
Compass.cpp
Connector.cpp
Device.cpp
Display.cpp
DistanceSensor.cpp
Emitter.cpp
Field.cpp
GPS.cpp
Gyro.cpp
InertialUnit.cpp
Joystick.cpp
Keyboard.cpp
LED.cpp
Lidar.cpp
LightSensor.cpp
Motion.cpp
Motor.cpp
Mouse.cpp
Node.cpp
Pen.cpp
PositionSensor.cpp
Proto.cpp
Radar.cpp
RangeFinder.cpp
Receiver.cpp
Robot.cpp
Skin.cpp
Speaker.cpp
Supervisor.cpp
TouchSensor.cpp
VacuumGripper.cpp
)
add_library(webots_cpp_controller ${WEBOTS_CONTROLLER_CPP_SOURCES})
add_library(webots-controller::webots_cpp_controller ALIAS webots_cpp_controller)
if(WIN32)
set_target_properties(webots_cpp_controller PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
target_include_directories(webots_cpp_controller
PRIVATE
${CMAKE_SOURCE_DIR}/include/controller/c
${CMAKE_SOURCE_DIR}/include/controller/cpp
)
target_link_libraries(webots_cpp_controller
PUBLIC
webots_controller
)
install(TARGETS webots_cpp_controller)

View File

@ -0,0 +1,46 @@
cmake_minimum_required(VERSION 3.15)
project(test_package CXX)
find_package(webots-controller REQUIRED CONFIG)
add_executable(test_package test_package.cpp)
target_link_libraries(test_package PRIVATE Webots::CppController Webots::Controller)
if(POLICY CMP0207)
cmake_policy(SET CMP0207 NEW)
endif()
# Webots controllers rely on seeing shared deps in the same directory as the executable.
install(TARGETS test_package
RUNTIME_DEPENDENCY_SET test_package_runtime_deps
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
if(WIN32)
# for single-config generators.
set(_runtime_dependency_directories)
string(TOUPPER "${CMAKE_BUILD_TYPE}" _conan_build_type)
set(_webots_bin_dirs_var "webots-controller_BIN_DIRS_${_conan_build_type}")
if(DEFINED ${_webots_bin_dirs_var})
list(APPEND _runtime_dependency_directories ${${_webots_bin_dirs_var}})
endif()
if(DEFINED ENV{MINGW_HOME})
list(APPEND _runtime_dependency_directories "$ENV{MINGW_HOME}/bin")
endif()
install(
RUNTIME_DEPENDENCY_SET test_package_runtime_deps
DIRECTORIES ${_runtime_dependency_directories}
PRE_EXCLUDE_REGEXES
"^api-ms-win-.*"
"^ext-ms-.*"
POST_EXCLUDE_REGEXES
".*/system32/.*"
".*/Windows/.*"
".*/SysWOW64/.*"
DESTINATION bin)
else()
install(
RUNTIME_DEPENDENCY_SET test_package_runtime_deps
DESTINATION bin)
endif()

View File

@ -0,0 +1,28 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import CMake, cmake_layout
import os
class TestPackageConan(ConanFile):
test_type = "explicit"
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeDeps", "CMakeToolchain"
def requirements(self):
self.requires(self.tested_reference_str)
def layout(self):
cmake_layout(self)
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def test(self):
cmake = CMake(self)
cmake.install()
if can_run(self):
exe = os.path.join(self.source_folder, "bin", "test_package")
self.run(exe, env="conanrun")

View File

@ -0,0 +1,12 @@
#include <webots/Robot.hpp>
#include <webots/robot.h>
#include <iostream>
int main() {
auto cpp_symbol = &webots::Robot::getBasicTimeStep;
auto c_symbol = &wb_robot_get_time;
(void)cpp_symbol;
(void)c_symbol;
std::cout << "Success!" << std::endl;
return 0;
}