diff --git a/1.0.0.tar.gz b/1.0.0.tar.gz deleted file mode 100644 index 6aebc2f244b847d5396478317263e513f3b38177..0000000000000000000000000000000000000000 Binary files a/1.0.0.tar.gz and /dev/null differ diff --git a/cartographer_ros-2.0.9003.tar.gz b/cartographer_ros-2.0.9003.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..80a890b39eb2c40386fceb50a172ed6c47363aad Binary files /dev/null and b/cartographer_ros-2.0.9003.tar.gz differ diff --git a/cartographer_ros-changes.patch b/cartographer_ros-changes.patch new file mode 100644 index 0000000000000000000000000000000000000000..0ac2e56951c61b30ac6ab87b477d2513eb273b94 --- /dev/null +++ b/cartographer_ros-changes.patch @@ -0,0 +1,142 @@ +diff --git a/cartographer_ros/CMakeLists.txt b/cartographer_ros/CMakeLists.txt +index 6eaeb59..ddc986a 100644 +--- a/cartographer_ros/CMakeLists.txt ++++ b/cartographer_ros/CMakeLists.txt +@@ -16,7 +16,7 @@ + cmake_minimum_required(VERSION 3.5) + + project(cartographer_ros) +- ++set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include ${CMAKE_CURRENT_SOURCE_DIR}/thread_annotations_fix.h") + find_package(ament_cmake REQUIRED) + + # Default to C++17 +@@ -86,6 +86,7 @@ add_library(${PROJECT_NAME} SHARED + src/metrics/family_factory.cpp + src/metrics/internal/family.cpp + src/metrics/internal/histogram.cpp ++ src/metrics/collect_metrics_flags.cc + ) + target_include_directories(${PROJECT_NAME} PUBLIC + "$" +diff --git a/cartographer_ros/src/cartographer_grpc/node_grpc_main.cpp b/cartographer_ros/src/cartographer_grpc/node_grpc_main.cpp +index 20ee55d..0a80b4a 100644 +--- a/cartographer_ros/src/cartographer_grpc/node_grpc_main.cpp ++++ b/cartographer_ros/src/cartographer_grpc/node_grpc_main.cpp +@@ -21,17 +21,8 @@ + #include "cartographer_ros/ros_log_sink.h" + #include "gflags/gflags.h" + #include "tf2_ros/transform_listener.h" ++#include "cartographer_ros/metrics/collect_metrics_flag.h" + +-DEFINE_bool(collect_metrics, false, +- "Activates the collection of runtime metrics. If activated, the " +- "metrics can be accessed via a ROS service."); +-DEFINE_string(configuration_directory, "", +- "First directory in which configuration files are searched, " +- "second is always the Cartographer installation to allow " +- "including files from there."); +-DEFINE_string(configuration_basename, "", +- "Basename, i.e. not containing any directory prefix, of the " +- "configuration file."); + DEFINE_string(server_address, "localhost:50051", + "gRPC server address to stream the sensor data to."); + DEFINE_bool( +@@ -40,13 +31,6 @@ DEFINE_bool( + DEFINE_string( + save_map_filename, "", + "If non-empty, serialize state and write it to disk before shutting down."); +-DEFINE_string(load_state_filename, "", +- "If non-empty, filename of a .pbstream file " +- "to load, containing a saved SLAM state. " +- "Unless --upload_load_state_file is set, the filepath refers " +- "to the gRPC server's file system."); +-DEFINE_bool(load_frozen_state, true, +- "Load the saved state as frozen (non-optimized) trajectories."); + DEFINE_bool(upload_load_state_file, false, + "Upload the .pbstream file from a local path to the (remote) gRPC " + "server instead of loading it from the server file system."); +diff --git a/cartographer_ros/src/node_main.cpp b/cartographer_ros/src/node_main.cpp +index bdf33b8..e077586 100644 +--- a/cartographer_ros/src/node_main.cpp ++++ b/cartographer_ros/src/node_main.cpp +@@ -22,28 +22,11 @@ + #include "gflags/gflags.h" + #include "rclcpp/rclcpp.hpp" + #include "tf2_ros/transform_listener.h" ++#include "cartographer_ros/metrics/collect_metrics_flag.h" + +-DEFINE_bool(collect_metrics, false, +- "Activates the collection of runtime metrics. If activated, the " +- "metrics can be accessed via a ROS service."); +-DEFINE_string(configuration_directory, "", +- "First directory in which configuration files are searched, " +- "second is always the Cartographer installation to allow " +- "including files from there."); +-DEFINE_string(configuration_basename, "", +- "Basename, i.e. not containing any directory prefix, of the " +- "configuration file."); +-DEFINE_string(load_state_filename, "", +- "If non-empty, filename of a .pbstream file to load, containing " +- "a saved SLAM state."); +-DEFINE_bool(load_frozen_state, true, +- "Load the saved state as frozen (non-optimized) trajectories."); + DEFINE_bool( + start_trajectory_with_default_topics, true, + "Enable to immediately start the first trajectory with default topics."); +-DEFINE_string( +- save_state_filename, "", +- "If non-empty, serialize state and write it to disk before shutting down."); + + namespace cartographer_ros { + namespace { +diff --git a/cartographer_ros/src/offline_node.cpp b/cartographer_ros/src/offline_node.cpp +index 4b3f60e..7fc1bc5 100644 +--- a/cartographer_ros/src/offline_node.cpp ++++ b/cartographer_ros/src/offline_node.cpp +@@ -39,14 +39,8 @@ + #include "rclcpp/exceptions.hpp" + #include + #include ++#include "cartographer_ros/metrics/collect_metrics_flag.h" + +-DEFINE_bool(collect_metrics, false, +- "Activates the collection of runtime metrics. If activated, the " +- "metrics can be accessed via a ROS service."); +-DEFINE_string(configuration_directory, "", +- "First directory in which configuration files are searched, " +- "second is always the Cartographer installation to allow " +- "including files from there."); + DEFINE_string( + configuration_basenames, "", + "Comma-separated list of basenames, i.e. not containing any " +@@ -63,16 +57,6 @@ DEFINE_string(urdf_filenames, "", + "static links for the sensor configuration(s)."); + DEFINE_bool(use_bag_transforms, true, + "Whether to read, use and republish transforms from bags."); +-DEFINE_string(load_state_filename, "", +- "If non-empty, filename of a .pbstream file to load, containing " +- "a saved SLAM state."); +-DEFINE_bool(load_frozen_state, true, +- "Load the saved state as frozen (non-optimized) trajectories."); +-DEFINE_string(save_state_filename, "", +- "Explicit name of the file to which the serialized state will be " +- "written before shutdown. If left empty, the filename will be " +- "inferred from the first bagfile's name as: " +- ".pbstream"); + DEFINE_bool(keep_running, false, + "Keep running the offline node after all messages from the bag " + "have been processed."); +diff --git a/cartographer_ros/src/rosbag_validate_main.cpp b/cartographer_ros/src/rosbag_validate_main.cpp +index 61e16a3..5b2668a 100644 +--- a/cartographer_ros/src/rosbag_validate_main.cpp ++++ b/cartographer_ros/src/rosbag_validate_main.cpp +@@ -41,7 +41,7 @@ + #else + #include "urdf/model.hpp" + #endif +-#include ++#include + + DEFINE_string(bag_filename, "", "Bag to process."); + DEFINE_bool(dump_timing, false, diff --git a/cartographer_ros.spec b/cartographer_ros.spec index 4d3aba02d3a52eed01da29082701a0bb7819e40b..ede0982bc2590d2475369bce2beced5e3113f25c 100644 --- a/cartographer_ros.spec +++ b/cartographer_ros.spec @@ -1,320 +1,161 @@ -Name: cartographer_ros -Version: 1.0.0 -Release: 1 -Summary: This is ROS melodic cartographer Package -License: Public Domain and Apache-2.0 and BSD and MIT and BSL-1.0 and LGPL-2.1-only and MPL-2.0 and GPL-3.0-only and GPL-2.0-or-later and MPL-1.1 and IJG and Zlib and OFL-1.1 -URL: https://github.com/ros-gbp/cartographer-release/archive/release/melodic/cartographer/ -Source0: https://github.com/ros-gbp/cartographer-release/archive/release/melodic/cartographer/1.0.0.tar.gz -BuildRequires: gcc-c++ -BuildRequires: cmake -BuildRequires: lz4-devel -BuildRequires: bzip2-devel -BuildRequires: python-devel -BuildRequires: python-setuptools -#Requires: python-empy -BuildRequires: openssl-devel -BuildRequires: curl-devel -BuildRequires: curl -#BuildRequires: gcc-gfortran -#BuildRequires: openblas-devel -#BuildRequires: sqlite-devel -#BuildRequires: fftw-devel -BuildRequires: boost-devel -BuildRequires: uuid-devel -BuildRequires: uuid -BuildRequires: libuuid-devel -#BuildRequires: uuid-devel -#BuildRequires: python3-devel -#BuildRequires: boost-python3-devel - -BuildRequires: gmock-devel -BuildRequires: suitesparse-devel -BuildRequires: lua-devel -BuildRequires: protobuf-devel -BuildRequires: cairo-devel -BuildRequires: gflags-devel -BuildRequires: freeglut-devel -BuildRequires: libXt-devel -BuildRequires: tinyxml-devel -BuildRequires: libX11-devel -BuildRequires: libXrandr-devel -BuildRequires: libXaw-devel -BuildRequires: assimp-devel -BuildRequires: qt5-qtdeclarative-devel -BuildRequires: yaml-cpp-devel -BuildRequires: libatomic -#BuildRequires: python2-qt5-devel -BuildRequires: lz4-devel -BuildRequires: sphinx +%bcond_without tests +%bcond_without weak_deps + +%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g') +%global __provides_exclude_from ^/opt/ros/%{ros_distro}/.*$ +%global __requires_exclude_from ^/opt/ros/%{ros_distro}/.*$ + +%define ros_distro humble +%define RosPkgName cartographer-ros + +Name: ros-%{ros_distro}-%{RosPkgName} +Version: 2.0.9003 +Release: 1%{?dist}%{?release_suffix} +Summary: ROS cartographer-ros package + +Url: https://github.com/ros2/cartographer_ros +License: Apache-2.0 +Source0: cartographer_ros-%{version}.tar.gz +Source1: thread_annotations_fix.h +Source2: collect_metrics_flag.h +Source3: collect_metrics_flags.cc +Patch0: cartographer_ros-changes.patch + +Requires: ros-%{ros_distro}-builtin-interfaces +Requires: ros-%{ros_distro}-cartographer +Requires: ros-%{ros_distro}-cartographer-ros-msgs +Requires: eigen3-devel +Requires: ros-%{ros_distro}-geometry-msgs +Requires: abseil-cpp-devel +Requires: gflags-devel +Requires: glog-devel +Requires: pcl-devel +Requires: ros-%{ros_distro}-nav-msgs +Requires: ros-%{ros_distro}-pcl-conversions +Requires: ros-%{ros_distro}-rclcpp +Requires: ros-%{ros_distro}-rosbag2-cpp +Requires: ros-%{ros_distro}-rosbag2-storage +Requires: ros-%{ros_distro}-sensor-msgs +Requires: ros-%{ros_distro}-std-msgs +Requires: ros-%{ros_distro}-tf2 +Requires: ros-%{ros_distro}-tf2-eigen +Requires: ros-%{ros_distro}-tf2-msgs +Requires: ros-%{ros_distro}-tf2-ros +Requires: ros-%{ros_distro}-urdf +Requires: ros-%{ros_distro}-visualization-msgs +Requires: ros-%{ros_distro}-launch +Requires: ros-%{ros_distro}-robot-state-publisher +Requires: ros-%{ros_distro}-ros-environment +Requires: ros-%{ros_distro}-ros-workspace + +BuildRequires: ros-%{ros_distro}-builtin-interfaces +BuildRequires: ros-%{ros_distro}-cartographer +BuildRequires: ros-%{ros_distro}-cartographer-ros-msgs +BuildRequires: eigen3-devel +BuildRequires: ros-%{ros_distro}-geometry-msgs +BuildRequires: abseil-cpp-devel +BuildRequires: gflags-devel +BuildRequires: glog-devel +BuildRequires: pcl-devel +BuildRequires: ros-%{ros_distro}-nav-msgs +BuildRequires: ros-%{ros_distro}-pcl-conversions +BuildRequires: ros-%{ros_distro}-rclcpp +BuildRequires: ros-%{ros_distro}-rosbag2-cpp +BuildRequires: ros-%{ros_distro}-rosbag2-storage +BuildRequires: ros-%{ros_distro}-sensor-msgs +BuildRequires: ros-%{ros_distro}-std-msgs +BuildRequires: ros-%{ros_distro}-tf2 +BuildRequires: ros-%{ros_distro}-tf2-eigen +BuildRequires: ros-%{ros_distro}-tf2-msgs +BuildRequires: ros-%{ros_distro}-tf2-ros +BuildRequires: ros-%{ros_distro}-urdf +BuildRequires: ros-%{ros_distro}-visualization-msgs +BuildRequires: ros-%{ros_distro}-ros-environment +BuildRequires: gmock-devel +BuildRequires: python3-sphinx +BuildRequires: ros-%{ros_distro}-ament-cmake +BuildRequires: ros-%{ros_distro}-ros-workspace + +Provides: %{name}-devel = %{version}-%{release} +Provides: %{name}-doc = %{version}-%{release} +Provides: %{name}-runtime = %{version}-%{release} %description -This is ROS melodic ros_comm Package. +Cartographer is a system that provides real-time simultaneous localization +and mapping (SLAM) in 2D and 3D across multiple platforms and sensor +configurations. This package provides Cartographer's ROS integration. %prep -%setup -#cd catkin-0.7.26/ - - - - -#%build - -#pwd -#mkdir build/ -#cd build/ && cmake .. - - +%setup -q -n cartographer_ros-%{version} + +# Copy additional files to their correct locations +cp %{SOURCE1} thread_annotations_fix.h +mkdir -p include/cartographer_ros/metrics/ +cp %{SOURCE2} include/cartographer_ros/metrics/collect_metrics_flag.h +mkdir -p src/metrics/ +cp %{SOURCE3} src/metrics/collect_metrics_flags.cc + +# Apply patches +%patch -P0 -p2 + +%build +# Needed to bootstrap since the ros_workspace package does not yet exist. +export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages + +# In case we're installing to a non-standard location, look for a setup.sh +# in the install tree and source it. It will set things like +# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH. +if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi +mkdir -p .obj-%{_target_platform} && cd .obj-%{_target_platform} +%cmake3 \ + -UINCLUDE_INSTALL_DIR \ + -ULIB_INSTALL_DIR \ + -USYSCONF_INSTALL_DIR \ + -USHARE_INSTALL_PREFIX \ + -ULIB_SUFFIX \ + -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \ + -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro}" \ + -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro}" \ + -DSETUPTOOLS_DEB_LAYOUT=OFF \ +%if !0%{?with_tests} + -DBUILD_TESTING=OFF \ +%endif + .. + +%make_build %install -pwd - -#mkdir -p build/ -#cd build/ -#cmake .. -#cd .. - -cd src/ -cd 3rdparty/ - -cd empy-3.3.4/ -python setup.py install --user -cd .. - -cd six-1.15.0/ -python setup.py install --user -cd .. - -cd setuptools_scm-4.1.2/ -python setup.py install --user -cd .. - -cd python-dateutil-2.8.1/ -python setup.py install --user -cd .. - -cd pyparsing-2.4.7/ -python setup.py install --user -cd .. - -cd docutils-0.16/ -python setup.py install --user -cd .. - -cd catkin_pkg-0.4.22/ -python setup.py install --user -cd .. - -#for std_msgs -cd PyYAML-5.3.1/ -python setup.py install --user -cd .. - -cd distro-1.5.0/ -python setup.py install --user -cd .. - -cd rospkg-1.2.8/ -python setup.py install --user -cd .. - - - -cd console_bridge/ -mkdir build/ -cd build/ -cmake .. -make -make install -cd .. -cd .. - -cd poco/ -mkdir cmake-build/ -mkdir cmake-release/ -cd cmake-build/ -cmake .. -make install -cd .. -cd .. - - -cd tinyxml2/ -mkdir build -cd build -cmake .. -make install -cd .. -cd .. - - -cd urdfdom_headers/ -mkdir build -cd build -cmake .. -make install -cd .. -cd .. - -cd eigen-3.3.7/ -mkdir build -cd build -cmake .. -make install -cd .. -cd .. - -cd orocos_kdl/ -mkdir build -cd build -cmake .. -make install -cp -r ../../eigen-3.3.7/build/eigen/include/eigen3/* orocos_kdl/include/ -cd .. -cd .. - - -cd abseil-cpp/ -mkdir build -mkdir install -cd build -cmake .. -make install - -cd .. -cd install -ls -FR - -cd .. -cd .. - - - -cd glog/ -mkdir build -mkdir install -cd build -cmake .. -make install -cd .. -cd .. - - - -cd ceres-solver-1.13.0/ -mkdir build -mkdir install -cd build -cmake .. -make install - -cd .. -cd install -ls -FR - -cd .. -cd .. - - -cd ticpp/ -mkdir build -cd build -cmake .. -make -j8 -cd .. -cd .. - - - -cd urdfdom/ -mkdir build -mkdir install -cd build -cmake .. -make install -cd .. -cd .. - - -cd flann-1.9.1/ -mkdir build -mkdir install -cd build -cmake .. -make install -cd .. -cd .. - - -#cd VTK/ -#mkdir build -#mkdir install -#cp -r ExternalData/ build/ -#cd build -#cmake .. -#make install -#cd .. -#cd .. - - - -cd pcl/ -mkdir build -mkdir install -cd build -cmake .. -make install - -cd .. -cd .. - - -cd ogre/ -#mkdir build -mkdir install -cd build -cmake .. -make install -cd .. -cd .. - - - - - - - - - - -# 3rdparty -cd .. -cd .. - - - -#compile -./src/catkin/bin/catkin_make_isolated - -cat /home/abuild/rpmbuild/BUILD/cartographer_ros-1.0.0/devel_isolated/cartographer/share/cartographer/cartographer-config.cmake - - -#install -mkdir -p %{buildroot}/opt/ros/melodic/ -cp -r devel_isolated/* %{buildroot}/opt/ros/melodic/ - -echo %{buildroot} - +# Needed to bootstrap since the ros_workspace package does not yet exist. +export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages + +# In case we're installing to a non-standard location, look for a setup.sh +# in the install tree and source it. It will set things like +# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH. +if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi +%make_install -C .obj-%{_target_platform} + +%if 0%{?with_tests} +%check +# Needed to bootstrap since the ros_workspace package does not yet exist. +export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages + +# Look for a Makefile target with a name indicating that it runs tests +TEST_TARGET=$(%__make -qp -C .obj-%{_target_platform} | sed "s/^\(test\|check\):.*/\\1/;t f;d;:f;q0") +if [ -n "$TEST_TARGET" ]; then +# In case we're installing to a non-standard location, look for a setup.sh +# in the install tree and source it. It will set things like +# CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH. +if [ -f "/opt/ros/%{ros_distro}/setup.sh" ]; then . "/opt/ros/%{ros_distro}/setup.sh"; fi +CTEST_OUTPUT_ON_FAILURE=1 \ + %make_build -C .obj-%{_target_platform} $TEST_TARGET || echo "RPM TESTS FAILED" +else echo "RPM TESTS SKIPPED"; fi +%endif %files -#%defattr(-,root,root) -#/opt/ros/melodic/* -/opt/ros/melodic/* -#/usr/lib/share/catkin/cmake/* +/opt/ros/%{ros_distro} %changelog -* Mon Aug 8 2022 Chenyx - 1.0.0-1 -- License compliance rectification - -* Thu May 28 2020 openEuler Buildteam - 19.4-1 -- Package init - +* Thu Nov 14 2024 Your Name - 2.0.9003-1 +- Initial build with custom patches for thread safety +- Add thread_annotations_fix.h and metrics collection files +- Fix tf2/utils.h header issue diff --git a/collect_metrics_flag.h b/collect_metrics_flag.h new file mode 100644 index 0000000000000000000000000000000000000000..ce5704f54f91f9eee1761481a4f1ffe9d688cdf5 --- /dev/null +++ b/collect_metrics_flag.h @@ -0,0 +1,17 @@ +#ifndef CARTOGRAPHER_ROS_METRICS_COLLECT_METRICS_FLAG_H_ +#define CARTOGRAPHER_ROS_METRICS_COLLECT_METRICS_FLAG_H_ + +#include + +// Metrics flags +DECLARE_bool(collect_metrics); +DECLARE_bool(load_frozen_state); + +// Shared configuration flags +DECLARE_string(configuration_directory); +DECLARE_string(load_state_filename); +DECLARE_string(save_state_filename); +DECLARE_string(configuration_basename); + +#endif // CARTOGRAPHER_ROS_METRICS_COLLECT_METRICS_FLAG_H_ + diff --git a/collect_metrics_flags.cc b/collect_metrics_flags.cc new file mode 100644 index 0000000000000000000000000000000000000000..ff62db8b173e6e21e307ba2822c9bbb93f55b43b --- /dev/null +++ b/collect_metrics_flags.cc @@ -0,0 +1,19 @@ +#include + +// Metrics flags +DEFINE_bool(collect_metrics, false, "Enable metrics"); +DEFINE_bool(load_frozen_state, true, "Load frozen state before new trajectory"); + +// Shared configuration flags +DEFINE_string(configuration_directory, "", + "First directory in which configuration files are searched, " + "second is always the Cartographer installation to allow " + "including files from there."); +DEFINE_string(load_state_filename, "", + "If non-empty, filename of a .pbstream file to load, containing " + "a saved SLAM state."); +DEFINE_string(save_state_filename, "", + "If non-empty, serialize state and write it to disk before shutting down."); +DEFINE_string(configuration_basename, "", + "Basename, i.e. not containing any directory prefix, of the " + "configuration file."); diff --git a/thread_annotations_fix.h b/thread_annotations_fix.h new file mode 100644 index 0000000000000000000000000000000000000000..6de6faa12ae7fbe1dd83082f137ddca82f56e8ef --- /dev/null +++ b/thread_annotations_fix.h @@ -0,0 +1,61 @@ +#ifndef THREAD_ANNOTATIONS_FIX_H +#define THREAD_ANNOTATIONS_FIX_H + +// 定义所有缺失的线程注解宏为空操作 +#ifndef LOCKS_EXCLUDED +#define LOCKS_EXCLUDED(...) +#endif + +#ifndef GUARDED_BY +#define GUARDED_BY(x) +#endif + +#ifndef EXCLUSIVE_LOCKS_REQUIRED +#define EXCLUSIVE_LOCKS_REQUIRED(...) +#endif + +#ifndef SHARED_LOCKS_REQUIRED +#define SHARED_LOCKS_REQUIRED(...) +#endif + +#ifndef ACQUIRED_BEFORE +#define ACQUIRED_BEFORE(...) +#endif + +#ifndef ACQUIRED_AFTER +#define ACQUIRED_AFTER(...) +#endif + +#ifndef REQUIRES +#define REQUIRES(...) +#endif + +#ifndef ACQUIRE +#define ACQUIRE(...) +#endif + +#ifndef RELEASE +#define RELEASE(...) +#endif + +#ifndef EXCLUDES +#define EXCLUDES(...) +#endif + +#ifndef ASSERT_EXCLUSIVE_LOCK +#define ASSERT_EXCLUSIVE_LOCK(...) +#endif + +#ifndef ASSERT_SHARED_LOCK +#define ASSERT_SHARED_LOCK(...) +#endif + +#ifndef RETURN_CAPABILITY +#define RETURN_CAPABILITY(x) +#endif + +#ifndef NO_THREAD_SAFETY_ANALYSIS +#define NO_THREAD_SAFETY_ANALYSIS +#endif + +#endif // THREAD_ANNOTATIONS_FIX_H