Stephen Kelly wrote:

> However, the Raspberry Pi has libz.so in some funny locations:
> 
> stephen@hal:~/rpi/rasp-pi-rootfs$ find -name "*libz*"
> ./lib/arm-linux-gnueabihf/libz.so.1
> ./lib/arm-linux-gnueabihf/libz.so.1.2.7
> ./usr/lib/arm-linux-gnueabihf/libz.so
> ./usr/lib/arm-linux-gnueabihf/libz.a

This doesn't affect only Qt, but could affect any CMake user trying to use a 
library which depends on zlib on the Raspberry Pi.

 find_package(ZLIB REQUIRED)
 include_directories(${ZLIB_INCLUDE_DIRS})

 if (NOT USE_FOO)
   add_library(foo SHARED foo.cpp)
   target_link_libraries(foo LINK_PRIVATE ${ZLIB_LIBRARIES})

   export(TARGETS foo NAMESPACE FOO:: FILE fooTarget.cmake)

 else()
   set(CMAKE_INCLUDE_CURRENT_DIR ON)

   include("${CMAKE_CURRENT_BINARY_DIR}/fooTarget.cmake")

   set_property(TARGET FOO::foo APPEND PROPERTY 
IMPORTED_LINK_DEPENDENT_LIBRARIES_NOCONFIG "${ZLIB_LIBRARIES}")

 #   set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,-rpath-link,
${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf")

   add_executable(bar foo_user.cpp)
   target_link_libraries(bar FOO::foo)
 endif()

If execute that once with -DUSE_FOO=0 (and then make) and again with -
DUSE_FOO=1, the second make fails with 

 $ make
 makeobj[0]: Entering directory `/home/stephen/dev/src/playground/cmake/rpi'
 Linking CXX executable bar
 /home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/bin/../lib/gcc/arm-linux-
gnueabihf/4.7.2/../../../../arm-linux-gnueabihf/bin/ld: warning: libz.so.1, 
needed by libfoo.so, not found (try using -rpath or -rpath-link)
 CMakeFiles/bar.dir/empty.cpp.o: In function `main':
 empty.cpp:(.text+0x28): undefined reference to `compress2'
 collect2: error: ld returned 1 exit status
 make[2]: *** [bar] Error 1
 make[1]: *** [CMakeFiles/bar.dir/all] Error 2
 make: *** [all] Error 2
 makeobj[0]: Leaving directory `/home/stephen/dev/src/playground/cmake/rpi'


I can 'fix' that by uncommenting the line which adds a manual -rpath-link 
entry to the link flags. I don't think that's a very good fix though. 
Another workaround would be to also find and add the path to /lib/arm-linux-
gnueabihf/libz.so.1, in addition to the /usr/lib/arm-linux-gnueabihf/libz.so 
already found by FindZLIB.cmake and put that in the 
IMPORTED_LINK_DEPENDENT_LIBRARIES too. That's basically what I described in 
my initial mail.

I tried adding the needed directory to 
IMPORTED_LINK_DEPENDENT_LIBRARIES_NOCONFIG, but that didn't add to the 
rpath-link entries either:

  set_property(TARGET FOO::foo APPEND PROPERTY 
    IMPORTED_LINK_DEPENDENT_LIBRARIES_NOCONFIG 
      "${ZLIB_LIBRARIES}" 
      "/lib/arm-linux-gnueabihf"
 )

Do you think it should? At least that would be easier from a point of view 
of using the information from the Qt mkspec files, which lists the 
directories required to be in rpath-link already.

I also notice that IMPORTED_LINK_DEPENDENT_LIBRARIES_* entries are only 
populated on export for targets, not for 'raw' targets. So 

 target_link_libraries(foo LINK_PRIVATE /lib/libz.so)

will not add /lib/libz.so to the IMPORTED_LINK_DEPENDENT_LIBRARIES_* on 
export. Should it be allowed? It is possible to have a config file which 
includes the target file, and then sets the property as a workaround, which 
is similar to what I would be doing by populating it in the Qt config files.

If that shouldn't be allowed, do we need to design a better way to define 
the rpath-link entries that need to be used when using a target foo? It 
seems that some improvement in cmake would be beneficial here, and we just 
need to decide on what the change to cmake should look like.

Thanks,

Steve.


--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers

Reply via email to