vdr-2.2.0 kompiliert mit gcc7 nicht

  • Beim kompilieren des vdr-2.20 auf dem Fedora Buildserver kommt diese Fehlermeldung:


    Code
    g++ -O3 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic -fPIC -Werror=overloaded-virtual -Wno-parentheses -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -fPIC -c -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DREMOTE_KBD -DVDR_USER="vdr" -DSDNOTIFY -DLIRC_DEVICE="/var/run/lirc/lircd" -DVIDEODIR="/var/lib/vdr/video" -DCONFDIR="/etc/vdr" -DARGSDIR="/etc/vdr/conf.d" -DCACHEDIR="/var/cache/vdr" -DRESDIR="/usr/share/vdr" -DPLUGINDIR="/usr/lib64/vdr" -DLOCDIR="/usr/share/locale" -I/usr/include/freetype2 -I/usr/include/libpng16    -o dvbdevice.o dvbdevice.c
    dvbdevice.c: In member function 'bool cDvbTuner::SetFrontend()':
    dvbdevice.c:851:31: error: call of overloaded 'abs(unsigned int&)' is ambiguous
          frequency = abs(frequency); // Allow for C-band, where the frequency is less than the LOF
                                   ^


    komplette Logdatei:
    MIt folgendem Patch lässt sich der vdr-2.2.0 wieder kompilieren.



    Porting to GCC 7


    Kann sich jemand das mal anschauen, ob das programmiertechnisch ok ist ?

    Gruß Marco


    HW: TT6400-S2
    SW: Fedora 37, kernel-6.1.6-200.fc37.x86_64, vdr-2.6.1-2.fc37.x86_64


    Fedora37 x86_64 Gnome Desktop 42.2 Ausgabe über das vdr-softhddevice plugin

    ViewSonic VX3276 HDMI-1 <------------> HDMI NVidia Geforce-gt-1030

    ViewSonic VX3276 HDMI-2 <------------> HDMI Technotrend S2-6400


  • Die Zeile ist im originalen Quelltext schon Unsinn.



    frequency ist ein unsigned int, kann also niemals negativ sein.




    Aber das dann als fix erst nach int zu casten, um den absoluten Betrag daraus zu machen,
    der ohnehin schon immer positiv sein muss, das ist ein wirklich perfekter fix...

  • Der Kommentar im Source deutet darauf hin, dass eine Frequenz kleiner sein kann als LOF. Deshalb sollte "frequency" wohl als int definiert werden.

    Code
    int frequency = (int)channel.Frequency();


    Dann wäre der Cast auch überflüssig.


    Aber bei dem Sat-Kram kenn ich mich nicht so aus. Und ich weiß dann auch nicht, was es dann bringt, falls die Frequenz wirklich negativ sein sollte, warum dann einfach das Vorzeichen umgedreht wird und dann noch alles klappt...


    Lars.

  • frequency kann nie negativ sein. Und vom technischen Standpunkt ergibt sich bei jeder Frequenzkonversion eine positive Frequenz (auch wenn man mathematisch sehr wohl negative Frequenzen mitbetrachtet).



    besser wäre



    -- unsigned int frequency = channel.Frequency();
    ++ unsigned int frequency;
    if (Setup.DiSEqC) {
    -- if (const cDiseqc *diseqc = Diseqcs.Get(device->CardIndex() + 1, channel.Source(), frequency, dtp.Polarization(), &scr)) {
    -- frequency -= diseqc->Lof();
    ++ if (const cDiseqc *diseqc = Diseqcs.Get(device->CardIndex() + 1, channel.Source(), channel.Frequency(), dtp.Polarization(), &scr)) {
    ++ frequency = abs(channel.Frequency() - diseqc->Lof());
    if (diseqc != lastDiseqc || diseqc->IsScr() || diseqc->Position() >= 0 && channel.Source() != lastSource) {
    if (IsBondedMaster()) {
    ExecuteDiseqc(diseqc, &frequency);
    if (frequency == 0)
    return false;
    }
    else
    ResetToneAndVoltage();
    lastDiseqc = diseqc;
    lastSource = channel.Source();
    }
    }
    else {
    esyslog("ERROR: no DiSEqC parameters found for channel %d (%s)", channel.Number(), channel.Name());
    return false;
    }
    }
    else {
    int tone = SEC_TONE_OFF;
    -- if (frequency < (unsigned int)Setup.LnbSLOF) {
    -- frequency -= Setup.LnbFrequLo;
    ++ if (channel.Frequency() < Setup.LnbSLOF) {
    ++ frequency = abs(channel.Frequency() - Setup.LnbFrequLo);
    tone = SEC_TONE_OFF;
    }
    else {
    -- frequency -= Setup.LnbFrequHi;
    ++ frequency = abs(channel.Frequency() - Setup.LnbFrequHi);
    tone = SEC_TONE_ON;
    }
    int volt = (dtp.Polarization() == 'V' || dtp.Polarization() == 'R') ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18;
    if (!IsBondedMaster()) {
    tone = SEC_TONE_OFF;
    volt = SEC_VOLTAGE_13;
    }
    CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, volt));
    CHECK(ioctl(fd_frontend, FE_SET_TONE, tone));
    }
    -- frequency = abs(frequency); // Allow for C-band, where the frequency is less than the LOF

  • Klaus hat auf der ML schon einen Patch gepostet, der in den VDR 2.3.3 soll: https://www.linuxtv.org/pipermail/vdr/2017-March/029229.html

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Gibts dafür einen funktionierenden Patch für VDR 2.2 den ich mit C&P einfach anwenden kann? In der Mailingliste bekomme ich ne Bin-Datei und den Inhalt als diff rauskopieren funzt irgendwie auch nicht.. :(

  • In der Mailingliste bekomme ich ne Bin-Datei und den Inhalt als diff rauskopieren funzt irgendwie auch nicht..

    Einfach der Datei die Endung .diff verpassen... vdr_signed_patch.diff

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!