.titleBar { margin-bottom: 5px!important; }

[Problem] Fehler beim Kompilieren der Host-Tools für 7270/7570 - LZMA

Dieses Thema im Forum "Freetz" wurde erstellt von pengu, 15 Okt. 2011.

  1. pengu

    pengu Mitglied

    Registriert seit:
    18 Sep. 2008
    Beiträge:
    644
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Leipzig
    nach einiger Zeit Freetz-Abstinenz und Problemen mit einer meiner 7270 wollt ich es nun wieder wagen, doch habe ich mit dem aktuellen Trunk ein Problem beim Kompilieren von LZMA.

    Auch ein make dir- oder distclean hilft nicht.

    Es kommt entweder zu dem einen oder anderen Fehler:

    Code:
    
    make -j2 -C /data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib
    make[1]: Entering directory `/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib'
    g++ -O3 -Wall -c  -I ../../../ ZLib.cpp
    g++ -O3 -Wall -c  -I ../../../ ../LZMA/LZMAEncoder.cpp
    ZLib.cpp:183:31: Fehler: expected initializer before »OF«
    make[1]: *** [ZLib.o] Fehler 1
    make[1]: *** Warte auf noch nicht beendete Prozesse...
    ../LZMA/LZMAEncoder.cpp: In Elementfunktion »LONG NCompress::NLZMA::CEncoder::GetOptimumFast(UInt32, UInt32&, UInt32&)«:
    ../LZMA/LZMAEncoder.cpp:1207:68: Warnung: suggest parentheses around »&&« within »||«
    ../LZMA/LZMAEncoder.cpp:1208:69: Warnung: suggest parentheses around »&&« within »||«
    ../LZMA/LZMAEncoder.cpp:1223:82: Warnung: suggest parentheses around »&&« within »||«
    ../LZMA/LZMAEncoder.cpp:1225:97: Warnung: suggest parentheses around »&&« within »||«
    make[1]: Leaving directory `/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib'
    make: *** [/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib/liblzma.a] Fehler 2
    
    
    Code:
    make -j2 -C /data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib
    make[1]: Entering directory `/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib'
    g++ -O3 -Wall -c  -I ../../../ ZLib.cpp
    g++ -O3 -Wall -c  -I ../../../ ../LZ/LZInWindow.cpp
    ZLib.cpp:183:31: Fehler: expected initializer before »OF«
    make[1]: *** [ZLib.o] Fehler 1
    make[1]: *** Warte auf noch nicht beendete Prozesse...
    make[1]: Leaving directory `/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib'
    make: *** [/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib/liblzma.a] Fehler 2
    
    
    Anfangs dachte ich es könnte evtl am GCC liegen, also habe ich es mit dem 4.4.6 und 4.5.3 probiert, mit dem selben Ergebnis.

    Wie vielleicht schon aus früheren Beiträgen ersichtlich verwende ich ein aktuelles Gentoo Linux und hatte seit einem Jahr keine Probleme beim Kompilieren von Freetz.

    Wenn ich ein Image für die 7170 baue, läuft alles, was wohl an der älteren LZMA Version liegt.

    Hier noch ein paar Daten zu meinem System:

    Code:
    
    Portage 2.1.10.27 (default/linux/amd64/10.0/desktop, gcc-4.5.3, glibc-2.13-r4, 3.0.6-gentoo x86_64)
    =================================================================
    System uname: Linux-3.0.6-gentoo-x86_64-AMD_Athlon-tm-_II_X2_220_Processor-with-gentoo-2.1
    Timestamp of tree: Fri, 14 Oct 2011 22:15:01 +0000
    app-shells/bash:          4.2_p10
    dev-java/java-config:     2.1.11-r3
    dev-lang/python:          2.6.7-r2, 2.7.2-r3, 3.1.4-r3, 3.2.2
    dev-util/cmake:           2.8.5-r2
    dev-util/pkgconfig:       0.26
    sys-apps/baselayout:      2.1
    sys-apps/openrc:          0.9.3-r1::poly-c
    sys-apps/sandbox:         2.5
    sys-devel/autoconf:       2.13, 2.68
    sys-devel/automake:       1.6.3-r1, 1.8.5-r4, 1.9.6-r3, 1.10.3, 1.11.1-r1
    sys-devel/binutils:       2.21.1-r1
    sys-devel/gcc:            4.4.6-r1, 4.5.3-r1
    sys-devel/gcc-config:     1.4.1-r1
    sys-devel/libtool:        2.4-r3
    sys-devel/make:           3.82-r3
    sys-kernel/linux-headers: 2.6.39 (virtual/os-headers)
    sys-libs/glibc:           2.13-r4
    
    

    Ich werde das bei Gelegenheit mal auf einem aktuellen Ubuntu oder Debian System gegentesten.


    Erste Recherchen haben leider noch nichts ergeben, sonst hätte ich das Problem schon selbst gelöst.
     
  2. RalfFriedl

    RalfFriedl IPPF-Urgestein

    Registriert seit:
    22 Apr. 2007
    Beiträge:
    12,343
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Das Makro OF wird bei mir in /usr/include/zconf.h:166 definiert.
    Die Verwendung diese Makros an dieser Stelle ist absolut unsinnig, das Beste wäre, es zu entfernen.
     
  3. olistudent

    olistudent IPPF-Urgestein

    Registriert seit:
    19 Okt. 2004
    Beiträge:
    14,756
    Zustimmungen:
    2
    Punkte für Erfolge:
    0
    Beruf:
    Softwareentwickler
    Ort:
    Kaiserslautern
    Was macht das Macro?
    Code:
    #ifndef OF /* function prototypes */
    #  ifdef STDC
    #    define OF(args)  args
    #  else
    #    define OF(args)  ()
    #  endif
    #endif
    
    Könnte man da einfach OF() weglassen und nur die Parameter stehen lassen?

    Gruß
    Oliver
     
  4. RalfFriedl

    RalfFriedl IPPF-Urgestein

    Registriert seit:
    22 Apr. 2007
    Beiträge:
    12,343
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Das Makro macht nichts sinnvolles und gehört an der Stelle (Definition einer Funktion) nicht hin.

    Bei der Deklaration einer Funktion kann man damit den Code kompatibel zu alten (uralten) Compilern machen, aus der Zeit vor C89, vielleicht noch vorher. Daher auch der Test auf STDC (Standard C).

    Zu Zeiten des ursprünglichen K&R C hat man Funktionen so geschrieben:
    Code:
    /* Deklaration: */
    extern int func ();
    /* Definition */
    int func ()
    int param;
    {
      return param;
    }
    
    Seit mindestens 20 Jahren schreibt man es so:
    Code:
    /* Deklaration: */
    extern int func (int param);
    /* Definition */
    int func (int param)
    {
      return param;
    }
    
    Die Deklaration kann man mit dem Makro vereinheitlichen:
    Code:
    /* Deklaration: */
    extern int func OF((int param));
    
    Damit wird entweder die alte oder die neue Form erzeugt. Wenn man aber das Makro in der Definition der Funktion verwendet, kommt das heraus:
    Code:
    /* Definition */
    int func ()
    {
      return param;
    }
    
    Und das kann niemals funktionieren, weil der Parameter nicht definiert wird.

    Man sieht daran, dass dieses Stück Programm noch nie mit einem alten Compiler übersetzt wurde

    Die andere Frage ist, warum hier auf dem Build-System das Makro nicht definiert wird.
     
  5. pengu

    pengu Mitglied

    Registriert seit:
    18 Sep. 2008
    Beiträge:
    644
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Leipzig
    #5 pengu, 18 Okt. 2011
    Zuletzt bearbeitet: 18 Okt. 2011
    @ RalfFridl
    Da geb ich dir recht.
    Und genau da ist das Problem.
    Nach näherer Untersuchung fand ich bereits am Sonntag Abend heraus, dass genau da das Problem liegt.
    Bis zur Zlib Version 1.2.3 ist das auch so, doch genau das änderte sich in Version >=1.2.5.
    Dort wurde das Makro in _Z_OF unbenannt.

    Code:
    
    #ifndef _Z_OF /* function prototypes */
    #    define _Z_OF(args)  args
    #    define _Z_OF(args)  ()
    
    

    Durch das Umbenennen das nicht mehr:

    Code:
    
    
    ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
                                      const Bytef *source, uLong sourceLen,
                                      int level))
    {
    
    
     
  6. RalfFriedl

    RalfFriedl IPPF-Urgestein

    Registriert seit:
    22 Apr. 2007
    Beiträge:
    12,343
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Damit ist schon mal geklärt, warum das Makro jetzt nicht mehr definiert ist.

    Bevor man aber den Namen jetzt ändert, ist es besser, das Makro komplett zu entfernen.
     
  7. pengu

    pengu Mitglied

    Registriert seit:
    18 Sep. 2008
    Beiträge:
    644
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Leipzig
    #7 pengu, 18 Okt. 2011
    Zuletzt bearbeitet: 18 Okt. 2011
    Entfernen ist eine Idee, oder die zlib (1.2.3) in die Host-Tools zu nehmen und explizit verwenden.
    Diese muss vor der LZMA lib gebaut werden (da diese von zlib abhängt)
     
  8. olistudent

    olistudent IPPF-Urgestein

    Registriert seit:
    19 Okt. 2004
    Beiträge:
    14,756
    Zustimmungen:
    2
    Punkte für Erfolge:
    0
    Beruf:
    Softwareentwickler
    Ort:
    Kaiserslautern
    @Ralf
    So?

    Code:
    Index: tools/make/patches/100-lzma_zlib.lzma.patch
    ===================================================================
    --- tools/make/patches/100-lzma_zlib.lzma.patch	(revision 7808)
    +++ tools/make/patches/100-lzma_zlib.lzma.patch	(working copy)
    @@ -311,9 +311,9 @@
     +	UInt64 m_offset;
     +};
     +
    -+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
    ++ZEXTERN int ZEXPORT compress2 (Bytef *dest,   uLongf *destLen,
     +                                  const Bytef *source, uLong sourceLen,
    -+                                  int level))
    ++                                  int level)
     +{
     +	CInMemoryStream *inStreamSpec = new CInMemoryStream(source, sourceLen);
     +	CMyComPtr<ISequentialInStream> inStream = inStreamSpec;
    @@ -374,8 +374,8 @@
     +	return Z_OK;
     +}
     +
    -+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
    -+                                   const Bytef *source, uLong sourceLen))
    ++ZEXTERN int ZEXPORT uncompress (Bytef *dest,   uLongf *destLen,
    ++                                   const Bytef *source, uLong sourceLen)
     +{
     +	CInMemoryStream *inStreamSpec = new CInMemoryStream(source, sourceLen);
     +	CMyComPtr<ISequentialInStream> inStream = inStreamSpec;
    
    Gruß
    Oliver
     
  9. RalfFriedl

    RalfFriedl IPPF-Urgestein

    Registriert seit:
    22 Apr. 2007
    Beiträge:
    12,343
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Genau so.

    Es scheint auch die einzige Stelle zu sein, wo diesen Makro verwendet wird. Es gibt nicht einmal irgendwo eine Deklaration, für diese Funktionen oder für andere, wo das Makro verwendet wird.

    Es gibt unter http://www.7-zip.org/sdk.html inzwischen eine Version 9.20, von daher bringt es wohl nicht, das dem Autor zu schreiben. Die aktuelle Version enthält jedenfalls kein OF Makro mehr.
     
  10. olistudent

    olistudent IPPF-Urgestein

    Registriert seit:
    19 Okt. 2004
    Beiträge:
    14,756
    Zustimmungen:
    2
    Punkte für Erfolge:
    0
    Beruf:
    Softwareentwickler
    Ort:
    Kaiserslautern