Forum: Compiler & IDEs Problem beim compiliren der avr-libc-1.7.1


von Uhu U. (uhu)


Angehängte Dateien:

Lesenswert?

Ich möchte unter Ubuntu 10.04 die avr-Toolchain compilieren. Dazu habe 
ich mich so weit möglich an 
http://www.rn-wissen.de/index.php/Avr-gcc_und_avrdude_installieren 
gehalten. binutils ging leicht und avr-gcc habe ich nach einigen 
Klimmzügen compiliert bekommen. (Es fehlten mpc, mpfr und gmp im 
System.)

Bei der avr-libc-1.7.1 beiße ich gerade auf was Hartes: config bricht ab 
mit
1
inet@lx5:/tmp/avr-libc-1.7.1$ ./configure --prefix=/usr/local/avr --build=`./config.guess` --host=avr
2
checking build system type... x86_64-unknown-linux-gnu
3
checking host system type... avr-unknown-none
4
checking if configuring for cross compile... yes
5
checking if target host is avr... yes
6
checking for a BSD-compatible install... /usr/bin/install -c
7
checking whether build environment is sane... yes
8
checking for avr-strip... avr-strip
9
checking for a thread-safe mkdir -p... /bin/mkdir -p
10
checking for gawk... gawk
11
checking whether make sets $(MAKE)... yes
12
checking for avr-gcc... avr-gcc
13
checking whether we are cross compiling... yes
14
checking for suffix of object files... configure: error: in `/tmp/avr-libc-1.7.1':
15
configure: error: cannot compute suffix of object files: cannot compile
16
See `config.log' for more details

Die config.log ist im Anhang.

Was ist da los?

: Verschoben durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hast du denn selbst mal reingeguckt in das Log?
1
/usr/local/avr/libexec/gcc/avr/4.6.0/cc1: error while loading shared libraries: libmpc.so.2: cannot open shared object file: No such file or directory

Dein compilierter AVR-GCC verlässt sich auf eine shared lib, die nicht
gefunden wird.  Eventuell musst du LD_LIBRARY_PATH entsprechend setzen.

von Uhu U. (uhu)


Lesenswert?

LD_LIBRARY_PATH war der Knoten, danke.

von Uhu U. (uhu)


Lesenswert?

Puh, das war zu früh gefreut. Jetzt seilt sich der gcc auch in make 
noch mit
1
avr-gcc -DHAVE_CONFIG_H -I. -I../../..  -I../../../common -I../../../include -I../../../include  -g -Wall -W -Wstrict-prototypes -mmcu=avr2 -D__COMPILING_AVR_LIBC__ -mcall-prologues -Os  -MT dtostre.o -MD -MP -MF .deps/dtostre.Tpo -c -o dtostre.o ../../../libc/stdlib/dtostre.c
2
../../../libc/stdlib/dtostre.c: In function 'dtostre':
3
../../../libc/stdlib/dtostre.c:63:2: internal compiler error: in build_unary_op, at c-typeck.c:3786

ab...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hmm, da machst du dich gerade zum Betatester für die allerneuesten
Toolversionen ... der internal compiler error ist im GCC selbst
bereits repariert, allerdings würde er dir dafür mit einem regulären
Compilierfehler um die Ohren fliegen. ;-)

Im Anhang mal ein Snapshot der aktuellen Quellen (SVN-Stand von
heute), der sich hoffentlich mit einem GCC 4.6.0 compilieren lassen
sollte.

von Uhu U. (uhu)


Lesenswert?

Danke für die neue Version. Compilieren tut sie, nur beim make install 
findet er avr-ranlib nicht, obwohl sie im PATH steht. Mal sehen, was da 
los ist...

Daß die 1.7.1 Betastatus hat, war dort, wo ich sie gefunden hatte, aber 
nirgends vermerkt: http://download.savannah.gnu.org/releases/avr-libc/

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:
> Daß die 1.7.1 Betastatus hat

Hat ja keiner behauptet, aber du hast einen Compiler genommen zum
compilieren, den bis zum Erstellen der avr-libc 1.7.1 noch niemand
benutzt hatte.  Damit sind die Fehler (die eindeutig in der
Bibliothek lagen), die erst durch diese Compilerversion zutage
traten, vorher nicht entdeckt worden.

von Uhu U. (uhu)


Lesenswert?

Das Problem mit dem make install ist mysteriös:
1
$ which avr-ranlib
2
/usr/local/avr/bin/avr-ranlib
3
$ echo $PATH
4
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/avr/.rvm/bin:/usr/local/avr/bin:/usr/local/bin

