sdl12-compat replaced SDL in Fedora 35 and perl-SDL-2.548-11.fc35 fails to build now because of failing tests: Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.puyE59 + umask 022 + cd /builddir/build/BUILD + cd SDL-2.548 + ./Build test [Alien::SDL] Build option used: Already installed SDL ver=1.2.15 path=/usr SDL(v1.2.15) SDL_image(v1.2.12) SDL_mixer(v1.2.12) SDL_ttf(v2.0.11) SDL_gfx(v2.0.26) SDL_Pango(v1.3) Building SDL # Failed test 'use SDL;' # at t/00-load.t line 88. # Tried to use 'SDL'. # Error: Can't locate loadable object for module SDL_perl in @INC (@INC contains: /builddir/build/BUILD/SDL-2.548/blib/lib /builddir/build/BUILD/SDL-2.548/blib/arch inc /usr/local/lib64/perl5/5.34 /usr/local/share/perl5/5.34 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /builddir/build/BUILD/SDL-2.548/blib/lib/SDL.pm line 42. # Compilation failed in require at /builddir/build/BUILD/SDL-2.548/blib/lib/SDL.pm line 42. # BEGIN failed--compilation aborted at /builddir/build/BUILD/SDL-2.548/blib/lib/SDL.pm line 42. # Compilation failed in require at t/00-load.t line 88. # BEGIN failed--compilation aborted at t/00-load.t line 88. Bailout called. Further testing stopped: Test failed. BAIL OUT!. FAILED--Further testing stopped: Test failed. BAIL OUT!. error: Bad exit status from /var/tmp/rpm-tmp.puyE59 (%check)
There were fixes in sdl12-compat-0.0.1~git.20210609.efe9791-1.fc35 (bug #1968508) and another bug about an unnecessary RPATH was fixed in perl-Alien-SDL-1.446-21.fc35 (https://fedoraproject.org/wiki/Changes/Broken_RPATH_will_fail_rpmbuild) in the meain time. But perl-SDL tests still fails. There are more warnings when configuring perl-SDL: [Alien::SDL] Testing header(s): SDL.hDetecting available libraries ... ###WARNING### Disabling subsystem 'Video' NOK: (fatal error: SDL.h: No such file or directory 5 | #include <SDL.h> | ^~~~~~~ compilation terminated.)
Not really. I had an old sdl12-compat on my system. With sdl12-compat-0.0.1~git.20210609.efe9791-1.fc35 the build and tests pass. But most of the tests report: INFO: sdl12-compat, built on Jun 9 2021 at 00:00:00, talking to SDL2 2.0.14 Init SDL_INIT_VIDEO failed with SDL error: and stderr INFO: FIXME: there is never a parachute in SDL2, should we catch segfaults ourselves? (SDL_Init:1622) INFO: FIXME: support SDL_INIT_EVENTTHREAD where it makes sense? (SDL_InitSubSystem:1594) t/core.t ........................ skipped: Failed to init video That not used to be like that. The tests had passed normally before sdl12-compat replaced SDL.
It can be reduced to: $ SDL_VIDEODRIVER=dummy perl -Iblib/{lib,arch} -e 'use SDL; $r = SDL::init(0x00000020); $e = SDL::get_error(); print qq{retval = <$r>, error = <$e>\n}' INFO: sdl12-compat, built on Jun 9 2021 at 00:00:00, talking to SDL2 2.0.14 INFO: FIXME: there is never a parachute in SDL2, should we catch segfaults ourselves? (SDL_Init:1622) INFO: FIXME: support SDL_INIT_EVENTTHREAD where it makes sense? (SDL_InitSubSystem:1594) retval = <0>, error = <> SDL::init() does not fail. But it prints a warning to an error output and that is caught by the tests in t/lib/SDL/TestTool.pm:init(): ($stdout, $stderr ) = capture { SDL::init($init) }; if ( $stderr ne '' ) { warn 'Init ' . $inits{$init} . ' failed with SDL error: ' . SDL::get_error() . "\nand stderr $stderr\n"; } return !( $stderr ne '' ); In other words the tests check that there is not error output, but sdl12-compat logs there unimplemented features.
I changes the initialization to check a return value instead of stderr like this: --- a/t/lib/SDL/TestTool.pm +++ b/t/lib/SDL/TestTool.pm @@ -20,6 +20,7 @@ sub init { my ( $self, $init ) = @_; my $stdout = ''; my $stderr = ''; + my $retval; if ( $init == SDL_INIT_VIDEO ) { if ( $^O !~ /win/i && !$ENV{DISPLAY} && !$ENV{SDL_VIDEODRIVER} ) { @@ -36,12 +37,15 @@ sub init { SDL::quit(); } - ($stdout, $stderr ) = capture { SDL::init($init) }; - if ( $stderr ne '' ) { - warn 'Init ' . $inits{$init} . ' failed with SDL error: ' . SDL::get_error() . "\nand stderr $stderr\n"; + ($stdout, $stderr ) = capture { $retval = SDL::init($init) }; + if ( $retval ) { + warn 'Init ' . $inits{$init} . ' failed with SDL error: ' . SDL::get_error() . "\n" . + ($stderr eq '') ? '' : "and stderr $stderr\n"; + } elsif ( $stderr ne '' ) { + warn 'Init ' . $inits{$init} . " succeeded but warned:\n$stderr\n"; } - return !( $stderr ne '' ); + return !( $retval ); } sub test_audio_open { All tests pass with old SDL. Some tests fail with sdl12-compat-0.0.1~git.20210609.efe9791-1.fc35: Test Summary Report ------------------- t/core.t (Wstat: 0 Tests: 28 Failed: 0) TODO passed: 21-22, 27 t/core_audio.t (Wstat: 512 Tests: 45 Failed: 2) Failed tests: 30-31 Non-zero exit status: 2 t/core_events.t (Wstat: 256 Tests: 679 Failed: 1) Failed test: 668 Non-zero exit status: 1 t/core_multi.t (Wstat: 0 Tests: 4 Failed: 0) TODO passed: 3 t/core_timer.t (Wstat: 0 Tests: 6 Failed: 0) TODO passed: 6 t/core_video.t (Wstat: 256 Tests: 110 Failed: 1) Failed test: 62 TODO passed: 57, 59 Non-zero exit status: 1 t/gfx_imagefilter.t (Wstat: 0 Tests: 8 Failed: 0) TODO passed: 7 t/mixer.t (Wstat: 768 Tests: 26 Failed: 3) Failed tests: 20-21, 23 Non-zero exit status: 3 t/mixer_mixchunk.t (Wstat: 256 Tests: 2 Failed: 2) Failed tests: 1-2 Non-zero exit status: 1 Parse errors: Bad plan. You planned 6 tests but ran 2. t/mixer_mixmusic.t (Wstat: 512 Tests: 6 Failed: 2) Failed tests: 4-5 Non-zero exit status: 2 t/mixer_music.t (Wstat: 3584 Tests: 35 Failed: 14) Failed tests: 1, 8-11, 13-16, 20, 23-24, 28-29 Non-zero exit status: 14 t/sdlx_music.t (Wstat: 256 Tests: 2 Failed: 0) Non-zero exit status: 1 Parse errors: No plan found in TAP output t/sdlx_sound.t (Wstat: 256 Tests: 5 Failed: 0) Non-zero exit status: 1 Parse errors: No plan found in TAP output t/sdlx_surface.t (Wstat: 256 Tests: 1 Failed: 0) Non-zero exit status: 1 Parse errors: No plan found in TAP output Files=58, Tests=3449, 89 wallclock secs ( 0.34 usr 0.11 sys + 22.68 cusr 2.39 csys = 25.52 CPU) Result: FAIL Failed 10/58 test programs. 25/3449 subtests failed.
The stderr checking has already been fixed in upstream with: commit 39f3db900436329dcc1bfbc28f74775d1304b538 Author: Pino Toscano <toscano.pino> Date: Fri May 1 09:51:13 2015 +0200 TestTool::init: properly handle SDL::init errors So far TestTool::init was just capturing stdout and stderr of SDL::init, using stderr to check whether SDL::init failed. This, other than being fragile, misses the init errors. Switch from checking stderr to checking the actual result code of SDL::init.
Could you please take a look at this, Ryan?
This should all be resolved upstream now, including emulating a bug that the Perl unit tests expects. :) We no longer spam stderr by default, so it shouldn’t need those workarounds anymore, either. Unless there are other concerns, I believe this bug can be marked as resolved now.
Petr, I built sdl12-compat-0.0.1~git.20210618.f44f295-1.fc35 in Rawhide, which includes the work Ryan has done. Can you verify that this is fixed now?
Koschei reports that this is no longer a problem: https://koschei.fedoraproject.org/build/10490013
Thanks.