Patchwork cmake.bbclass: set the rpath for native binaries build with cmake

login
register
mail settings
Submitter Simon Busch
Date May 4, 2011, 4:55 p.m.
Message ID <1304528108-5217-1-git-send-email-morphis@gravedo.de>
Download mbox | patch
Permalink /patch/3195/
State Accepted
Headers show

Comments

Simon Busch - May 4, 2011, 4:55 p.m.
In the default configuration cmake does not set a rpath for its builded binaries. This
leads to errors at runtime when the binaries not find their needed runtime libraries.
Please note that this is only done for recipes inheriting the native class!

Signed-off-by: Simon Busch <morphis@gravedo.de>
---
 classes/cmake.bbclass |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)
Simon Busch - May 4, 2011, 8:46 p.m.
On 04.05.2011 18:55, Simon Busch wrote:
> In the default configuration cmake does not set a rpath for its builded binaries. This
> leads to errors at runtime when the binaries not find their needed runtime libraries.
> Please note that this is only done for recipes inheriting the native class!
> 
> Signed-off-by: Simon Busch <morphis@gravedo.de>
> ---
>  classes/cmake.bbclass |   11 +++++++++++
>  1 files changed, 11 insertions(+), 0 deletions(-)
> 
> diff --git a/classes/cmake.bbclass b/classes/cmake.bbclass
> index 40fadea..e8e485a 100644
> --- a/classes/cmake.bbclass
> +++ b/classes/cmake.bbclass
> @@ -24,6 +24,13 @@ OECMAKE_CXX_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${TARGET_CPPFLAGS} -f
>  OECMAKE_C_FLAGS_RELEASE ?= "${SELECTED_OPTIMIZATION} -DNDEBUG"
>  OECMAKE_CXX_FLAGS_RELEASE ?= "${SELECTED_OPTIMIZATION} -DNDEBUG"
>  
> +OECMAKE_RPATH ?= ""
> +python __anonymous() {
> +    # Only set OECMAKE_RPATH if we build a native recipe
> +    if bb.data.inherits_class('native', d) and not bb.data.inherits_class('cross', d):
> +        bb.data.setVar('OECMAKE_RPATH', '${libdir}', d)
> +}
> +
>  cmake_do_generate_toolchain_file() {
>  # CMake system name must be something like "Linux".
>  # This is important for cross-compiling.
> @@ -44,6 +51,10 @@ cmake_do_generate_toolchain_file() {
>    echo "set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )" >> ${WORKDIR}/toolchain.cmake
>  # Use qt.conf settings
>    echo "set( ENV{QT_CONF_PATH} ${WORKDIR}/qt.conf )" >> ${WORKDIR}/toolchain.cmake
> +
> +# We need to set the rpath to the correct directory as cmake does not provide any
> +# directory as rpath by default
> +  echo "set( CMAKE_INSTALL_RPATH ${OECMAKE_RPATH} )" >> ${WORKDIR}/toolchain.cmake
>  }
>  
>  addtask generate_toolchain_file after do_patch before do_configure


To proof this: I tested it with native and non-native recipes (all
builded with cmake.bbclass) and grep'ed through the resulting binaries
afterwards to be sure there is a rpath in the native ones (and the
correct one) and no one in the non native recipes:

morphis@nirvana ...root/tmp/sysroots/x86_64-linux/usr/bin % objdump -x
generatorrunner | grep RPATH
  RPATH                $ORIGIN/../lib:$ORIGIN/../lib

morphis@nirvana ...libshiboken-1.0.2-r0.0/package/usr/lib % pwd
/home/morphis/oe/buildroot/tmp/work/armv7a-oe-linux-gnueabi/libshiboken-1.0.2-r0.0/package/usr/lib
morphis@nirvana ...libshiboken-1.0.2-r0.0/package/usr/lib % objdump -x
libshiboken-python2.6.so.1.0.2 | grep RPATH
1 morphis@nirvana ...libshiboken-1.0.2-r0.0/package/usr/lib %

[...]

regards,
Simon

Patch

diff --git a/classes/cmake.bbclass b/classes/cmake.bbclass
index 40fadea..e8e485a 100644
--- a/classes/cmake.bbclass
+++ b/classes/cmake.bbclass
@@ -24,6 +24,13 @@  OECMAKE_CXX_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${TARGET_CPPFLAGS} -f
 OECMAKE_C_FLAGS_RELEASE ?= "${SELECTED_OPTIMIZATION} -DNDEBUG"
 OECMAKE_CXX_FLAGS_RELEASE ?= "${SELECTED_OPTIMIZATION} -DNDEBUG"
 
+OECMAKE_RPATH ?= ""
+python __anonymous() {
+    # Only set OECMAKE_RPATH if we build a native recipe
+    if bb.data.inherits_class('native', d) and not bb.data.inherits_class('cross', d):
+        bb.data.setVar('OECMAKE_RPATH', '${libdir}', d)
+}
+
 cmake_do_generate_toolchain_file() {
 # CMake system name must be something like "Linux".
 # This is important for cross-compiling.
@@ -44,6 +51,10 @@  cmake_do_generate_toolchain_file() {
   echo "set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )" >> ${WORKDIR}/toolchain.cmake
 # Use qt.conf settings
   echo "set( ENV{QT_CONF_PATH} ${WORKDIR}/qt.conf )" >> ${WORKDIR}/toolchain.cmake
+
+# We need to set the rpath to the correct directory as cmake does not provide any
+# directory as rpath by default
+  echo "set( CMAKE_INSTALL_RPATH ${OECMAKE_RPATH} )" >> ${WORKDIR}/toolchain.cmake
 }
 
 addtask generate_toolchain_file after do_patch before do_configure