sudo make install scheitert mit:
1
/bin/bash: line 5: avr-ranlib: command not found
2
make[5]: *** [install-avrLIBRARIES] Error 127
3
make[4]: *** [install-am] Error 2
4
make[3]: *** [install-recursive] Error 1
5
make[2]: *** [install-recursive] Error 1
6
make[1]: *** [install-recursive] Error 1
7
make: *** [install-recursive] Error 1

Wenn ich avr-ranlib von der Kommandozeile aufrufe, antwortet es mit
1
$ avr-ranlib --version
2
GNU ranlib (GNU Binutils) 2.20
3
Copyright 2009 Free Software Foundation, Inc.
4
This program is free software; you may redistribute it under the terms of
5
the GNU General Public License version 3 or (at your option) any later version.
6
This program has absolutely no warranty.

Wird das Teil etwa in irgend einer anderen Pfad-Variablen erwartet?

von Troll (Gast)


Lesenswert?

Ist /usr/local/avr/bin auch im PATH von root?

sudo echo $PATH

von Uhu U. (uhu)


Lesenswert?

Troll schrieb:
> Ist /usr/local/avr/bin auch im PATH von root?
>
> sudo echo $PATH

Ja. Das alte Environment wird durchgereicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dann wirst du wohl mal strace bemühen müssen oder dergleichen Werkzeuge.

von Uhu U. (uhu)


Lesenswert?

So, Compiler und libs sind gebaut.

Nun das nächste Problem mit der libc von hier: 
Beitrag "Re: Problem beim compiliren der avr-libc-1.7.1"

Code von Peter Fleury, der im AVR-Studio 4 fehlerfreu läuft, produziert 
zwei Fehler:

 #define UART0_RECEIVE_INTERRUPT   SIG_USART_RECV
 #define UART0_TRANSMIT_INTERRUPT  SIG_USART_DATA
1
../uart.c:148:36: error: attempt to use poisoned "SIG_USART_RECV"
2
../uart.c:149:36: error: attempt to use poisoned "SIG_USART_DATA"

Leider finde ich das entsprechende #pragma nicht, das die Ursache ist.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:

>
1
> ../uart.c:148:36: error: attempt to use poisoned "SIG_USART_RECV"
2
> ../uart.c:149:36: error: attempt to use poisoned "SIG_USART_DATA"
3
>
>
> Leider finde ich das entsprechende #pragma nicht, das die Ursache ist.

Du sollst ja auch nicht die Augen zukleistern, damit du das Symptom
nicht mehr siehst, sondern die Ursache beseitigen. ;-)  Die
Interruptvektornamen, die auf SIG_ beginnen, wurden vor nunmehr
5,5 Jahren als veraltet markiert zusammen mit dem kompletten Begriff
"signal" für das Interrupthandling, weil dieser immer wieder zu
Verwirrung geführt hatte.

Schreib' den Code um, dass er ..._vect-Namen benutzt.

von Uhu U. (uhu)


Lesenswert?

Jörg Wunsch schrieb:
> Du sollst ja auch nicht die Augen zukleistern, damit du das Symptom
> nicht mehr siehst, sondern die Ursache beseitigen. ;-)

Ich hatte gehofft, dort irgend welche Hinweise zu finden. Wo ist denn 
das Pragma zu finden?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:

> Wo ist denn
> das Pragma zu finden?

Irgendwo in den Headers.  GCC benutzt weitgehend keine Pragmas, sondern
_attribute_.  Da wirst du aber nicht viel mehr sehen außer
__attribute__((deprecated)) oder sowas.  Lesen der avr-libc-Doku sollte
eigentlich genügen, um die passenden Vektornamen zu finden.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:

> [...] zusammen mit dem kompletten Begriff
> "signal" für das Interrupthandling, weil dieser immer wieder zu
> Verwirrung geführt hatte.

Ok, eine Wotrwahl ändern ist ja was anderes als

poisoned

WOAS??? poisoned?

> Schreib' den Code um, dass er ..._vect-Namen benutzt.

Mit einem Handstreich werden zig im Netz verfügbare Anwendungen 
uncompilerbar???

Damit schiessen sich die GNU-Tools/avr-libc doch selbst ins Knie -- 
komplett ohne Not...

