Forum: Compiler & IDEs Leap 42.3 AVR Toolchain tuts nicht


von Harald A. (ngf_fo)


Lesenswert?

Ich bekomme die AVR Toolchain unter Leap 42.3 nicht mehr ans laufen. 
Installiert wurde von den offiziellen Repos von opensuse. Soweit ich 
sehe sind einige Instalationspfade durcheinandergeraten. Wahrscheinlich 
fehlt nur irgendwo ein softlink um das ganze ans laufen zu bringen. Die 
avrlibc wird z.B in usr/avr/sys-root/.... installiert aber in 
/opt/cross/lib/gcc/avr/5.4.0/include gesucht. Spätestens beim beim 
linken scheitert es endgültig. Welche Pfade/links fehlen hier? Hier die 
Ausgabe eines compilerlaufs:
1
synth@linux-w560:~/Projekte/AVR/_369p_LFO_PWM> avr-gcc -Wall -v -Os -I /usr/avr/sys-root/include/util -I /usr/avr/sys-root/include -mmcu=atmega328p AVR_LFO_010.c -o AVR_LFO_010.elf
2
Using built-in specs.
3
Reading specs from /opt/cross/lib/gcc/avr/5.4.0/device-specs/specs-atmega328p
4
COLLECT_GCC=/opt/cross/bin/avr-gcc
5
COLLECT_LTO_WRAPPER=/opt/cross/libexec/gcc/avr/5.4.0/lto-wrapper
6
Target: avr
7
Configured with: ../gcc-5.4.0/configure -v --target=avr --disable-nls --mandir=/opt/cross/share/man --infodir=/opt/cross/share/info --program-prefix=avr- --prefix=/opt/cross --with-gnu-ld --with-gnu-as --enable-languages=c,c++ --disable-libssp --with-dwarf2
8
Thread model: single
9
gcc version 5.4.0 (GCC) 
10
COLLECT_GCC_OPTIONS='-Wall' '-v' '-Os' '-I' '/usr/avr/sys-root/include/util' '-I' '/usr/avr/sys-root/include'  '-o' 'AVR_LFO_010.elf' '-specs=device-specs/specs-atmega328p' '-mmcu=avr5'
11
 /opt/cross/libexec/gcc/avr/5.4.0/cc1 -quiet -v -I /usr/avr/sys-root/include/util -I /usr/avr/sys-root/include -imultilib avr5 -D__AVR_ATmega328P__ -D__AVR_DEVICE_NAME__=atmega328p AVR_LFO_010.c -mn-flash=1 -mno-skip-bug -quiet -dumpbase AVR_LFO_010.c -mmcu=avr5 -auxbase AVR_LFO_010 -Os -Wall -version -o /tmp/ccgsZUFu.s
12
GNU C11 (GCC) version 5.4.0 (avr)
13
        compiled by GNU C version 4.8.5, GMP version 5.1.3, MPFR version 3.1.2, MPC version 1.0.2
14
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
15
ignoring nonexistent directory "/opt/cross/lib/gcc/avr/5.4.0/../../../../avr/sys-include"
16
ignoring nonexistent directory "/opt/cross/lib/gcc/avr/5.4.0/../../../../avr/include"
17
#include "..." search starts here:
18
#include <...> search starts here:
19
 /usr/avr/sys-root/include/util
20
 /usr/avr/sys-root/include
21
 /opt/cross/lib/gcc/avr/5.4.0/include
22
 /opt/cross/lib/gcc/avr/5.4.0/include-fixed
23
End of search list.
24
GNU C11 (GCC) version 5.4.0 (avr)
25
        compiled by GNU C version 4.8.5, GMP version 5.1.3, MPFR version 3.1.2, MPC version 1.0.2
26
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
27
Compiler executable checksum: 167d173fe2074ee91f3130acbbef3eb3
28
AVR_LFO_010.c: In function 'ADC_Init':
29
AVR_LFO_010.c:105:12: warning: variable 'result' set but not used [-Wunused-but-set-variable]
30
   uint16_t result;
