This document is place for problems encountered while developing ROS for Android and their solutions.
bison
Android intentionally doesn't impelement the necessary APIs.
[ 74%] Performing build step for 'deps-iceoryx_hoofs'
[ 2%] Building CXX object platform/CMakeFiles/iceoryx_platform.dir/unix/source/file.cpp.o
[ 4%] Building CXX object platform/CMakeFiles/iceoryx_platform.dir/unix/source/fnctl.cpp.o
[ 6%] Building CXX object platform/CMakeFiles/iceoryx_platform.dir/unix/source/grp.cpp.o
[ 8%] Building CXX object platform/CMakeFiles/iceoryx_platform.dir/unix/source/mman.cpp.o
/home/sloretz/android_ros/deps/iceoryx/iceoryx_hoofs/platform/unix/source/mman.cpp:22:12: error: use of undeclared identifier 'shm_open'
return shm_open(name, oflag, mode);
^
/home/sloretz/android_ros/deps/iceoryx/iceoryx_hoofs/platform/unix/source/mman.cpp:28:12: error: use of undeclared identifier 'shm_unlink'
return shm_unlink(name);
In the 0.8.x release it has a tool ddsconf
that needs to exist on the native machine.
I think this means two projects: one building the ddsconf executable locally.
They take a CMake argument -DENABLE_SSL=OFF
to turn off SSL support.
If the native build supports SSL, but the cross compiled does not, then compile erros result because the native ddsconf tool assumes SSL support
[ 43%] Building C object src/core/CMakeFiles/ddsc.dir/defconfig.c.o
/home/sloretz/android_ros/build/deps-cyclonedds-prefix/src/deps-cyclonedds-build/src/core/defconfig.c:83:8: error: no member named 'ssl_verify' in 'struct ddsi_config'
cfg->ssl_verify = INT32_C (1);
~~~ ^
/home/sloretz/android_ros/build/deps-cyclonedds-prefix/src/deps-cyclonedds-build/src/core/defconfig.c:84:8: error: no member named 'ssl_verify_client' in 'struct ddsi_config'
cfg->ssl_verify_client = INT32_C (1);
~~~ ^
/home/sloretz/android_ros/build/deps-cyclonedds-prefix/src/deps-cyclonedds-build/src/core/defconfig.c:85:8: error: no member named 'ssl_keystore' in 'struct ddsi_config'
cfg->ssl_keystore = "keystore";
~~~ ^
/home/sloretz/android_ros/build/deps-cyclonedds-prefix/src/deps-cyclonedds-build/src/core/defconfig.c:86:8: error: no member named 'ssl_key_pass' in 'struct ddsi_config'
cfg->ssl_key_pass = "secret";
~~~ ^
/home/sloretz/android_ros/build/deps-cyclonedds-prefix/src/deps-cyclonedds-build/src/core/defconfig.c:87:8: error: no member named 'ssl_ciphers' in 'struct ddsi_config'
cfg->ssl_ciphers = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
~~~ ^
/home/sloretz/android_ros/build/deps-cyclonedds-prefix/src/deps-cyclonedds-build/src/core/defconfig.c:88:8: error: no member named 'ssl_rand_file' in 'struct ddsi_config'
cfg->ssl_rand_file = "";
~~~ ^
/home/sloretz/android_ros/build/deps-cyclonedds-prefix/src/deps-cyclonedds-build/src/core/defconfig.c:89:8: error: no member named 'ssl_min_version' in 'struct ddsi_config'
cfg->ssl_min_version.major = 1;
~~~ ^
/home/sloretz/android_ros/build/deps-cyclonedds-prefix/src/deps-cyclonedds-build/src/core/defconfig.c:90:8: error: no member named 'ssl_min_version' in 'struct ddsi_config'
cfg->ssl_min_version.minor = 3;
~~~ ^
The catkin_pkg.topological_order.topological_order
function does seem to order by exported dependencies, but the exported package objects don't have that information built in.
I had to make the generate_ros_superbuild.py
script transitively lookup exported dependencies somake -jN
on the superbuild would work.
rcl_yaml_param_parser
can't find yamlConfig.cmake
because of the way I've written dep_build
to install packages to separate folders.
CMake can find a package with <prefix>/<name>*/(cmake|CMake)/
, but the <name>
here is libyaml_vendor
instead of yaml
.
I worked around it by passing -Dyaml_DIR
to all downstream packages.
CMake Error at /home/sloretz/android_ros/build/deps/rosidl_typesupport_c/share/rosidl_typesupport_c/cmake/get_used_typesupports.cmake:35 (message):
No 'rosidl_typesupport_c' found
Call Stack (most recent call first):
/home/sloretz/android_ros/build/deps/rosidl_typesupport_c/share/rosidl_typesupport_c/cmake/rosidl_typesupport_c-extras.cmake:8 (get_used_typesupports)
/home/sloretz/android_ros/build/deps/rosidl_typesupport_c/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)
/home/sloretz/android_ros/build/deps/rosidl_default_generators/share/rosidl_default_generators/cmake/rosidl_default_generators-extras.cmake:21 (find_package)
/home/sloretz/android_ros/build/deps/rosidl_default_generators/share/rosidl_default_generators/cmake/rosidl_default_generatorsConfig.cmake:41 (include)
CMakeLists.txt:14 (find_package)
I'll work around it by setting AMENT_PREFIX_PATH
in dep-build.
I could also work around this by using a "merged" install space.
I'm installing Python packages with PIP into deps/_python_
, but CMake packages are installed to deps/${name}
How do I update PYTHONPATH for CMake packages that install Python modules?
Ament feature to override python install dir?
It looks like PYTHON_INSTALL_DIR
will do what I want.
CMake Error at /home/sloretz/android_ros/build/deps/rosidl_adapter/share/rosidl_adapter/cmake/rosidl_adapt_interfaces.cmake:59 (message):
execute_process(/usr/bin/python3.8 -m rosidl_adapter --package-name
builtin_interfaces --arguments-file
/home/sloretz/android_ros/build/deps-builtin_interfaces-prefix/src/deps-builtin_interfaces-build/rosidl_adapter__arguments__builtin_interfaces.json
--output-dir
/home/sloretz/android_ros/build/deps-builtin_interfaces-prefix/src/deps-builtin_interfaces-build/rosidl_adapter/builtin_interfaces
--output-file
/home/sloretz/android_ros/build/deps-builtin_interfaces-prefix/src/deps-builtin_interfaces-build/rosidl_adapter/builtin_interfaces.idls)
returned error code 1:
/usr/bin/python3.8: No module named rosidl_adapter
Call Stack (most recent call first):
/home/sloretz/android_ros/build/deps/rosidl_cmake/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:130 (rosidl_adapt_interfaces)
CMakeLists.txt:16 (rosidl_generate_interfaces)
CMake Error at /home/sloretz/android_ros/build/deps/rosidl_generator_c/share/rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake:69 (message):
Target dependency
'/home/sloretz/android_ros/build/deps/rosidl_generator_c/share/rosidl_generator_c/cmake/../../..//home/sloretz/android_ros/build/deps/_python_/rosidl_generator_c/__init__.py'
does not exist
Call Stack (most recent call first):
/home/sloretz/android_ros/build/deps/ament_cmake_core/share/ament_cmake_core/cmake/core/ament_execute_extensions.cmake:48 (include)
/home/sloretz/android_ros/build/deps/rosidl_cmake/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:286 (ament_execute_extensions)
CMakeLists.txt:16 (rosidl_generate_interfaces)
I'm not sure how the rosidl generator inputs are supposed to work.
add_custom_command
runs at build time, so the PYTHONPATH given to the CMake invocation
is not necessarily available to the make invocation.
I'll work around this by making dep_build
set PYTHONPATH
in the build command.
Maybe the rosidl generators should pass the ENV at CMake time to the Python process?
[ 5%] Generating C code for ROS interfaces SLORETZ /home/sloretz/android_ros/build/deps/_python_
[ 11%] Generating C++ code for ROS interfaces
['/home/sloretz/android_ros/build/deps/rosidl_generator_c/lib/rosidl_generator_c', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']
['/home/sloretz/android_ros/build/deps/rosidl_generator_c/share/rosidl_generator_c/cmake/../../../lib/rosidl_generator_c/rosidl_generator_c', '--generator-arguments-file', '/home/sloretz/android_ros/build/deps-builtin_interfaces-prefix/src/deps-builtin_interfaces-build/rosidl_generator_c__arguments.json']
Traceback (most recent call last):
File "/home/sloretz/android_ros/build/deps/rosidl_generator_c/share/rosidl_generator_c/cmake/../../../lib/rosidl_generator_c/rosidl_generator_c", line 11, in <module>
from rosidl_generator_c import generate_c
ModuleNotFoundError: No module named 'rosidl_generator_c'
CMakeFiles/builtin_interfaces__rosidl_generator_c.dir/build.make:87: recipe for target 'rosidl_generator_c/builtin_interfaces/msg/duration.h' failed
rosidl_typesupport_c
when found tries to find other typesupports that use it.
If not, it has a fatal error.
The only package in this workspace that uses it is rosidl_typesupport_introspection_c
.
This means rosidl_typesupport_cpp
can't find_package(rosidl_typesupport_c
until after rosidl_typesupport_introspection_c
is built.
CMake Error at /home/sloretz/android_ros/build/deps/rosidl_typesupport_c/share/rosidl_typesupport_c/cmake/get_used_typesupports.cmake:35 (message):
No 'rosidl_typesupport_c' found
Call Stack (most recent call first):
/home/sloretz/android_ros/build/deps/rosidl_typesupport_c/share/rosidl_typesupport_c/cmake/rosidl_typesupport_c-extras.cmake:8 (get_used_typesupports)
/home/sloretz/android_ros/build/deps/rosidl_typesupport_c/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)
CMakeLists.txt:20 (find_package)
-- Configuring incomplete, errors occurred!
See also "/home/sloretz/android_ros/build/deps-rosidl_typesupport_cpp-prefix/src/deps-rosidl_typesupport_cpp-build/CMakeFiles/CMakeOutput.log".
Might need an android specific logger.
I'll use the noop logging for now.
It looks like the CMake variable RCL_LOGGING_IMPLEMENTATION
is the one I need to set.
05-07 15:15:43.986 2980 3006 E libc++abi: terminating with uncaught exception of type rclcpp::exceptions::RCLError: failed to configure logging: Failed to get logging directory, at /home/sloretz/android_ros/deps/rcl_logging/rcl_logging_spdlog/src/rcl_logging_spdlog.cpp:83
05-07 15:29:28.641 3452 3486 E libc++abi: terminating with uncaught exception of type rclcpp::exceptions::RCLError: failed to initialize rcl node: rcl node's rmw handle is invalid, at /home/sloretz/android_ros/deps/rcl/rcl/src/rcl/node.c:416
This was caused by not having the permissions needed to access the network. Adding those permissions to the manifest fixed it.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />