Fixed SONAME lookup for runtime loading of shared libraries in CMake project. Fixes Bugzilla #2249.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
diff --git a/cmake/sdlchecks.cmake b/cmake/sdlchecks.cmake
index 84a93bd..86366e4 100644
--- a/cmake/sdlchecks.cmake
+++ b/cmake/sdlchecks.cmake
@@ -1,3 +1,34 @@
+macro(FindLibraryAndSONAME _LIB)
+ string(TOUPPER ${_LIB} _UPPERLNAME)
+ string(REGEX REPLACE "\\-" "_" _LNAME "${_UPPERLNAME}")
+
+ find_library(${_LNAME}_LIB ${_LIB})
+ if(${_LNAME}_LIB)
+ # reduce the library name for shared linking
+
+ get_filename_component(_LIB_REALPATH ${${_LNAME}_LIB} REALPATH) # resolves symlinks
+ get_filename_component(_LIB_JUSTNAME ${_LIB_REALPATH} NAME)
+
+ if(APPLE)
+ string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*dylib$" "\\1.dylib" _LIB_REGEXD "${_LIB_JUSTNAME}")
+ else()
+ string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*$" "\\1" _LIB_REGEXD "${_LIB_JUSTNAME}")
+ endif()
+
+ SET(_DEBUG_FindSONAME FALSE)
+ if(_DEBUG_FindSONAME)
+ message_warn("DYNLIB OUTPUTVAR: ${_LIB} ... ${_LNAME}_LIB")
+ message_warn("DYNLIB ORIGINAL LIB: ${_LIB} ... ${${_LNAME}_LIB}")
+ message_warn("DYNLIB REALPATH LIB: ${_LIB} ... ${_LIB_REALPATH}")
+ message_warn("DYNLIB JUSTNAME LIB: ${_LIB} ... ${_LIB_JUSTNAME}")
+ message_warn("DYNLIB REGEX'd LIB: ${_LIB} ... ${_LIB_REGEXD}")
+ endif()
+
+ message(STATUS "dynamic lib${_LIB} -> ${_LIB_REGEXD}")
+ set(${_LNAME}_LIB_SONAME ${_LIB_REGEXD})
+ endif()
+endmacro()
+
macro(CheckDLOPEN)
check_function_exists(dlopen HAVE_DLOPEN)
if(NOT HAVE_DLOPEN)
@@ -83,9 +114,8 @@ macro(CheckALSA)
if(NOT HAVE_DLOPEN)
message_warn("You must have SDL_LoadObject() support for dynamic ALSA loading")
else()
- find_library(_ALSA_LIB asound)
- get_filename_component(F_ALSA_LIB ${_ALSA_LIB} NAME)
- set(SDL_AUDIO_DRIVER_ALSA_DYNAMIC "\"${F_ALSA_LIB}\"")
+ FindLibraryAndSONAME("asound")
+ set(SDL_AUDIO_DRIVER_ALSA_DYNAMIC "\"${ASOUND_LIB_SONAME}\"")
set(HAVE_ALSA_SHARED TRUE)
endif(NOT HAVE_DLOPEN)
else(ALSA_SHARED)
@@ -114,9 +144,8 @@ macro(CheckPulseAudio)
if(NOT HAVE_DLOPEN)
message_warn("You must have SDL_LoadObject() support for dynamic PulseAudio loading")
else()
- find_library(D_PULSE_LIB pulse-simple)
- get_filename_component(F_PULSE_LIB ${D_PULSE_LIB} NAME)
- set(SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC "\"${F_PULSE_LIB}\"")
+ FindLibraryAndSONAME("pulse-simple")
+ set(SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC "\"${PULSE_SIMPLE_LIB_SONAME}\"")
set(HAVE_PULSEAUDIO_SHARED TRUE)
endif(NOT HAVE_DLOPEN)
else(PULSEAUDIO_SHARED)
@@ -145,9 +174,8 @@ macro(CheckESD)
if(NOT HAVE_DLOPEN)
message_warn("You must have SDL_LoadObject() support for dynamic ESD loading")
else()
- find_library(D_ESD_LIB esd)
- get_filename_component(F_ESD_LIB ${D_ESD_LIB} NAME)
- set(SDL_AUDIO_DRIVER_ESD_DYNAMIC "\"${F_ESD_LIB}\"")
+ FindLibraryAndSONAME(esd)
+ set(SDL_AUDIO_DRIVER_ESD_DYNAMIC "\"${ESD_LIB_SONAME}\"")
set(HAVE_ESD_SHARED TRUE)
endif(NOT HAVE_DLOPEN)
else(ESD_SHARED)
@@ -181,9 +209,8 @@ macro(CheckARTS)
message_warn("You must have SDL_LoadObject() support for dynamic ARTS loading")
else()
# TODO
- find_library(D_ARTS_LIB artsc)
- get_filename_component(F_ARTS_LIB ${D_ARTS_LIB} NAME)
- set(SDL_AUDIO_DRIVER_ARTS_DYNAMIC "\"${F_ARTS_LIB}\"")
+ FindLibraryAndSONAME(artsc)
+ set(SDL_AUDIO_DRIVER_ARTS_DYNAMIC "\"${ARTSC_LIB_SONAME}\"")
set(HAVE_ARTS_SHARED TRUE)
endif(NOT HAVE_DLOPEN)
else(ARTS_SHARED)
@@ -213,8 +240,8 @@ macro(CheckNAS)
if(NOT HAVE_DLOPEN)
message_warn("You must have SDL_LoadObject() support for dynamic NAS loading")
else()
- get_filename_component(F_NAS_LIB ${D_NAS_LIB} NAME)
- set(SDL_AUDIO_DRIVER_NAS_DYNAMIC "\"${F_NAS_LIB}\"")
+ FindLibraryAndSONAME("audio")
+ set(SDL_AUDIO_DRIVER_NAS_DYNAMIC "\"${AUDIO_LIB_SONAME}\"")
set(HAVE_NAS_SHARED TRUE)
endif(NOT HAVE_DLOPEN)
else(NAS_SHARED)
@@ -234,7 +261,7 @@ macro(CheckSNDIO)
if(SNDIO)
# TODO: set include paths properly, so the sndio headers are found
check_include_file(sndio.h HAVE_SNDIO_H)
- find_library(D_SNDIO_LIB audio)
+ find_library(D_SNDIO_LIB sndio)
if(HAVE_SNDIO_H AND D_SNDIO_LIB)
set(HAVE_SNDIO TRUE)
file(GLOB SNDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sndio/*.c)
@@ -244,8 +271,8 @@ macro(CheckSNDIO)
if(NOT HAVE_DLOPEN)
message_warn("You must have SDL_LoadObject() support for dynamic sndio loading")
else()
- get_filename_component(F_SNDIO_LIB ${D_SNDIO_LIB} NAME)
- set(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC "\"${F_SNDIO_LIB}\"")
+ FindLibraryAndSONAME("sndio")
+ set(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC "\"${SNDIO_LIB_SONAME}\"")
set(HAVE_SNDIO_SHARED TRUE)
endif(NOT HAVE_DLOPEN)
else(SNDIO_SHARED)
@@ -274,9 +301,8 @@ macro(CheckFusionSound)
if(NOT HAVE_DLOPEN)
message_warn("You must have SDL_LoadObject() support for dynamic FusionSound loading")
else()
- find_library(D_FUSIONSOUND_LIB fusionsound)
- get_filename_component(F_FUSIONSOUND_LIB ${D_FUSIONSOUND_LIB} NAME)
- set(SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC "\"${F_FUSIONSOUND_LIB}\"")
+ FindLibraryAndSONAME("fusionsound")
+ set(SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC "\"${FUSIONSOUND_LIB_SONAME}\"")
set(HAVE_FUSIONSOUND_SHARED TRUE)
endif(NOT HAVE_DLOPEN)
else(FUSIONSOUND_SHARED)
@@ -295,13 +321,7 @@ endmacro(CheckFusionSound)
macro(CheckX11)
if(VIDEO_X11)
foreach(_LIB X11 Xext Xcursor Xinerama Xi Xrandr Xrender Xss Xxf86vm)
- string(TOUPPER ${_LIB} _LNAME)
- find_library(${_LNAME}_LIB ${_LIB})
- if(${_LNAME}_LIB)
- # reduce the library name for shared linking
- get_filename_component(_TMP ${${_LNAME}_LIB} NAME)
- set(${_LNAME}_LIB ${_TMP})
- endif()
+ FindLibraryAndSONAME("${_LIB}")
endforeach()
find_path(X_INCLUDEDIR X11/Xlib.h)
@@ -355,8 +375,8 @@ macro(CheckX11)
set(HAVE_X11_SHARED TRUE)
endif()
if(HAVE_X11_SHARED)
- set(SDL_VIDEO_DRIVER_X11_DYNAMIC "\"${X11_LIB}\"")
- set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "\"${XEXT_LIB}\"")
+ set(SDL_VIDEO_DRIVER_X11_DYNAMIC "\"${X11_LIB_SONAME}\"")
+ set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "\"${XEXT_LIB_SONAME}\"")
else(HAVE_X11_SHARED)
list(APPEND EXTRA_LIBS ${X11_LIB} ${XEXT_LIB})
endif(HAVE_X11_SHARED)
@@ -402,7 +422,7 @@ macro(CheckX11)
if(VIDEO_X11_XCURSOR AND HAVE_XCURSOR_H)
set(HAVE_VIDEO_X11_XCURSOR TRUE)
if(HAVE_X11_SHARED AND XCURSOR_LIB)
- set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR "\"${XCURSOR_LIB}\"")
+ set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR "\"${XCURSOR_LIB_SONAME}\"")
else(HAVE_X11_SHARED AND XCURSOR_LIB)
list(APPEND EXTRA_LIBS ${XCURSOR_LIB})
endif(HAVE_X11_SHARED AND XCURSOR_LIB)
@@ -412,7 +432,7 @@ macro(CheckX11)
if(VIDEO_X11_XINERAMA AND HAVE_XINERAMA_H)
set(HAVE_VIDEO_X11_XINERAMA TRUE)
if(HAVE_X11_SHARED AND XINERAMA_LIB)
- set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA "\"${XINERAMA_LIB}\"")
+ set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA "\"${XINERAMA_LIB_SONAME}\"")
else(HAVE_X11_SHARED AND XINERAMA_LIB)
list(APPEND EXTRA_LIBS ${XINERAMA_LIB})
endif(HAVE_X11_SHARED AND XINERAMA_LIB)
@@ -422,7 +442,7 @@ macro(CheckX11)
if(VIDEO_X11_XINPUT AND HAVE_XINPUT_H)
set(HAVE_VIDEO_X11_XINPUT TRUE)
if(HAVE_X11_SHARED AND XI_LIB)
- set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB}\"")
+ set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB_SONAME}\"")
else(HAVE_X11_SHARED AND XI_LIB)
list(APPEND EXTRA_LIBS ${XI_LIB})
endif(HAVE_X11_SHARED AND XI_LIB)
@@ -447,7 +467,7 @@ macro(CheckX11)
if(VIDEO_X11_XRANDR AND HAVE_XRANDR_H)
if(HAVE_X11_SHARED AND XRANDR_LIB)
- set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB}\"")
+ set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB_SONAME}\"")
else(HAVE_X11_SHARED AND XRANDR_LIB)
list(APPEND EXTRA_LIBS ${XRANDR_LIB})
endif(HAVE_X11_SHARED AND XRANDR_LIB)
@@ -457,7 +477,7 @@ macro(CheckX11)
if(VIDEO_X11_XSCRNSAVER AND HAVE_XSS_H)
if(HAVE_X11_SHARED AND XSS_LIB)
- set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "\"${XSS_LIB}\"")
+ set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "\"${XSS_LIB_SONAME}\"")
else(HAVE_X11_SHARED AND XSS_LIB)
list(APPEND EXTRA_LIBS ${XSS_LIB})
endif(HAVE_X11_SHARED AND XSS_LIB)
@@ -472,7 +492,7 @@ macro(CheckX11)
if(VIDEO_X11_XVM AND HAVE_XF86VM_H)
if(HAVE_X11_SHARED AND XF86VMODE_LIB)
- set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE "\"${XF86VMODE_LIB}\"")
+ set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE "\"${XF86VMODE_LIB_SONAME}\"")
else(HAVE_X11_SHARED AND XF86VMODE_LIB)
list(APPEND EXTRA_LIBS ${XF86VMODE_LIB})
endif(HAVE_X11_SHARED AND XF86VMODE_LIB)
@@ -522,9 +542,8 @@ macro(CheckDirectFB)
if(NOT HAVE_DLOPEN)
message_warn("You must have SDL_LoadObject() support for dynamic DirectFB loading")
else()
- find_library(D_DIRECTFB_LIB directfb)
- get_filename_component(F_DIRECTFB_LIB ${D_DIRECTFB_LIB} NAME)
- set(SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC "\"${F_DIRECTFB_LIB}\"")
+ FindLibraryAndSONAME("directfb")
+ set(SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC "\"${DIRECTFB_LIB_SONAME}\"")
set(HAVE_DIRECTFB_SHARED TRUE)
endif(NOT HAVE_DLOPEN)
else(DIRECTFB_SHARED)