We are currently migrating Bugzilla to GitHub issues.
Any changes made to the bug tracker now will be lost, so please do not post new bugs or make changes to them.
When we're done, all bug URLs will redirect to their equivalent location on the new bug tracker.

Bug 5349

Summary: Failed to link the SDL_sysjoystick.c.o while building by CMake
Product: SDL Reporter: Vitaly Novichkov <admin>
Component: buildAssignee: Sam Lantinga <slouken>
Status: RESOLVED FIXED QA Contact: Sam Lantinga <slouken>
Severity: major    
Priority: P2 CC: sezeroz
Version: HG 2.1   
Hardware: x86_64   
OS: Linux   

Description Vitaly Novichkov 2020-11-12 08:20:04 UTC
Hello!

I suddenly found that the latest libSDL2 won't build and fails with next error:

```
FAILED: libSDL2-2.0d.so.0.12.1 
: && /usr/bin/cc -fPIC -idirafter /home/runner/SDL-Mixer-X/build-debug/external/AudioCodecs/src/AudioCodecs-build/external/SDL2/src/SDL2HG/src/video/khronos -DHAVE_LINUX_VERSION_H -D_REENTRANT -I/usr/include -msse3 -msse2 -msse -m3dnow -mmmx -Wshadow -fvisibility=hidden -Wdeclaration-after-statement -Werror=declaration-after-statement -fno-strict-aliasing -Wall  -g   -shared -Wl,-soname,libSDL2-2.0d.so.1 -o libSDL2-2.0d.so.0.12.1 CMakeFiles/SDL2.dir/src/SDL.c.o CMakeFiles/SDL2.dir/src/SDL_assert.c.o CMakeFiles/SDL2.dir/src/SDL_dataqueue.c.o CMakeFiles/SDL2.dir/src/SDL_error.c.o CMakeFiles/SDL2.dir/src/SDL_hints.c.o CMakeFiles/SDL2.dir/src/SDL_log.c.o CMakeFiles/SDL2.dir/src/atomic/SDL_atomic.c.o CMakeFiles/SDL2.dir/src/atomic/SDL_spinlock.c.o CMakeFiles/SDL2.dir/src/audio/SDL_audio.c.o CMakeFiles/SDL2.dir/src/audio/SDL_audiocvt.c.o CMakeFiles/SDL2.dir/src/audio/SDL_audiodev.c.o CMakeFiles/SDL2.dir/src/audio/SDL_audiotypecvt.c.o CMakeFiles/SDL2.dir/src/audio/SDL_mixer.c.o CMakeFiles/SDL2.dir/src/audio/SDL_wave.c.o CMakeFiles/SDL2.dir/src/cpuinfo/SDL_cpuinfo.c.o CMakeFiles/SDL2.dir/src/dynapi/SDL_dynapi.c.o CMakeFiles/SDL2.dir/src/events/SDL_clipboardevents.c.o CMakeFiles/SDL2.dir/src/events/SDL_displayevents.c.o CMakeFiles/SDL2.dir/src/events/SDL_dropevents.c.o CMakeFiles/SDL2.dir/src/events/SDL_events.c.o CMakeFiles/SDL2.dir/src/events/SDL_gesture.c.o CMakeFiles/SDL2.dir/src/events/SDL_keyboard.c.o CMakeFiles/SDL2.dir/src/events/SDL_mouse.c.o CMakeFiles/SDL2.dir/src/events/SDL_quit.c.o CMakeFiles/SDL2.dir/src/events/SDL_touch.c.o CMakeFiles/SDL2.dir/src/events/SDL_windowevents.c.o CMakeFiles/SDL2.dir/src/file/SDL_rwops.c.o CMakeFiles/SDL2.dir/src/haptic/SDL_haptic.c.o CMakeFiles/SDL2.dir/src/libm/e_atan2.c.o CMakeFiles/SDL2.dir/src/libm/e_exp.c.o CMakeFiles/SDL2.dir/src/libm/e_fmod.c.o CMakeFiles/SDL2.dir/src/libm/e_log.c.o CMakeFiles/SDL2.dir/src/libm/e_log10.c.o CMakeFiles/SDL2.dir/src/libm/e_pow.c.o CMakeFiles/SDL2.dir/src/libm/e_rem_pio2.c.o CMakeFiles/SDL2.dir/src/libm/e_sqrt.c.o CMakeFiles/SDL2.dir/src/libm/k_cos.c.o CMakeFiles/SDL2.dir/src/libm/k_rem_pio2.c.o CMakeFiles/SDL2.dir/src/libm/k_sin.c.o CMakeFiles/SDL2.dir/src/libm/k_tan.c.o CMakeFiles/SDL2.dir/src/libm/s_atan.c.o CMakeFiles/SDL2.dir/src/libm/s_copysign.c.o CMakeFiles/SDL2.dir/src/libm/s_cos.c.o CMakeFiles/SDL2.dir/src/libm/s_fabs.c.o CMakeFiles/SDL2.dir/src/libm/s_floor.c.o CMakeFiles/SDL2.dir/src/libm/s_scalbn.c.o CMakeFiles/SDL2.dir/src/libm/s_sin.c.o CMakeFiles/SDL2.dir/src/libm/s_tan.c.o CMakeFiles/SDL2.dir/src/locale/SDL_locale.c.o CMakeFiles/SDL2.dir/src/misc/SDL_url.c.o CMakeFiles/SDL2.dir/src/power/SDL_power.c.o CMakeFiles/SDL2.dir/src/render/SDL_d3dmath.c.o CMakeFiles/SDL2.dir/src/render/SDL_render.c.o CMakeFiles/SDL2.dir/src/render/SDL_yuv_sw.c.o CMakeFiles/SDL2.dir/src/render/direct3d/SDL_render_d3d.c.o CMakeFiles/SDL2.dir/src/render/direct3d/SDL_shaders_d3d.c.o CMakeFiles/SDL2.dir/src/render/direct3d11/SDL_render_d3d11.c.o CMakeFiles/SDL2.dir/src/render/direct3d11/SDL_shaders_d3d11.c.o CMakeFiles/SDL2.dir/src/render/opengl/SDL_render_gl.c.o CMakeFiles/SDL2.dir/src/render/opengl/SDL_shaders_gl.c.o CMakeFiles/SDL2.dir/src/render/opengles/SDL_render_gles.c.o CMakeFiles/SDL2.dir/src/render/opengles2/SDL_render_gles2.c.o CMakeFiles/SDL2.dir/src/render/opengles2/SDL_shaders_gles2.c.o CMakeFiles/SDL2.dir/src/render/psp/SDL_render_psp.c.o CMakeFiles/SDL2.dir/src/render/software/SDL_blendfillrect.c.o CMakeFiles/SDL2.dir/src/render/software/SDL_blendline.c.o CMakeFiles/SDL2.dir/src/render/software/SDL_blendpoint.c.o CMakeFiles/SDL2.dir/src/render/software/SDL_drawline.c.o CMakeFiles/SDL2.dir/src/render/software/SDL_drawpoint.c.o CMakeFiles/SDL2.dir/src/render/software/SDL_render_sw.c.o CMakeFiles/SDL2.dir/src/render/software/SDL_rotate.c.o CMakeFiles/SDL2.dir/src/sensor/SDL_sensor.c.o CMakeFiles/SDL2.dir/src/stdlib/SDL_getenv.c.o CMakeFiles/SDL2.dir/src/stdlib/SDL_iconv.c.o CMakeFiles/SDL2.dir/src/stdlib/SDL_malloc.c.o CMakeFiles/SDL2.dir/src/stdlib/SDL_qsort.c.o CMakeFiles/SDL2.dir/src/stdlib/SDL_stdlib.c.o CMakeFiles/SDL2.dir/src/stdlib/SDL_string.c.o CMakeFiles/SDL2.dir/src/stdlib/SDL_strtokr.c.o CMakeFiles/SDL2.dir/src/thread/SDL_thread.c.o CMakeFiles/SDL2.dir/src/timer/SDL_timer.c.o CMakeFiles/SDL2.dir/src/video/SDL_RLEaccel.c.o CMakeFiles/SDL2.dir/src/video/SDL_blit.c.o CMakeFiles/SDL2.dir/src/video/SDL_blit_0.c.o CMakeFiles/SDL2.dir/src/video/SDL_blit_1.c.o CMakeFiles/SDL2.dir/src/video/SDL_blit_A.c.o CMakeFiles/SDL2.dir/src/video/SDL_blit_N.c.o CMakeFiles/SDL2.dir/src/video/SDL_blit_auto.c.o CMakeFiles/SDL2.dir/src/video/SDL_blit_copy.c.o CMakeFiles/SDL2.dir/src/video/SDL_blit_slow.c.o CMakeFiles/SDL2.dir/src/video/SDL_bmp.c.o CMakeFiles/SDL2.dir/src/video/SDL_clipboard.c.o CMakeFiles/SDL2.dir/src/video/SDL_egl.c.o CMakeFiles/SDL2.dir/src/video/SDL_fillrect.c.o CMakeFiles/SDL2.dir/src/video/SDL_pixels.c.o CMakeFiles/SDL2.dir/src/video/SDL_rect.c.o CMakeFiles/SDL2.dir/src/video/SDL_shape.c.o CMakeFiles/SDL2.dir/src/video/SDL_stretch.c.o CMakeFiles/SDL2.dir/src/video/SDL_surface.c.o CMakeFiles/SDL2.dir/src/video/SDL_video.c.o CMakeFiles/SDL2.dir/src/video/SDL_vulkan_utils.c.o CMakeFiles/SDL2.dir/src/video/SDL_yuv.c.o CMakeFiles/SDL2.dir/src/video/yuv2rgb/yuv_rgb.c.o CMakeFiles/SDL2.dir/src/joystick/SDL_gamecontroller.c.o CMakeFiles/SDL2.dir/src/joystick/SDL_joystick.c.o CMakeFiles/SDL2.dir/src/audio/dummy/SDL_dummyaudio.c.o CMakeFiles/SDL2.dir/src/audio/disk/SDL_diskaudio.c.o CMakeFiles/SDL2.dir/src/loadso/dlopen/SDL_sysloadso.c.o CMakeFiles/SDL2.dir/src/joystick/virtual/SDL_virtualjoystick.c.o CMakeFiles/SDL2.dir/src/video/dummy/SDL_nullevents.c.o CMakeFiles/SDL2.dir/src/video/dummy/SDL_nullframebuffer.c.o CMakeFiles/SDL2.dir/src/video/dummy/SDL_nullvideo.c.o CMakeFiles/SDL2.dir/src/audio/dsp/SDL_dspaudio.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11clipboard.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11dyn.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11events.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11framebuffer.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11keyboard.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11messagebox.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11modes.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11mouse.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11opengl.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11opengles.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11shape.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11touch.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11video.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11vulkan.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11window.c.o CMakeFiles/SDL2.dir/src/video/x11/SDL_x11xinput2.c.o CMakeFiles/SDL2.dir/src/video/x11/edid-parse.c.o CMakeFiles/SDL2.dir/src/video/x11/imKStoUCS.c.o CMakeFiles/SDL2.dir/src/core/unix/SDL_poll.c.o CMakeFiles/SDL2.dir/src/haptic/linux/SDL_syshaptic.c.o CMakeFiles/SDL2.dir/src/core/linux/SDL_evdev.c.o CMakeFiles/SDL2.dir/src/core/linux/SDL_evdev_kbd.c.o CMakeFiles/SDL2.dir/src/core/linux/SDL_evdev_capabilities.c.o CMakeFiles/SDL2.dir/src/core/linux/SDL_threadprio.c.o CMakeFiles/SDL2.dir/src/joystick/linux/SDL_sysjoystick.c.o CMakeFiles/SDL2.dir/src/joystick/steam/SDL_steamcontroller.c.o CMakeFiles/SDL2.dir/src/thread/pthread/SDL_systhread.c.o CMakeFiles/SDL2.dir/src/thread/pthread/SDL_sysmutex.c.o CMakeFiles/SDL2.dir/src/thread/pthread/SDL_syscond.c.o CMakeFiles/SDL2.dir/src/thread/pthread/SDL_systls.c.o CMakeFiles/SDL2.dir/src/thread/pthread/SDL_syssem.c.o CMakeFiles/SDL2.dir/src/misc/unix/SDL_sysurl.c.o CMakeFiles/SDL2.dir/src/power/linux/SDL_syspower.c.o CMakeFiles/SDL2.dir/src/locale/unix/SDL_syslocale.c.o CMakeFiles/SDL2.dir/src/filesystem/unix/SDL_sysfilesystem.c.o CMakeFiles/SDL2.dir/src/timer/unix/SDL_systimer.c.o CMakeFiles/SDL2.dir/src/sensor/dummy/SDL_dummysensor.c.o  -lm -ldl -Wl,--no-undefined -pthread && :
CMakeFiles/SDL2.dir/src/joystick/linux/SDL_sysjoystick.c.o: In function `LINUX_InotifyJoystickDetect':
/home/runner/SDL-Mixer-X/build-debug/external/AudioCodecs/src/AudioCodecs-build/external/SDL2/src/SDL2HG/src/joystick/linux/SDL_sysjoystick.c:558: undefined reference to `MaybeRemoveDevice'


/usr/bin/ld: CMakeFiles/SDL2.dir/src/joystick/linux/SDL_sysjoystick.c.o: relocation R_X86_64_PC32 against undefined symbol `MaybeRemoveDevice' can not be used when making a shared object; recompile with -fPIC


