# 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 )