31
            ^
32
COLLECT_GCC_OPTIONS='-Wall' '-v' '-Os' '-I' '/usr/avr/sys-root/include/util' '-I' '/usr/avr/sys-root/include'  '-o' 'AVR_LFO_010.elf' '-specs=device-specs/specs-atmega328p' '-mmcu=avr5'
33
 /opt/cross/lib/gcc/avr/5.4.0/../../../../avr/bin/as -v -I /usr/avr/sys-root/include/util -I /usr/avr/sys-root/include -mmcu=avr5 -mno-skip-bug -o /tmp/ccQo56Ow.o /tmp/ccgsZUFu.s
34
GNU assembler version 2.29.1 (avr) using BFD version (GNU Binutils; CrossToolchain:avr / openSUSE_Leap_42.3) 2.29.1
35
COMPILER_PATH=/opt/cross/libexec/gcc/avr/5.4.0/:/opt/cross/libexec/gcc/avr/5.4.0/:/opt/cross/libexec/gcc/avr/:/opt/cross/lib/gcc/avr/5.4.0/:/opt/cross/lib/gcc/avr/:/opt/cross/lib/gcc/avr/5.4.0/../../../../avr/bin/
36
LIBRARY_PATH=/opt/cross/lib/gcc/avr/5.4.0/avr5/:/opt/cross/lib/gcc/avr/5.4.0/
37
COLLECT_GCC_OPTIONS='-Wall' '-v' '-Os' '-I' '/usr/avr/sys-root/include/util' '-I' '/usr/avr/sys-root/include'  '-o' 'AVR_LFO_010.elf' '-specs=device-specs/specs-atmega328p' '-mmcu=avr5'
38
 /opt/cross/libexec/gcc/avr/5.4.0/collect2 -plugin /opt/cross/libexec/gcc/avr/5.4.0/liblto_plugin.so -plugin-opt=/opt/cross/libexec/gcc/avr/5.4.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccQz4TYy.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lm -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-latmega328p -mavr5 -Tdata 0x800100 -o AVR_LFO_010.elf crtatmega328p.o -L/opt/cross/lib/gcc/avr/5.4.0/avr5 -L/opt/cross/lib/gcc/avr/5.4.0 /tmp/ccQo56Ow.o --start-group -lgcc -lm -lc -latmega328p --end-group
39
/opt/cross/lib/gcc/avr/5.4.0/../../../../avr/bin/ld: warning: -z relro ignored.
40
/opt/cross/lib/gcc/avr/5.4.0/../../../../avr/bin/ld: cannot find crtatmega328p.o: Datei oder Verzeichnis nicht gefunden
41
/opt/cross/lib/gcc/avr/5.4.0/../../../../avr/bin/ld: cannot find -lm
42
/opt/cross/lib/gcc/avr/5.4.0/../../../../avr/bin/ld: cannot find -lc
43
/opt/cross/lib/gcc/avr/5.4.0/../../../../avr/bin/ld: cannot find -latmega328p
44
collect2: error: ld returned 1 exit status
Kann hier jemand helfen? Wie krieg ich das geregelt?

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Harald A. schrieb:
> Ich bekomme die AVR Toolchain unter Leap 42.3 nicht mehr ans laufen.
> Installiert wurde von den offiziellen Repos von opensuse. Soweit ich
> sehe sind einige Instalationspfade durcheinandergeraten. Wahrscheinlich
> fehlt nur irgendwo ein softlink um das ganze ans laufen zu bringen.

Das sollte alles out-of-the-box funktionieren.  Wenn (soft) Links 
erforderlich sind, dann ist was mit der Installation / Distribution 
faul.

> Die avrlibc wird z.B in usr/avr/sys-root/.... installiert aber in
> /opt/cross/lib/gcc/avr/5.4.0/include gesucht.