/usr/bin/ld: final link failed: Bad value
```

Here is a full build log:
https://semaphoreci.com/wohlstand/sdl-mixer-x/branches/master/builds/286

I tried the same build on Ubuntu 16.04 and then I tried to toggle Ubuntu version to 18.04 at Semaphore-Ci.
Comment 1 Ozkan Sezer 2020-11-12 08:30:43 UTC
I guess SDL_USE_LIBUDEV guards around MaybeRemoveDevice()
need removing.  Try the following patch.

diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c
--- a/src/joystick/linux/SDL_sysjoystick.c
+++ b/src/joystick/linux/SDL_sysjoystick.c
@@ -343,7 +343,6 @@ MaybeAddDevice(const char *path)
     return numjoysticks;
 }
 
-#if SDL_USE_LIBUDEV
 static int
 MaybeRemoveDevice(const char *path)
 {
@@ -386,7 +385,6 @@ MaybeRemoveDevice(const char *path)
 
     return -1;
 }
-#endif
 
 static void
 HandlePendingRemovals(void)
Comment 2 Ozkan Sezer 2020-11-12 11:13:32 UTC
Fixed by https://hg.libsdl.org/SDL/rev/f163fc05bd5c
Comment 3 Vitaly Novichkov 2020-11-12 11:21:40 UTC
Thanks!

At the same time, the mistake at SDL header:

```
include/SDL2/SDL_keycode.h:344:37: warning: comma at end of enumerator list [-Wpedantic]
     KMOD_GUI = KMOD_LGUI | KMOD_RGUI,