Nur weil ein paar Leute SIGNAL und INTERRUPT nicht richtig anzuwenden 
wussten? Ist heutzutage auch nicht besser bei dem Code, den man oft 
sieht mit CLI in ISR-Prolog und SEI im Epilog.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:

> Ok, eine Wotrwahl ändern ist ja was anderes als
>
> *poisoned*

Da musst du dich bei den GCC-Entwicklern beschweren, denn die haben
sich diesen Namen ja ausgedacht.

> Mit einem Handstreich werden zig im Netz verfügbare Anwendungen
> uncompilerbar?

Die, die sich bereits seit vielen Jahren beharrlich weigern, die
vorgesehenen APIs zu benutzen.

Allerdings sollten wir irgendwie einen Schalter finden, wie man den
Sourcecode trotzdem noch compiliert bekommt, das sollte man auf der
avr-libc-Liste diskutieren.  Da GCC ja auch C99-style _Pragma()
unterstützt, sollte das machbar sein, sowas zu #ifdef'en (bzw. über
ein #define wegzudefinieren).

> Nur weil ein paar Leute SIGNAL und INTERRUPT nicht richtig anzuwenden
> wussten?

Das war dazumals ein Krampf, glaub's mir.  Es gab verdammt viele Leute,
die ihre ISRs mit INTERRUPT() geschrieben haben, weil's ja ein
Interrupt ist ... dieser Name war ein Fehlschlag von Beginn an, warum
auch immer sich Marek und Denis damals SIGNAL() für die "normalen"
ISRs ausgedacht hatten.  Mittlerweile diskutiert kein Schwein mehr
und will das alte SIGNAL() zurück haben, nur die blöden SIG_xxx-
Namen für die Vektoren halten sich wie Kletten, weil es halt 2005
noch keine Möglichkeit im GCC gab, derartige Namen "weich auszuführen".

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:
> Allerdings sollten wir irgendwie einen Schalter finden, wie man den
> Sourcecode trotzdem noch compiliert bekommt

Ähem, den gibt's schon:

-D__AVR_LIBC_DEPRECATED_ENABLE__

von Uhu U. (uhu)


Lesenswert?

Jörg Wunsch schrieb:
> Irgendwo in den Headers.

Z.B. in iomx8.h

> Die, die sich bereits seit vielen Jahren beharrlich weigern, die
> vorgesehenen APIs zu benutzen.

Kein Wunder, denn AVR-Studio 4 nimmt das ohne Murren hin...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:
> Johann L. schrieb:
>
>> Ok, eine Wortwahl ändern ist ja was anderes als
>>
>> *poisoned*
>
> Da musst du dich bei den GCC-Entwicklern beschweren, denn die haben
> sich diesen Namen ja ausgedacht.

poisoned ist mir bekannt. Aber das poisoning geschieht nicht im gcc, 
sondern in der avr-libc wenn ich's recht versteh.

Was ich meinte war, daß es was anderes ist, die Wortwahl zu "signal" zu 
ändern, als Makros in <avr/io.h> zu vergiften.

>> Mit einem Handstreich werden zig im Netz verfügbare Anwendungen
>> uncompilerbar?
>
> Die, die sich bereits seit vielen Jahren beharrlich weigern, die
> vorgesehenen APIs zu benutzen.

Wenn es eine Anwendung ist, die keine Änderung braucht -- eben weil 
sie gut ist und schlicht und ergreifend läuft -- wird auch nix dran 
geändert. Oft stehen sie irgendwo als Download bereit; die Projekte sind 
abgeschlossen und eben fertig. Das hat nix mit weigern zu tun. Nur 
weil Code älter als 5 Jahre ist, ist er dadurch doch nicht schlecht oder 
ineffizient oder falsch. Er ist eben fertig und abgeschlossen -- ein 
Zustand, den eine Bibliothek oder ein Compiler wohl nie erreichen wird, 
aber dennoch gibt's so was ;-)

> Allerdings sollten wir irgendwie einen Schalter finden, wie man den
> Sourcecode trotzdem noch compiliert bekommt, das sollte man auf der

Ok, ein Messer um die Kugel wieder aus dem Knie zu puhlen...

> avr-libc-Liste diskutieren.  Da GCC ja auch C99-style _Pragma()
> unterstützt, sollte das machbar sein, sowas zu #ifdef'en (bzw. über
> ein #define wegzudefinieren).

... womit aber die Anwendungen immer noch nicht übersetzbar sind. Der 
versierte Anwender wird wissen wo es hakt und an welchem 
Stellschräubchen (irgendwelche Compilerflage in irgendwelchen Makefiles) 
zu drehen ist.

