| # COPYRIGHT (c) 2016 Obsidian Research Corporation. |
| # Licensed under BSD (MIT variant) or GPLv2. See COPYING. |
| # find_package helper to detect symbol version support in the compiler and |
| # linker. If supported then LDSYMVER_MODE will be set to GNU |
| |
| # Basic sample GNU style map file |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test.map" " |
| IBVERBS_1.0 { |
| global: |
| ibv_get_device_list; |
| local: *; |
| }; |
| |
| IBVERBS_1.1 { |
| global: |
| ibv_get_device_list; |
| } IBVERBS_1.0; |
| ") |
| |
| # See RDMA_CHECK_C_LINKER_FLAG |
| set(SAFE_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") |
| set(SAFE_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") |
| if (POLICY CMP0056) |
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/test.map") |
| else() |
| set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES} -Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/test.map") |
| endif() |
| |
| # And matching source, this also checks that .symver asm works |
| if (HAVE_FUNC_ATTRIBUTE_SYMVER) |
| check_c_source_compiles(" |
| void ibv_get_device_list_1(void); |
| __attribute((__symver__(\"ibv_get_device_list@IBVERBS_1.1\"))) |
| void ibv_get_device_list_1(void){} |
| void ibv_get_device_list_0(void); |
| __attribute((__symver__(\"ibv_get_device_list@IBVERBS_1.0\"))) |
| void ibv_get_device_list_0(void){} |
| int main(int argc,const char *argv[]){return 0;}" _LDSYMVER_SUCCESS) |
| else() |
| check_c_source_compiles(" |
| void ibv_get_device_list_1(void); |
| void ibv_get_device_list_1(void){} |
| asm(\".symver ibv_get_device_list_1, ibv_get_device_list@IBVERBS_1.1\"); |
| void ibv_get_device_list_0(void); |
| void ibv_get_device_list_0(void){} |
| asm(\".symver ibv_get_device_list_0, ibv_get_device_list@@IBVERBS_1.0\"); |
| int main(int argc,const char *argv[]){return 0;}" _LDSYMVER_SUCCESS) |
| endif() |
| |
| file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/test.map") |
| set(CMAKE_EXE_LINKER_FLAGS "${SAFE_CMAKE_EXE_LINKER_FLAGS}") |
| set(CMAKE_REQUIRED_LIBRARIES "${SAFE_CMAKE_REQUIRED_LIBRARIES}") |
| |
| if (_LDSYMVER_SUCCESS) |
| set(LDSYMVER_MODE "GNU" CACHE INTERNAL "How to set symbol versions on shared libraries") |
| endif() |
| |
| include(FindPackageHandleStandardArgs) |
| find_package_handle_standard_args( |
| LDSymVer |
| REQUIRED_VARS LDSYMVER_MODE |
| ) |