From eb66fe314aba58be33d4ddb8dd185cb0c100d4ab Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Wed, 10 Jun 2015 02:43:01 +0000 Subject: [PATCH 1/3] Link local libusb statically on Linux/Mac --- depends/install_libusb.sh | 2 +- examples/protonect/CMakeLists.txt | 7 ++----- examples/protonect/cmake_modules/FindLibUSB.cmake | 11 +++++++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/depends/install_libusb.sh b/depends/install_libusb.sh index 0c537f48a..11bddce0c 100755 --- a/depends/install_libusb.sh +++ b/depends/install_libusb.sh @@ -15,7 +15,7 @@ git clone https://github.com/libusb/libusb.git $LIBUSB_SOURCE_DIR cd $LIBUSB_SOURCE_DIR git checkout 51b10191033ca3a3819dcf46e1da2465b99497c2 ./bootstrap.sh -./configure --prefix=$LIBUSB_INSTALL_DIR +CFLAGS=-fPIC ./configure --prefix=$LIBUSB_INSTALL_DIR make && make install cd $DEPENDS_DIR diff --git a/examples/protonect/CMakeLists.txt b/examples/protonect/CMakeLists.txt index b56c89c49..71f2b6081 100644 --- a/examples/protonect/CMakeLists.txt +++ b/examples/protonect/CMakeLists.txt @@ -52,8 +52,6 @@ INCLUDE_DIRECTORIES( ${TurboJPEG_INCLUDE_DIRS} ) -LINK_DIRECTORIES(${LibUSB_LIBRARY_DIRS}) - SET(RESOURCES_INC_FILE "${MY_DIR}/src/resources.inc.h") SET(SOURCES @@ -105,7 +103,8 @@ SET(SOURCES SET(LIBRARIES ${OpenCV_LIBS} ${OpenCV_LIBRARIES} - ${LibUSB_LIBRARIES} + ${LibUSB_STATIC_LIBRARIES} + ${LibUSB_STATIC_LDFLAGS_OTHER} # -Wl,-framework,XYZ on Mac OSX ${TurboJPEG_LIBRARIES} ${LIBFREENECT2_THREADING_LIBRARIES} ) @@ -165,8 +164,6 @@ IF(ENABLE_OPENCL) ENDIF(OPENCL_FOUND) ENDIF(ENABLE_OPENCL) -SET(CMAKE_INSTALL_RPATH ${LibUSB_LIBDIR}) - CONFIGURE_FILE("${MY_DIR}/include/libfreenect2/config.h.in" "${MY_DIR}/include/libfreenect2/config.h" @ONLY) GENERATE_RESOURCES(${RESOURCES_INC_FILE} ${MY_DIR} ${RESOURCES}) diff --git a/examples/protonect/cmake_modules/FindLibUSB.cmake b/examples/protonect/cmake_modules/FindLibUSB.cmake index f3e822b6b..351841ffb 100644 --- a/examples/protonect/cmake_modules/FindLibUSB.cmake +++ b/examples/protonect/cmake_modules/FindLibUSB.cmake @@ -10,6 +10,17 @@ IF(PKG_CONFIG_FOUND) SET(ENV{PKG_CONFIG_PATH} "${DEPENDS_DIR}/libusb/lib/pkgconfig") PKG_CHECK_MODULES(LibUSB libusb-1.0) + + # expand the full path of libusb-1.0.a in LibUSB_STATIC_LIBRARIES + LIST(REMOVE_ITEM LibUSB_STATIC_LIBRARIES ${LibUSB_LIBRARIES}) + LIST(INSERT CMAKE_FIND_LIBRARY_SUFFIXES 0 ".a") + FIND_LIBRARY(LibUSB_STATIC_ARCHIVE + NAMES ${LibUSB_LIBRARIES} + PATHS ${LibUSB_LIBRARY_DIRS} NO_DEFAULT_PATH + ) + LIST(REMOVE_AT CMAKE_FIND_LIBRARY_SUFFIXES 0) + LIST(APPEND LibUSB_STATIC_LIBRARIES ${LibUSB_STATIC_ARCHIVE}) + RETURN() ENDIF() From 8fb675e1b80578ca61755ae7818272f5293a8bee Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Wed, 10 Jun 2015 02:44:03 +0000 Subject: [PATCH 2/3] Do not export libusb symbols --- examples/protonect/CMakeLists.txt | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/examples/protonect/CMakeLists.txt b/examples/protonect/CMakeLists.txt index 71f2b6081..1e3beb37b 100644 --- a/examples/protonect/CMakeLists.txt +++ b/examples/protonect/CMakeLists.txt @@ -23,6 +23,15 @@ IF(ENABLE_CXX11) ENDIF() ENDIF(ENABLE_CXX11) +INCLUDE(CheckCXXCompilerFlag) +SET(CMAKE_REQUIRED_FLAGS "-Wl,--exclude-libs,ALL") +CHECK_CXX_COMPILER_FLAG("" _EXCLUDE_LIBS) +SET(LINKER_EXCLUDE_LIBS ${_EXCLUDE_LIBS} CACHE BOOL "Linker supports --exclude-libs") +SET(CMAKE_REQUIRED_FLAGS "-Wl,-exported_symbols_list,/dev/null") +CHECK_CXX_COMPILER_FLAG("" _EXPORTED_SYMBOLS_LIST) +SET(LINKER_EXPORTED_SYMBOLS_LIST ${_EXPORTED_SYMBOLS_LIST} CACHE BOOL "Linker supports -exported_symbols_list") +SET(CMAKE_REQUIRED_FLAGS) + # additional cmake modules LIST(APPEND CMAKE_MODULE_PATH ${MY_DIR}/cmake_modules) @@ -173,6 +182,23 @@ set_target_properties(freenect2 PROPERTIES POSITION_INDEPENDENT_CODE 1) ADD_LIBRARY(freenect2shared SHARED $) ADD_LIBRARY(freenect2static STATIC $) set_target_properties(freenect2shared PROPERTIES OUTPUT_NAME freenect2) + +IF(LINKER_EXCLUDE_LIBS) + get_filename_component(LibUSB_STATIC_ARCHIVE_NAME ${LibUSB_STATIC_ARCHIVE} NAME) + SET_TARGET_PROPERTIES(freenect2shared PROPERTIES LINK_FLAGS "-Wl,--exclude-libs,${LibUSB_STATIC_ARCHIVE_NAME}") +ELSEIF(LINKER_EXPORTED_SYMBOLS_LIST) + ADD_LIBRARY(testsym SHARED $) + TARGET_LINK_LIBRARIES(testsym ${LIBRARIES}) + ADD_CUSTOM_TARGET(gensym + COMMAND nm -gj $ | grep -v ^_libusb >${CMAKE_BINARY_DIR}/nolibusb.sym + DEPENDS testsym + ) + ADD_DEPENDENCIES(freenect2shared gensym) + SET_TARGET_PROPERTIES(freenect2shared PROPERTIES LINK_FLAGS "-Wl,-exported_symbols_list,${CMAKE_BINARY_DIR}/nolibusb.sym") +ELSE() + MESSAGE(FATAL_ERROR "Linker has no symbol hiding support") +ENDIF() + set_target_properties(freenect2static PROPERTIES OUTPUT_NAME freenect2) IF(MSVC) set_target_properties(freenect2static PROPERTIES OUTPUT_NAME freenect2static) From 095356c1f3487f6d5c00fca01aa11e2565bc8a31 Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Tue, 16 Jun 2015 23:02:43 -0400 Subject: [PATCH 3/3] Fix static libusb link order libusb-1.0.a must come before -ludev, otherwise libudev is ignored by linker because of lack of dependency. --- examples/protonect/cmake_modules/FindLibUSB.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/protonect/cmake_modules/FindLibUSB.cmake b/examples/protonect/cmake_modules/FindLibUSB.cmake index 351841ffb..4824889dd 100644 --- a/examples/protonect/cmake_modules/FindLibUSB.cmake +++ b/examples/protonect/cmake_modules/FindLibUSB.cmake @@ -19,7 +19,7 @@ IF(PKG_CONFIG_FOUND) PATHS ${LibUSB_LIBRARY_DIRS} NO_DEFAULT_PATH ) LIST(REMOVE_AT CMAKE_FIND_LIBRARY_SUFFIXES 0) - LIST(APPEND LibUSB_STATIC_LIBRARIES ${LibUSB_STATIC_ARCHIVE}) + LIST(INSERT LibUSB_STATIC_LIBRARIES 0 ${LibUSB_STATIC_ARCHIVE}) RETURN() ENDIF()