meta-ros/recipes-ros/catkin/files/0001-allow-proper-cross-com...

174 lines
6.9 KiB
Diff

From 5de0fe25ec27bca4c593e06cdc0c3dff3d553e06 Mon Sep 17 00:00:00 2001
From: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Date: Sun, 15 Apr 2018 02:11:42 +0200
Subject: [PATCH] allow proper cross-compilation with catkin
The original patch is:
From: Dominique Hunziker <dominique.hunziker@gmail.com>
Date: Fri, 2 Jun 2017 12:12:33 +0200
I just re-applied it to the current version 0.6.19 and adjusted
the context of the patch as reaction to bitbake warning:
WARNING: catkin-runtime-0.6.19-r0 do_patch:
Some of the context lines in patches were ignored. This can lead to incorrectly applied patches.
Upstream-Status: Pending
Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
---
cmake/all.cmake | 1 +
cmake/catkin_package.cmake | 8 ++++++
cmake/catkin_strip_root_path.cmake | 32 +++++++++++++++++++++++
cmake/templates/pkgConfig.cmake.in | 42 +++++++++++++++++++++++++++---
4 files changed, 79 insertions(+), 4 deletions(-)
create mode 100644 cmake/catkin_strip_root_path.cmake
diff --git a/cmake/all.cmake b/cmake/all.cmake
index 6910906..e421b76 100644
--- a/cmake/all.cmake
+++ b/cmake/all.cmake
@@ -118,6 +118,7 @@ foreach(filename
catkin_metapackage
catkin_package
catkin_package_xml
+ catkin_strip_root_path
catkin_workspace
debug_message
em_expand
diff --git a/cmake/catkin_package.cmake b/cmake/catkin_package.cmake
index 8ef6c48..d6bc68f 100644
--- a/cmake/catkin_package.cmake
+++ b/cmake/catkin_package.cmake
@@ -432,6 +432,14 @@ function(_catkin_package)
# package cmake dir is the folder where the generated pkgConfig.cmake is located
set(PKG_CMAKE_DIR "\${${PROJECT_NAME}_DIR}")
+ if(CMAKE_CROSSCOMPILING)
+ catkin_strip_root_path(PROJECT_CMAKE_CONFIG_INCLUDE_DIRS UNIQUE)
+ catkin_strip_root_path(PROJECT_PKG_CONFIG_INCLUDE_DIRS UNIQUE)
+ catkin_strip_root_path(PKG_CONFIG_LIBRARIES)
+ catkin_strip_root_path(PKG_CONFIG_LIBRARIES_WITH_PREFIX)
+ catkin_strip_root_path(PKG_CONFIG_LIB_PATHS UNIQUE)
+ endif()
+
if(NOT PROJECT_SKIP_PKG_CONFIG_GENERATION)
# ensure that output folder exists
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/installspace)
diff --git a/cmake/catkin_strip_root_path.cmake b/cmake/catkin_strip_root_path.cmake
new file mode 100644
index 0000000..ca5c453
--- /dev/null
+++ b/cmake/catkin_strip_root_path.cmake
@@ -0,0 +1,32 @@
+#
+# Strip CMAKE_FIND_ROOT_PATH prefixes from each path in the list ``var``.
+#
+# .. note:: Used for cross-compilation.
+#
+# :param var: the input / output variable name
+# :type var: string
+# :param UNIQUE: if specified the stripped list will contain unique paths, i.e.,
+# duplicate paths are not appended a second time
+# :type UNIQUE: option
+#
+function(catkin_strip_root_path var)
+ cmake_parse_arguments(ARG "UNIQUE" "" "" ${ARGN})
+ set(output)
+ foreach(element ${${var}})
+ if(IS_ABSOLUTE ${element})
+ foreach(root_path ${CMAKE_FIND_ROOT_PATH})
+ if(element MATCHES "^${root_path}/")
+ string(LENGTH ${root_path} root_path_length)
+ string(SUBSTRING ${element} ${root_path_length} -1 element)
+ break()
+ endif()
+ endforeach()
+ endif()
+ if(ARG_UNIQUE)
+ list_append_unique(output ${element})
+ else()
+ list(APPEND output ${element})
+ endif()
+ endforeach()
+ set(${var} ${output} PARENT_SCOPE)
+endfunction()
diff --git a/cmake/templates/pkgConfig.cmake.in b/cmake/templates/pkgConfig.cmake.in
index d99b811..3af5c71 100644
--- a/cmake/templates/pkgConfig.cmake.in
+++ b/cmake/templates/pkgConfig.cmake.in
@@ -78,6 +78,15 @@ else()
set(@PROJECT_NAME@_PREFIX ${@PROJECT_NAME@_INSTALL_PREFIX})
endif()
+if(CMAKE_CROSSCOMPILING)
+ if("@DEVELSPACE@" STREQUAL "TRUE")
+ # can not disable host filesystem altogether; otherwise files in src/devel are no longer found
+ set(_find_root_path_both CMAKE_FIND_ROOT_PATH_BOTH)
+ else()
+ set(_find_root_path_both)
+ endif()
+endif()
+
# warn when using a deprecated package
if(NOT "@PROJECT_DEPRECATED@" STREQUAL "")
set(_msg "WARNING: package '@PROJECT_NAME@' is deprecated")
@@ -95,7 +104,19 @@ if(NOT "@PROJECT_CMAKE_CONFIG_INCLUDE_DIRS@ " STREQUAL " ")
set(@PROJECT_NAME@_INCLUDE_DIRS "")
set(_include_dirs "@PROJECT_CMAKE_CONFIG_INCLUDE_DIRS@")
foreach(idir ${_include_dirs})
- if(IS_ABSOLUTE ${idir} AND IS_DIRECTORY ${idir})
+ if(IS_ABSOLUTE ${idir} AND CMAKE_CROSSCOMPILING)
+ get_filename_component(idir_path ${idir} DIRECTORY)
+ get_filename_component(idir_name ${idir} NAME)
+ set(include_dir_path "include_dir_path-NOTFOUND")
+ # use find_path to locate absolute path nested under potential root path
+ find_path(include_dir_path ${idir_name}
+ PATHS ${idir_path}
+ NO_DEFAULT_PATH ${_find_root_path_both})
+ if(NOT include_dir_path)
+ message(FATAL_ERROR "Project '@PROJECT_NAME@' specifies '${idir}' as an include dir, which is not found. It does not exist in any of the root filesystems. Ask the maintainer '@PROJECT_MAINTAINER@' to fix it.")
+ endif()
+ set(include "${include_dir_path}/${idir_name}")
+ elseif(IS_ABSOLUTE ${idir} AND IS_DIRECTORY ${idir})
set(include ${idir})
elseif("${idir} " STREQUAL "@CATKIN_GLOBAL_INCLUDE_DESTINATION@ ")
get_filename_component(include "${@PROJECT_NAME@_DIR}/../../../@CATKIN_GLOBAL_INCLUDE_DESTINATION@" ABSOLUTE)
@@ -116,18 +137,31 @@ foreach(library ${libraries})
list(APPEND @PROJECT_NAME@_LIBRARIES ${library})
elseif(TARGET ${library})
list(APPEND @PROJECT_NAME@_LIBRARIES ${library})
+ elseif(IS_ABSOLUTE ${library} AND CMAKE_CROSSCOMPILING)
+ get_filename_component(lib_path ${library} DIRECTORY)
+ get_filename_component(lib_name ${library} NAME)
+ set(lib "lib-NOTFOUND")
+ # use find_library to locate library given by absolute path nested under potential root path
+ find_library(lib ${lib_name}
+ PATHS ${lib_path}
+ NO_DEFAULT_PATH ${_find_root_path_both})
+ if(NOT lib)
+ message(FATAL_ERROR "Project '${PROJECT_NAME}' tried to find library '${library}'. The library is neither a target nor built/installed properly. Did you compile project '@PROJECT_NAME@'? Did you find_package() it before the subdirectory containing its code is included?")
+ endif()
+ _list_append_unique(@PROJECT_NAME@_LIBRARY_DIRS ${lib_path})
+ list(APPEND @PROJECT_NAME@_LIBRARIES ${lib})
elseif(IS_ABSOLUTE ${library})
list(APPEND @PROJECT_NAME@_LIBRARIES ${library})
else()
set(lib_path "")
- set(lib "${library}-NOTFOUND")
+ set(lib "lib-NOTFOUND")
# since the path where the library is found is returned we have to iterate over the paths manually
foreach(path @PKG_CONFIG_LIB_PATHS@)
find_library(lib ${library}
PATHS ${path}
- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
+ NO_DEFAULT_PATH ${_find_root_path_both})
if(lib)
- set(lib_path ${path})
+ get_filename_component(lib_path ${lib} DIRECTORY)
break()
endif()
endforeach()