vdr-2.2.0 kompiliert mit gcc7 nicht

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


    Code
    1. 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
    2. dvbdevice.c: In member function 'bool cDvbTuner::SetFrontend()':
    3. dvbdevice.c:851:31: error: call of overloaded 'abs(unsigned int&)' is ambiguous
    4. frequency = abs(frequency); // Allow for C-band, where the frequency is less than the LOF
    5. ^


    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: TeVii S471 S/S2, TT6400-S2
    SW: Fedora 30, kernel-5.2.11-200.fc30.x86_64, vdr-2.4.1-1.fc30.x86_64

  • 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
    1. 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.)

  • 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.)