Hier steht die libgcc und wird auch dort richtig gesucht, und das passt 
zu

> --prefix=/opt/cross

> Welche Pfade/links fehlen hier?

Die avr-libc Includes werden hier gesucht:

> ignoring nonexistent directory
> "/opt/cross/lib/gcc/avr/5.4.0/../../../../avr/include"

also in $prefix/avr/include, aber avr-libc wurde offenbar mit 
--prefix=usr/avr/sys-root/.... configured oder dahin installiert.

> -I /usr/avr/sys-root/include

Dies ist überflüssig bei korrekter Installation, und es wird eine 
zerböselte Toolchain nicht reparieren.

> Wie krieg ich das geregelt?

Deine Alternativen: Eine funktionierende Toolchain besorgen, z.B. die 
Atmel Toolchain für Linux, oder selbst generieren — die Quellen hast du 
ja. Beachte dabei, dass gcc und avr-libc nicht beliebig kombinierbar 
sind und explizite Abhängigkeiten bestehen.

von Harald A. (ngf_fo)


Lesenswert?

Danke, ja nun, die Hoffnung ist halt immer, das die richtigen Repos auch 
ein funktionierendes  System bereitstellen. Unter 42.2 hat das alles 
noch funktioniert. Mir ist klar das nur die richtigen links fehlen. 
Allerdings habe ich mich zeitweise ziemlich verirrt. Nur wenn die Repos 
keine funktionierende Installation bereitstellen ist es etwas schwierig 
eine funktionierende Kette zu finden.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Harald A. schrieb:
> Mir ist klar das nur die richtigen links fehlen.

Abermals: Nein.

So wie der Compiler configured wurde ist die avr-libc entweder nicht 
vorhanden (und die vorhandene gehört zu einer anderen Distribution) oder 
wurde falsch configured.  Oder der Compiler wurde falsch configured.

Und es ist keine sooo große Neuigkeit, dass Linux-Distros gerne mal 
verbockte Toolchains für exotische[tm] Tagets wie avr mitbringen.

Und das da gehört auch weg:

> -I /usr/avr/sys-root/include/util

Und was soll eigentlich das "sys-root" ?

: Bearbeitet durch User
von Harald A. (ngf_fo)


Lesenswert?

leap 42.3 kopiert die includes der avrlib nach 
/usr/avr/sys-root/includes...

Na dann ist wohl doch besser zu Fuß und selbst bauen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Harald A. schrieb:
> Na dann ist wohl doch besser zu Fuß und selbst bauen.

Hat den Vorteil, dass man --prefix selber wählen kann, z.B. in Home. 
Und wenn was schiefgeht, kann man einfach den Install-Folder löschen.

binutils nimmt man 2.29 oder master
gcc nimmt man 7.2 (branches/gcc-7-branch HEAD oder 
tags/gcc_7_2_0_release)
avr-libc nimmt man trunk

Und alles mit gleicher --prefix configuren.

Die Abhängigkeiten für GCC löst man auf per (aus GCC_SOURCE)
1
$ ./contrib/download_prerequisites
und beachten, dass GCC ein configure in source nicht unterstützt.

Die Schritte hatte ich da mal ausgetextet:

Beitrag "Re: AVR-GCC selbst bauen - Unter Linux für Windows?"

: Bearbeitet durch User
von Bernd C. (bmc69)


Lesenswert?

Ich bin heute nach einem Paketupdate über das gleiche Problem 
gestolpert:

Die Toolchain hatte bislang auch unter 42.3 funktioniert, nachdem ich 
OpenSuse aber als VM laufen lasse und somit nur gelegentlich starte, 
standen heute 63 Updates an und danach hat die AVR Toolchain nicht mehr 
funktioniert.

Nachdem ich gerade keine Lust hatte, mir meine eigene Toolchain zu 
compiliere n, habe ich es mit folgenden Links versucht:

