fix: cmake & noexcept (#126)

This commit is contained in:
wtudio 2024-12-13 16:15:37 +08:00 committed by GitHub
parent 86be305db8
commit b4cdb6527e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 27 additions and 33 deletions

View File

@ -7,7 +7,7 @@ project(aimrt LANGUAGES C CXX)
# Prevent variables from being reset by option # Prevent variables from being reset by option
# This setting allows predefined variables to take precedence for FetchContent_MakeAvailable() # This setting allows predefined variables to take precedence for FetchContent_MakeAvailable()
# see: https://cmake.org/cmake/help/latest/policy/CMP0077.html # See: https://cmake.org/cmake/help/latest/policy/CMP0077.html
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
# Set cmake path # Set cmake path
@ -17,13 +17,16 @@ include(CMakeDependentOption)
# Some option # Some option
option(AIMRT_BUILD_TESTS "AimRT build tests." OFF) option(AIMRT_BUILD_TESTS "AimRT build tests." OFF)
option(AIMRT_BUILD_EXAMPLES "AimRT build examples." OFF)
option(AIMRT_BUILD_DOCUMENT "AimRT build document." OFF) option(AIMRT_BUILD_DOCUMENT "AimRT build document." OFF)
option(AIMRT_BUILD_RUNTIME "AimRT build runtime." ON) option(AIMRT_BUILD_RUNTIME "AimRT build runtime." ON)
option(AIMRT_BUILD_CLI_TOOLS "AimRT build aimrt command line tools." OFF) option(AIMRT_BUILD_CLI_TOOLS "AimRT build aimrt command line tools." OFF)
option(AIMRT_BUILD_WITH_PROTOBUF "AimRT build with protobuf." ON) option(AIMRT_BUILD_WITH_PROTOBUF "AimRT build with protobuf." ON)
option(AIMRT_BUILD_WITH_ROS2 "AimRT build with ros2." OFF) option(AIMRT_BUILD_WITH_ROS2 "AimRT build with ros2." OFF)
option(AIMRT_INSTALL "Enable installation of AimRT." ON)
cmake_dependent_option(AIMRT_BUILD_EXAMPLES "AimRT build examples." OFF "AIMRT_BUILD_RUNTIME" OFF)
cmake_dependent_option(AIMRT_BUILD_PYTHON_RUNTIME "AimRT build python runtime." OFF "AIMRT_BUILD_RUNTIME" OFF) cmake_dependent_option(AIMRT_BUILD_PYTHON_RUNTIME "AimRT build python runtime." OFF "AIMRT_BUILD_RUNTIME" OFF)
cmake_dependent_option(AIMRT_BUILD_PYTHON_PACKAGE "AimRT build python package." OFF "AIMRT_BUILD_PYTHON_RUNTIME;AIMRT_INSTALL" OFF) cmake_dependent_option(AIMRT_BUILD_PYTHON_PACKAGE "AimRT build python package." OFF "AIMRT_BUILD_PYTHON_RUNTIME;AIMRT_INSTALL" OFF)
@ -46,8 +49,6 @@ cmake_dependent_option(AIMRT_BUILD_LOG_CONTROL_PLUGIN "AimRT build log control p
cmake_dependent_option(AIMRT_BUILD_GRPC_PLUGIN "AimRT build grpc plugin." OFF "AIMRT_BUILD_RUNTIME" OFF) cmake_dependent_option(AIMRT_BUILD_GRPC_PLUGIN "AimRT build grpc plugin." OFF "AIMRT_BUILD_RUNTIME" OFF)
cmake_dependent_option(AIMRT_BUILD_PROXY_PLUGIN "AimRT build proxy plugin." OFF "AIMRT_BUILD_RUNTIME" OFF) cmake_dependent_option(AIMRT_BUILD_PROXY_PLUGIN "AimRT build proxy plugin." OFF "AIMRT_BUILD_RUNTIME" OFF)
option(AIMRT_INSTALL "Enable installation of AimRT." ON)
option(AIMRT_EXECUTOR_USE_STDEXEC "AimRT use stdexec as executor impl. (Experimental)" OFF) option(AIMRT_EXECUTOR_USE_STDEXEC "AimRT use stdexec as executor impl. (Experimental)" OFF)
option(AIMRT_BUILD_WITH_WERROR "AimRT build with -Werror option. (Experimental)" OFF) option(AIMRT_BUILD_WITH_WERROR "AimRT build with -Werror option. (Experimental)" OFF)
@ -95,12 +96,10 @@ if(AIMRT_MASTER_PROJECT)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
endif() endif()
if(UNIX) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
endif() elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
add_compile_options(/utf-8 /wd4819) add_compile_options(/utf-8 /wd4819)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus")
endif() endif()
@ -180,7 +179,7 @@ if(AIMRT_BUILD_WITH_PROTOBUF)
endif() endif()
if(AIMRT_BUILD_WITH_ROS2) if(AIMRT_BUILD_WITH_ROS2)
# fix cmake policy for using FindPythonInterp and FindPythonLibs (ros2) # Fix cmake policy for using FindPythonInterp and FindPythonLibs (ros2)
if(POLICY CMP0148) if(POLICY CMP0148)
cmake_policy(SET CMP0148 OLD) cmake_policy(SET CMP0148 OLD)
endif() endif()
@ -227,7 +226,7 @@ if(AIMRT_BUILD_RUNTIME)
endif() endif()
if(AIMRT_BUILD_ICEORYX_PLUGIN) if(AIMRT_BUILD_ICEORYX_PLUGIN)
# try to find libacl # Try to find libacl
if(CMAKE_SYSTEM_NAME MATCHES "Linux|QNX") if(CMAKE_SYSTEM_NAME MATCHES "Linux|QNX")
find_library(ACL_LIB acl) find_library(ACL_LIB acl)
if(NOT ACL_LIB) if(NOT ACL_LIB)
@ -247,7 +246,7 @@ if(AIMRT_BUILD_RUNTIME)
endif() endif()
if(AIMRT_BUILD_ZENOH_PLUGIN) if(AIMRT_BUILD_ZENOH_PLUGIN)
# find Rust compiler # Find Rust compiler
execute_process( execute_process(
COMMAND rustc --version COMMAND rustc --version
RESULT_VARIABLE rustc_result RESULT_VARIABLE rustc_result
@ -293,9 +292,7 @@ if(AIMRT_INSTALL)
endif() endif()
# Put at last to ensure ros2 installation is done # Put at last to ensure ros2 installation is done
if(AIMRT_INSTALL if(AIMRT_BUILD_PYTHON_PACKAGE)
AND AIMRT_BUILD_PYTHON_RUNTIME
AND AIMRT_BUILD_PYTHON_PACKAGE)
install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" --build \"${CMAKE_BINARY_DIR}\" --config ${CMAKE_BUILD_TYPE} --target create_python_pkg)") install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" --build \"${CMAKE_BINARY_DIR}\" --config ${CMAKE_BUILD_TYPE} --target create_python_pkg)")
endif() endif()

View File

@ -17,6 +17,6 @@ if(AIMRT_BUILD_RUNTIME)
add_subdirectory(plugins) add_subdirectory(plugins)
endif() endif()
if(AIMRT_BUILD_RUNTIME AND AIMRT_BUILD_EXAMPLES) if(AIMRT_BUILD_EXAMPLES)
add_subdirectory(examples) add_subdirectory(examples)
endif() endif()

View File

@ -9,8 +9,6 @@ if(AIMRT_BUILD_WITH_ROS2)
add_subdirectory(ros2_util) add_subdirectory(ros2_util)
endif() endif()
if(AIMRT_BUILD_RUNTIME) if(AIMRT_BUILD_NET_PLUGIN OR AIMRT_BUILD_GRPC_PLUGIN)
if(AIMRT_BUILD_NET_PLUGIN OR AIMRT_BUILD_GRPC_PLUGIN) add_subdirectory(net)
add_subdirectory(net)
endif()
endif() endif()

View File

@ -36,12 +36,6 @@ concept FunctionCStyleOps =
std::is_same_v<void (*)(void*), decltype(T::destroyer)> && std::is_same_v<void (*)(void*), decltype(T::destroyer)> &&
DecayedType<typename InvokerTraitsHelper<decltype(T::invoker)>::ReturnType>; DecayedType<typename InvokerTraitsHelper<decltype(T::invoker)>::ReturnType>;
/*
TODO:
1. noexcept类型
2. operator()Args的类型限制
*/
/** /**
* @brief Function * @brief Function
* @note C Style类型ops构造使NativeHandle与C互调 * @note C Style类型ops构造使NativeHandle与C互调
@ -131,8 +125,9 @@ class Function<Ops> {
return *this; return *this;
} }
// TODO加上Args的类型限制
template <typename... Args> template <typename... Args>
R operator()(Args... args) const { R operator()(Args... args) const noexcept {
return static_cast<const OpsType*>(base_.ops)->invoker(&(base_.object_buf), args...); return static_cast<const OpsType*>(base_.ops)->invoker(&(base_.object_buf), args...);
} }
@ -147,17 +142,17 @@ class Function<Ops> {
if constexpr (sizeof(Decayed) <= sizeof(base_.object_buf)) { if constexpr (sizeof(Decayed) <= sizeof(base_.object_buf)) {
static constexpr OpsType kOps = { static constexpr OpsType kOps = {
.invoker = [](void* object, std::tuple_element_t<Idx, ArgsTuple>... args) -> R { .invoker = [](void* object, std::tuple_element_t<Idx, ArgsTuple>... args) noexcept -> R {
if constexpr (std::is_void_v<R>) { if constexpr (std::is_void_v<R>) {
std::invoke(*static_cast<Decayed*>(object), args...); std::invoke(*static_cast<Decayed*>(object), args...);
} else { } else {
return std::invoke(*static_cast<Decayed*>(object), args...); return std::invoke(*static_cast<Decayed*>(object), args...);
} }
}, },
.relocator = [](void* from, void* to) { .relocator = [](void* from, void* to) noexcept {
new (to) Decayed(std::move(*static_cast<Decayed*>(from))); new (to) Decayed(std::move(*static_cast<Decayed*>(from)));
static_cast<Decayed*>(from)->~Decayed(); }, static_cast<Decayed*>(from)->~Decayed(); },
.destroyer = [](void* object) { static_cast<Decayed*>(object)->~Decayed(); }}; .destroyer = [](void* object) noexcept { static_cast<Decayed*>(object)->~Decayed(); }};
base_.ops = &kOps; base_.ops = &kOps;
new (&(base_.object_buf)) Decayed(std::forward<T>(action)); new (&(base_.object_buf)) Decayed(std::forward<T>(action));
@ -165,15 +160,15 @@ class Function<Ops> {
using Stored = Decayed*; using Stored = Decayed*;
static constexpr OpsType kOps = { static constexpr OpsType kOps = {
.invoker = [](void* object, std::tuple_element_t<Idx, ArgsTuple>... args) -> R { .invoker = [](void* object, std::tuple_element_t<Idx, ArgsTuple>... args) noexcept -> R {
if constexpr (std::is_void_v<R>) { if constexpr (std::is_void_v<R>) {
std::invoke(**static_cast<Stored*>(object), args...); std::invoke(**static_cast<Stored*>(object), args...);
} else { } else {
return std::invoke(**static_cast<Stored*>(object), args...); return std::invoke(**static_cast<Stored*>(object), args...);
} }
}, },
.relocator = [](void* from, void* to) { new (to) Stored(*static_cast<Stored*>(from)); }, .relocator = [](void* from, void* to) noexcept { new (to) Stored(*static_cast<Stored*>(from)); },
.destroyer = [](void* object) { delete *static_cast<Stored*>(object); }}; .destroyer = [](void* object) noexcept { delete *static_cast<Stored*>(object); }};
base_.ops = &kOps; base_.ops = &kOps;
new (&(base_.object_buf)) Stored(new Decayed(std::forward<T>(action))); new (&(base_.object_buf)) Stored(new Decayed(std::forward<T>(action)));

View File

@ -191,6 +191,8 @@ void AimRTCore::StartImpl() {
void AimRTCore::ShutdownImpl() { void AimRTCore::ShutdownImpl() {
if (std::atomic_exchange(&shutdown_impl_flag_, true)) return; if (std::atomic_exchange(&shutdown_impl_flag_, true)) return;
AIMRT_INFO("AimRT start shutdown.");
EnterState(State::kPreShutdown); EnterState(State::kPreShutdown);
EnterState(State::kPreShutdownModules); EnterState(State::kPreShutdownModules);
@ -271,6 +273,8 @@ std::future<void> AimRTCore::AsyncStart() {
void AimRTCore::Shutdown() { void AimRTCore::Shutdown() {
if (std::atomic_exchange(&shutdown_flag_, true)) return; if (std::atomic_exchange(&shutdown_flag_, true)) return;
AIMRT_INFO("Received shutdown signal.");
shutdown_promise_.set_value(); shutdown_promise_.set_value();
} }

View File

@ -16,6 +16,6 @@ if(AIMRT_BUILD_CLI_TOOLS)
add_subdirectory(aimrt_cli) add_subdirectory(aimrt_cli)
endif() endif()
if(AIMRT_BUILD_PYTHON_RUNTIME AND AIMRT_BUILD_PYTHON_PACKAGE) if(AIMRT_BUILD_PYTHON_PACKAGE)
add_subdirectory(package_aimrt_py) add_subdirectory(package_aimrt_py)
endif() endif()