Glaubst du etwa, ein Poisoning und die Myriaden Anfragen in allen Foren 
erzeugen weniger Aufwand als die Header einfach so zu lassen wie sie 
sind? Für neue Derivate ist's eh Wurscht und für die alten tun die paar 
Zeilen doch keinem Weh.

Ich find's immer noch einen riesen Unterschied, ob ein Projekt, daß man 
ausm Web runterlädt, ein paar Angestaubte Features benutzt und sich 
klaglos übersetzten lässt und schnurrt; oder ob es schon den Build 
verweigert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:

>> Die, die sich bereits seit vielen Jahren beharrlich weigern, die
>> vorgesehenen APIs zu benutzen.
>
> Kein Wunder, denn AVR-Studio 4 nimmt das ohne Murren hin...

Klar, wie sollte das auch in der Lage sein, den Inhalt deines
Programms zu analysieren?

Johann L. schrieb:
> Aber das poisoning geschieht nicht im gcc,
> sondern in der avr-libc wenn ich's recht versteh.

Ja, aber es gibt keine andere Methode als dieses "Vergiften", die der
GCC uns bereitstellt, damit wir endlich die Leute mal dazu bringen,
seit Jahren in der Doku als "deprecated" markierte Dinge aus dem
Verkehr zu ziehen.

> Nur
> weil Code älter als 5 Jahre ist, ist er dadurch doch nicht schlecht oder
> ineffizient oder falsch.

Wenn das Projekt so lange nicht mehr gepflegt worden wäre, wäre es
schon längst in Stücke zerfallen.  Seither haben sich doch viel öfter
schon IO-Register-Namen in den AVRs geändert (bis sie nun endlich mal
bei einer weitgehend einheitlichen Namensgebung angekommen sind,
gottlob) als die paar Änderungen in der avr-libc.  (Pascal Stangs
avrlib ist ein typisches Beispiel dieser Kategorie, seit Jahren
ungepflegt und dadurch mittlerweile nicht mehr benutzbar.)  Nein, der
Herr Fleury hat sich da, eben weil es keinen Compilerfehler gab, um
diese Stellen nie wieder drum gekümmert.  Insofern wäre er
eigentlich der Adressat für die Beschwerden hier.  (Headerfiles für
neue Controller haben übrigens die alten Namen nie erhalten, insofern
wird auch seine Bibliothek hier allmählich dem "bit rot" verfallen,
ganze ohne "Vergiftung".)

Aber bezüglich avr-libc das ist hier nicht der richtige Platz, das zu
diskutieren: das Ganze war letztlich Erics Idee, der auf der
avr-libc-Liste niemand widersprochen hat.  Noch gibt es keinen
avr-libc-Release damit (das, was ich dem Uhu hier gegeben habe, war ja
nur ein SVN-Snapshot), insofern ist jetzt genau der richtige
Zeitpunkt, das auf der avr-libc-Liste in Frage zu stellen, wenn du
(oder jemand anders hier) denkst, dass das mit den "vergifteten"
SIG_xxx-Namen zu einem Problem wird.

von Uhu U. (uhu)


Lesenswert?

Jörg Wunsch schrieb:
> Insofern wäre er
> eigentlich der Adressat für die Beschwerden hier.

Na ja, das mag von der Theorie her richtig sein, aber im praktischen 
Einsatz ist das der Gaul von hinten aufgezäumt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:

> Na ja, das mag von der Theorie her richtig sein, aber im praktischen
> Einsatz ist das der Gaul von hinten aufgezäumt.

Wieso?  Was würde dir das auf einem der neueren Controller helfen,
auf denen es die alten Namen nie gegeben hat?

Nein, "Maintainer" eines Pakets zu sein, hat was mit "Maintenance"
zu tun, und das wiederum bedeutet, dass man zumindest gelegentlich
mal "nach dem Rechten schaut".  (Nicht, dass ich in dieser Beziehung
ein guter Maintainer für all die Dinge wäre, die ich jemals angefasst
habe, aber ich bin mir da zumindest meiner Schuld bewusst.)