cd /opt/cross/avr/
ln -s /usr/avr/sys-root/include include
ln -s /usr/avr/sys-root/lib lib
ln -s /usr/avr/sys-root/man man
ln -s /usr/avr/sys-root/share share

Auf den ersten Blick sieht es nun so aus, als ob wieder alles 
funktionieren würde...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Bernd C. schrieb:
> ln -s /usr/avr/sys-root/lib lib

Diesen Ordner verwendet auch Binutils.

von Bernd C. (bmc69)


Lesenswert?

Johann L. schrieb:
>> ln -s /usr/avr/sys-root/lib lib
>
> Diesen Ordner verwendet auch Binutils.

Nicht in dieser komischen OpenSUSE-Version:

rpm -ql cross-avr-binutils
/opt
/opt/cross
/opt/cross/avr
/opt/cross/avr/bin
/usr/avr
/usr/avr/bin
...

Im Directory "/opt/cross/avr" wird von diesem Paket nur das 
"bin"-Directory angelegt, was wiederum ein Symlink auf "/usr/avr/bin" 
ist...

von Harald A. (ngf_fo)


Lesenswert?

Herzlichen Dank für die Hilfe.

@Bernd

Die notwendigen Symlinks zu finden war genau meine Absicht. Leider habe 
ich mich dann verirrt weil ich zu kleinteilige links auf das jeweils 
fehlende file gesetzt habe. Jetzt funktioniert es mit einem kleinen 
Problem. Die Datei delay.h steht in /usr/avr/sys-root/include/util/ und 
wird nicht gefunden. Mit der Option -I kann ich das umgehen und den Pfad 
angeben und dann läufts.

Meine Verständnis war aber bisher das die Suche in...../include beginnt 
und dann in diesem Pfad weiter absteigt. Das scheint hier nicht der Fall 
zu sein. Irgend eine Idee?

@Johann

Danke für die Hinweise. Ich werde das mit der lokalen Installation 
sicher in Zukunft ausprobieren. Es ist besser das selbst im Griff zu 
haben als sich auf die Distries zu verlassen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Harald A. schrieb:
> Jetzt funktioniert es mit einem kleinen Problem. Die Datei delay.h steht
> in /usr/avr/sys-root/include/util/ und wird nicht gefunden.

Sollte sie aber.  Der Include erfolgt üblicherweise qua
1
#include <util/delay.h>
Wenn also andere Header in /usr/avr/sys-root/include gefunden werden, 
dann auch util/delay.h

von Harald A. (ngf_fo)


Lesenswert?

Du hast natürlich recht. Ich habe im sourcecode das util unterschlagen. 
Danke.

von Stefan K. (nukeman)


Lesenswert?

