Crosscompiling ROS into relocatable code

asked 2017-04-28 16:40:33 -0500

antipattern gravatar image


I am currently working on cross-compiling the ROS dependencies I need for a project for a Raspberry Pi 3. After a bit of work I got it working. I install to the default location and later build a .deb package which copies the code to /opt/ros/kinetic on the target system.

My problem is that the generated files, specificly the <package>-config.cmake files, contain references to directories in the installation-path. I don't know how to avoid this, since I cannot set the install-path to the correct location (it's not writable for me) so that I need to use an intermediate directory. I thought about using the DESTDIR environment variable or the CMAKE_STAGIN_PREFIX but I don't know which would be the correct one or whether catkin adheres these variables. Any help is very welcome!

I crosscompile by simply passing this toolchain file to catkin:


SET(CMAKE_C_COMPILER ${RASPI_TOOLCHAIN}/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER ${RASPI_TOOLCHAIN}/bin/arm-linux-gnueabihf-g++)

# Workarounds:
# Not populated automaticaly

# rootfs/usr/include/arm-linux-gnueabihf not included
INCLUDE_DIRECTORIES(SYSTEM ${CMAKE_FIND_ROOT_PATH}/usr/include/arm-linux-gnueabihf)

# Compilerselftest fails, rootfs/usr/lib/arm-linux-gnueabihf is not linked against, only 
# Symlink from rootfs/usr/lib/arm-linux-gnueabihf/4.9.3 to rootfs/usr/lib/arm-linux-gnueabihf

# /usr/lib/arm-linux-gnueabif instead of rootfs/usr/lib/arm-linux-gnueabif is added to the rpath for some packages
#   -> happens when sysroot is prefix of runtime-dir:
# rootfs/lib/arm-linux-gnueabihf is not present in the rpath
set(CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG "-Wl,-rpath,${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf:${CMAKE_FIND_ROOT_PATH}/usr/lib/arm-linux-gnueabihf:" CACHE STRING "" FORCE)
set(CMAKE_EXECUTABLE_RUNTIME_CXX_FLAG "-Wl,-rpath,${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf:${CMAKE_FIND_ROOT_PATH}/usr/lib/arm-linux-gnueabihf:" CACHE STRING "" FORCE)

# console_bridge & urdfdom returns /usr/include as <name>_INCLUDE_DIRS (
# Use modified find{console_bridge,urdfdom}.cmake (find_path)
# GTest adds host /usr/include to include directories
# remove NO_CMAKE_FIND_ROOT_PATH from find_path calls in src/catkin/cmake/tests/gtest.cmake

# pkg config looks up packages on the hostsystem
set(ENV{PKG_CONFIG_LIBDIR} "${CMAKE_FIND_ROOT_PATH}/usr/lib/pkgconfig:${CMAKE_FIND_ROOT_PATH}/usr/share/pkgconfig")

I was thinking about using the DESTDIR environment variable or CMAKE_STAGING_PREFIX to make the generated code relocatable but I am not sure which is the right one to use or whether they work with catkin.

edit retag flag offensive close merge delete


I'm not sure about CMAKE_STAGING_PREFIX but I know people have used DESTDIR with catkin before because we had to fix some things in the tools in order to support it.

William gravatar imageWilliam ( 2017-04-28 16:43:10 -0500 )edit

In general the generated <package>-config.cmake files should not contain absolute paths. Can you please add the information for which packages that is the case.

Dirk Thomas gravatar imageDirk Thomas ( 2017-04-28 16:47:41 -0500 )edit

I tried using DESTDIR which fixed some of my issues. There is still a lot of files which contain the absolute install-directory. Most of it is commented out, but the generated CMake configs use it for the library-lookup:

antipattern gravatar imageantipattern ( 2017-05-05 04:07:21 -0500 )edit

Please mention specific files with specific content for others to be able to help. "still a lot of files which contain the absolute install-directory" makes it difficult to give you any feedback. I also don't know that the referenced "library-lookup" snippet is about. Maybe you can clarify.

Dirk Thomas gravatar imageDirk Thomas ( 2017-05-09 13:57:13 -0500 )edit

For example, the generated roscppConfig.cmake contains absolute paths referring to my rootfs (CMAKE_SYSROOT) and the workspace I am building in: . I replaced the paths by ROOTFS and WORKSPACE. The install-prefix is set to /opt/ros/kinetic and the DESTDIR is install_isolated.

antipattern gravatar imageantipattern ( 2017-05-10 12:50:34 -0500 )edit