```
that breaks C90 compatibility
Comment 4 Ozkan Sezer 2020-11-12 12:10:53 UTC
(In reply to Vitaly Novichkov from comment #3)
> include/SDL2/SDL_keycode.h:344:37: warning: comma at end of enumerator list
> [-Wpedantic]
>      KMOD_GUI = KMOD_LGUI | KMOD_RGUI,

https://hg.libsdl.org/SDL/rev/cf742a3c038f
Comment 5 Vitaly Novichkov 2020-11-12 12:16:22 UTC
And then:
```
include/SDL2/SDL_gamecontroller.h:366:37: error: expected identifier before ‘/’ token
     SDL_CONTROLLER_BUTTON_MISC1,    // Xbox Series X share button, PS4/PS5 touchpad button, Nintendo Switch Pro capture button
```
Comment 6 Ozkan Sezer 2020-11-12 12:19:20 UTC
(In reply to Vitaly Novichkov from comment #5)
> And then:
> ```
> include/SDL2/SDL_gamecontroller.h:366:37: error: expected identifier before
> ‘/’ token
>      SDL_CONTROLLER_BUTTON_MISC1,    // Xbox Series X share button, PS4/PS5
> touchpad button, Nintendo Switch Pro capture button
> ```

Well, compile a list of any other enums with comma at the end
and open a bug entry here.  Otherwise you'll find others when-
ever we fix the one above.
Comment 7 Vitaly Novichkov 2020-11-12 12:21:13 UTC
I'll try that at evening, right now I am busy at my work, and I only trying to build the thing at Semaphore-CI that won't build because of those bugs here.