Danke für die Tipps! Hab hier Leap 42.2 und nach einem Anbieterwechsel 
der AVR-Toolchain auf cross-avr habe ich mir auch den Dreck an Land 
gezogen und es funktioniert hier seit gestern überhaupt nichts mehr :(
Den Include-Pfad kann ich manuell im Makefile noch umbiegen, was ja auch 
nicht sein sollte. Aber dann nimmt er wohl irgendwann den falschen 
Assember "as" und der begreift die AVR-Parameter natürlich nicht.

Im makefile steht als Compiler allerdings ganz klar "avr-gcc" drin und 
den findet die Kommando-Zeile auch ohne weitere Hilfestellung:

sk@linux-n5ws:~/bastel/atmel/git/Matrix2> avr-gcc -v
Using built-in specs.
Reading specs from /opt/cross/lib/gcc/avr/5.4.0/device-specs/specs-avr2
COLLECT_GCC=/opt/cross/bin/avr-gcc
COLLECT_LTO_WRAPPER=/opt/cross/libexec/gcc/avr/5.4.0/lto-wrapper
Target: avr
Configured with: ../gcc-5.4.0/configure -v --target=avr --disable-nls 
--mandir=/opt/cross/share/man --infodir=/opt/cross/share/info 
--program-prefix=avr- --prefix=/opt/cross --with-gnu-ld --with-gnu-as 
--enable-languages=c,c++ --disable-libssp --with-dwarf2
Thread model: single
gcc version 5.4.0 (GCC)

Das finde ich super-ärgerlich. Die Toolchain selbst bauen halte ich auch 
nicht für eine gute Option. Sowas muss einfach idiotensicher 
funktionieren, wenn man es per automatischem Update anbietet. Jetzt muss 
ich mich wieder tagelang mit Sekundär-Problemen rumschlagen, statt meine 
Projekte weiter zu bringen :(
Mein System hat inzwischen zig Pfade für avr-Quatsch und ich kann nicht 
beurteilen, welche veraltet sind und welche nicht.

Ohne externe Hilfe wie hier wäre ich wohl völlig aufgeschmissen. Ich 
muss mir die Vorschläge hier noch in Ruhe durchlesen.
Wenn es nicht klappt, werde ich wohl einen Raspi als externe 
AVR-Build-Station einrichten. Da scheint man das irgendwie besser im 
Griff zu haben.

Gruß,
Stefan

von Oliver S. (oliverso)


Lesenswert?

Nur, damit's dann doch noch gesagt wurde: Unter Windows waäre das nicht 
passiert...

Oliver

von Thomas Z. (thomas_z41)


Lesenswert?

Wenn die AVR Toolchain von Leap 42.3 nicht funktioniert, dann solltest 
du als erstes einen Bugreport bei openSUSE eröffnen. Nur so wird das 
repariert.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefan K. schrieb:
> Das finde ich super-ärgerlich. Die Toolchain selbst bauen halte ich auch
> nicht für eine gute Option.

Immerhin hast du dann was das funktioniert.  Und eine Umgebung zum 
Generieren hast du mit Linux auch.  Wie das vonstatten gehen kann hab 
ich oben angerissen: 
Beitrag "Re: Leap 42.3 AVR Toolchain tuts nicht"

> Jetzt muss
> ich mich wieder tagelang mit Sekundär-Problemen rumschlagen,

Naja, Tools (Binutils, GCC, LibC) zu generieren dauert keine 2 Tage. 
Man muss sich freilich erst mit dem Gedanken anfreunden.

Oliver S. schrieb:
> Unter Windows waäre das nicht
> passiert...

???

von Stefan K. (nukeman)


Lesenswert?

Als kurzer Nachtrag:
Hab mir die Toolchain gestern tatsächlich selbst kompiliert weil keine 
Besserung in Sicht war. Hab sie mir auch ins User-Verzeichnis 
installiert, so dass ich bei Bedarf schnell testweise umschalten kann, 
falls sich doch mal was in den Repositories tut.

>Oliver S. schrieb:
>> Unter Windows waäre das nicht
>> passiert...

Das dürfte als satirisches Bashing gemeint gewesen sein, schon wegen dem 
Rechtschreibfehler :)

von Christian F. (ferbar)


Lesenswert?

Ticket bei OpenSuSE dazu:
https://bugzilla.opensuse.org/show_bug.cgi?id=1081126

avr-libc ist aber schnell für avr-gcc 5.4 selber kompiliert:
1
zypper source-install avr-libc
unter ~/rpmbuild/SPECS/avr-libc.spec muss _prefix auf /opt/cross/avr 
gesetzt werden, sowie
1
%define PREFIX %{_prefix}/local
2
BuildRequires:  cross-avr-gcc%{gcc_version}-bootstrap
3
ln -s $RPM_BUILD_ROOT%PREFIX/lib/*

raus

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich habe eine opensuse Leaps 15.2 und es ist immer noch der Fehler 
enthalten.
Die avr-libc ist immer noch im falschem Verzeichnis /usr/avr/sys-root/

Das ist ein Mist.


Gibt es es ein Package was man unter /opt/cross einfach installieren 
kann?

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.