Wie schon geschrieben, wenn du den alten Schrott partout weiter
benutzen willst, bis er ganz auseinanderfällt, dann bau' das
-D__AVR_LIBC_DEPRECATED_ENABLE__ ins Makefile rein.  Wenn du Peter
Fleury als Dank für seine Bibliothek einen Gefallen tun willst, dann
such dir raus, wie die Vektornamen jetzt heißen sollten (diese
stimmen übrigens seit der Umstellung mit dem Datenblatt überein,
während sie davor jeweils frei erfunden waren) und schick dem Peter
einen Patch.  Dann wird seine Bibliothek das Problem noch vor dem
Release der avr-libc-1.7.2 los (wobei es sein kann, dass ich sie auch
als avr-libc-1.8.0 releasen werde, um auf die "Vergiftungserscheinung"
explizit hinzuweisen).

von Uhu U. (uhu)


Lesenswert?

Jörg Wunsch schrieb:
> Wie schon geschrieben, wenn du den alten Schrott partout weiter
> benutzen willst, bis er ganz auseinanderfällt, dann bau' das
> -D__AVR_LIBC_DEPRECATED_ENABLE__ ins Makefile rein.

Da waren wirklich nur die alten SIG-Namen gegen die neuen auszutauschen 
und bevor die Funktionen auseinanderfallen, fällt der alte Mega88 
auseinander...

Ich habe jedenfalls schon erlebt, daß ein altes Paket mal neu compiliert 
werden mußte und die alte Generierungsumgebung nicht mehr verfügbar war 
und dann ein Haufen Zeit für völlig unproduktive Änderungen verbraten 
wurden mußte, um den alten Text an neue Konventionen anzupassen. Das 
sind Fehlerquellen, die man lieber meidet.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Noch ne Frage zu den ISR-Nomenklatur: Gibt's da irgendein System?

Ich glaubte ja, zwischen den Zeilen rausgelesen zu haben, daß die 
ISR-Namen geändert wurden, um die den Handbüchern anzugleichen.

Bei der Anpassung gab's direkt ne Bauchlandung:

Z.B: ATtiny24

Handbuch: TIMER1_CAPT
avr-libc: TIMER1_CAPT_vect

aber:

Handbuch: TIMER1_COMPA, TIMER0_OVF, ...
avr-libc: TIM1_COMPA_vect, TIM0_OVF_vect, ...

Gibt's da irgendein System? Wozu die ganze Umstellung, wenn's immer noch 
Phantasienamen sind?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:

> Handbuch: TIMER1_COMPA, TIMER0_OVF, ...
> avr-libc: TIM1_COMPA_vect, TIM0_OVF_vect, ...

Nö, die stimmen schon mit dem Datenblatt überein (leider, bei
anderen AVRs heißen die alle lang).  Aber der TIMER1_CAPT_vect stimmt
nicht mehr.  In der ersten Datenblattversion, die ich seinerzeit zur
Verfügung hatte, als ich das implementiert habe, hieß dieser Vektor
wirklich auch im Datenblatt noch anders.  Das haben sie erst später
geändert, heimlich, still und leise.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Heisst also konkret:

Immer wenn Atmel lustig ist und Umbenennungen vornimmt, ändert sich das 
Interface? Wäre doch sinniger -- wenn überhaupt -- neue Bezeichner 
hinzuzufügen, auch eine ISR dann auf mehrere Namen horcht.

Werden die alten Namen dann auch alle vergiftet?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:
> Aber der TIMER1_CAPT_vect stimmt
> nicht mehr.

Hab' gerade nochmal nachgesehen, der ist ja auch nur noch deshalb
drin, weil er eben in den ersten Versionen so im Datenblatt stand.
TIM1_CAPT_vect steht nun alternativ noch mit dabei.

Kann sein, dass die avr-libc-Doku hier nicht up-to-date ist; das war
eigentlich mal so gedacht, dass man diese automatisch aktualisiert
beim Generieren der Headerdateien aus den XML-Daten, aber das läuft
nun mittlerweile alles ganz anders, und die Doku ist leider in
diesem Prozess etwas stiefmütterlich behandelt. :/

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:

> Immer wenn Atmel lustig ist und Umbenennungen vornimmt, ändert sich das
> Interface? Wäre doch sinniger -- wenn überhaupt -- neue Bezeichner
> hinzuzufügen, auch eine ISR dann auf mehrere Namen horcht.

Ist ja in diesem Falle auch der Fall.

Ja, glücklich über diese Umbenennungen in den Datenblättern
bin ich auch nicht, aber daran können wir nun kaum was ändern, und
die Datenblätter haben hier definitiven Charakter.

> Werden die alten Namen dann auch alle vergiftet?

Vermutlich nicht, allerdings sind derartige Umbenennungen (zum Glück)
doch eher die Ausnahme.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.