# [SOLVED][avr-gcc] Błąd przy kompilacji

## szybi

Próbowałem najpierw

emerge crossdev

crossdev -t avr

ale wysypało się przy kompilacji gcc. Potem próbowałem gcc ze źródeł i taki błąd się pojawia

```

Checking multilib configuration for libgcc...

make[2]: Wejście do katalogu `/usr/local/src/gcc-4.3.1/avr/libgcc'

Makefile:144: ../.././gcc/libgcc.mvars: Nie ma takiego pliku ani katalogu

make[2]: *** Brak reguł do wykonania obiektu `../.././gcc/libgcc.mvars'. Stop.

make[2]: Opuszczenie katalogu `/usr/local/src/gcc-4.3.1/avr/libgcc'

make[1]: *** [all-target-libgcc] Błąd 2

make[1]: Opuszczenie katalogu `/usr/local/src/gcc-4.3.1'

make: *** [all] Błąd 2

```

Wygląda na to, że zamiast kropki powinno być host-i686-pc-linux-gnu, bo to jest jedyna lokalizacja, gdzie jest libgcc.mvars. Ale jak by to takie proste było, to chyba by to poprawili przez kilka ostatnich wersji, prawda? Może komuś udało się skompilować gcc na procesory avr?

PozdrawiamLast edited by szybi on Sat Jul 05, 2008 2:19 pm; edited 1 time in total

----------

## dziadu

Już nie pamiętam, bawiłem się tym kilka lat temu, ale czy przypadkiem nie wystarczy mieć tylko avr-libc? Nie potrzebujesz gcc które uruchamiasz na AVR ale gcc uruchamiane na x86 i jako format pliku wyjściowego wybierasz AVR.

----------

## szybi

Sprawdziłem i okazuje się, że nie starczy. avr-libc nie chce się skompilować bez avr-gcc. Pojawia się komunikwat:

Failed to locate 'avr-gcc' in $PATH. You can install an AVR toolchain using:

    $ crossdev -t avr

z resztą, przy kompilacji gcc jako target podaje się avr, a host jest i686 (w tym przypadku).

----------

## Jebediah

Kiedyś też męczyłem się z avr-gcc i zbudowałem to tradycyjnymi metodami  :Smile: 

Zapewne błąd z pierwszego postu wynika z tego że budowałeś gcc w katalogu ze źródłami..

Można używać drobnych optymalizacji CFLAGS, ale bez przesady..

Ja to zrobiłem tak:

1) binutils: ftp://ftp.gnu.org/gnu/binutils/binutils-2.18.tar.bz2

Po ściągnieciu dajesz: tar -jxvf binutils-2.18.tar.bz2

Następnie trzeba zaaplikować małą łatke na binutils żeby zlikwidować drobny problem przy budowie gcc:

```
diff -urN binutils-2.18/gas/config/tc-avr.c ../binutils-2.18/gas/config/tc-avr.c

--- binutils-2.18/gas/config/tc-avr.c   2007-08-06 19:59:55.000000000 +0000

+++ binutils-2.18/gas/config/tc-avr.c   2008-07-04 18:40:43.000000000 +0000

@@ -63,7 +63,7 @@

 {

   {"avr1",       AVR_ISA_TINY1,   bfd_mach_avr1},

   {"avr2",       AVR_ISA_TINY2,   bfd_mach_avr2},

-  {"avr3",       AVR_ISA_M103,    bfd_mach_avr3},

+  {"avr3",       AVR_ISA_USB162,  bfd_mach_avr3},

   {"avr4",       AVR_ISA_M8,      bfd_mach_avr4},

   {"avr5",       AVR_ISA_ALL,     bfd_mach_avr5},

   {"avr6",       AVR_ISA_ALL,     bfd_mach_avr6},

@@ -102,6 +102,8 @@

   {"at43usb320", AVR_ISA_M103,    bfd_mach_avr3},

   {"at43usb355", AVR_ISA_M603,    bfd_mach_avr3},

   {"at76c711",   AVR_ISA_M603,    bfd_mach_avr3},

+  {"at90usb82",  AVR_ISA_USB162,  bfd_mach_avr3},

+  {"at90usb162", AVR_ISA_USB162,  bfd_mach_avr3},

   {"atmega48",   AVR_ISA_PWMx,    bfd_mach_avr4},

   {"atmega8",    AVR_ISA_M8,      bfd_mach_avr4},

   {"atmega83",   AVR_ISA_M8,      bfd_mach_avr4}, /* XXX -> m8535 */

@@ -150,8 +152,6 @@

   {"at90can32" , AVR_ISA_M323,    bfd_mach_avr5},

   {"at90can64" , AVR_ISA_M323,    bfd_mach_avr5},

   {"at90can128", AVR_ISA_M128,    bfd_mach_avr5},

-  {"at90usb82",  AVR_ISA_M323,    bfd_mach_avr5},

-  {"at90usb162", AVR_ISA_M323,    bfd_mach_avr5},

   {"at90usb646", AVR_ISA_M323,    bfd_mach_avr5},

   {"at90usb647", AVR_ISA_M323,    bfd_mach_avr5},

   {"at90usb1286",AVR_ISA_M128,    bfd_mach_avr5},

diff -urN binutils-2.18/gas/doc/c-avr.texi ../binutils-2.18/gas/doc/c-avr.texi

--- binutils-2.18/gas/doc/c-avr.texi   2007-08-06 20:00:08.000000000 +0000

+++ binutils-2.18/gas/doc/c-avr.texi   2008-07-04 18:44:34.000000000 +0000

@@ -44,8 +44,8 @@

 attiny45, attiny85).

 

 Instruction set avr3 is for the classic AVR core with up to 128K program

-memory space (MCU types: atmega103, atmega603, at43usb320, at43usb355,

-at76c711).

+memory space (MCU types: atmega103, at43usb320, at43usb355, at76c711,

+at90usb82, at90usb162).

 

 Instruction set avr4 is for the enhanced AVR core with up to 8K program

 memory space (MCU types: atmega48, atmega8, atmega83, atmega85, atmega88,

@@ -58,7 +58,7 @@

 atmega329p, atmega3250, atmega3250p, atmega3290, atmega3290p, atmega406, 

 atmega64, atmega640, atmega644, atmega644p, atmega128, atmega1280, 

 atmega1281, atmega645, atmega649, atmega6450, atmega6490, atmega16hva, 

-at90can32, at90can64, at90can128, at90usb82, at90usb162, at90usb646, 

+at90can32, at90can64, at90can128, at90pwm216, at90pwm316, at90usb646,

 at90usb647, at90usb1286, at90usb1287, at94k).

 

 Instruction set avr6 is for the enhanced AVR core with 256K program

diff -urN binutils-2.18/include/opcode/avr.h ../binutils-2.18/include/opcode/avr.h

--- binutils-2.18/include/opcode/avr.h   2006-04-07 15:18:08.000000000 +0000

+++ binutils-2.18/include/opcode/avr.h   2008-07-04 18:46:51.000000000 +0000

@@ -40,6 +40,8 @@

                        AVR_ISA_LPMX | AVR_ISA_SPM)

 #define AVR_ISA_M603  (AVR_ISA_2xxx | AVR_ISA_MEGA)

 #define AVR_ISA_M103  (AVR_ISA_M603 | AVR_ISA_ELPM)

+#define AVR_ISA_USB162 (AVR_ISA_M603 | AVR_ISA_MOVW | \

+                       AVR_ISA_LPMX | AVR_ISA_SPM)

 #define AVR_ISA_M161  (AVR_ISA_M603 | AVR_ISA_MUL | AVR_ISA_MOVW | \

                        AVR_ISA_LPMX | AVR_ISA_SPM)

 #define AVR_ISA_94K   (AVR_ISA_M603 | AVR_ISA_MUL | AVR_ISA_MOVW | AVR_ISA_LPMX)

```

Ja w katalogu ze źródłami wklepałem coś takiego patch -p1 < ../binutils.patch co dało wynik:

```
mirek@jebediah ~/build/binutils-2.18 $ patch -p1 < ../binutils.patch

patching file gas/config/tc-avr.c

patching file gas/doc/c-avr.texi

patching file include/opcode/avr.h

mirek@jebediah ~/build/binutils-2.18 $
```

Później:

./configure --target=avr --prefix=$HOME/cross-avr

make

make install

Prefix ustaw jaki chcesz  :Smile: 

2) GCC: ftp://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2

Najgorsza rzecz do budowy  :Smile: 

Na tym etapie jeśli masz jakieś flagi CFLAGS typu -march itp. to je wyłącz bo się nie zbuduje,

z innymi daje rade, ale też bez przesady..

No to po ściągnięciu: tar -jxvf gcc-4.3.1.tar.bz2

To jest ważne, bez tego poprostu się wysypie..

Musisz stworzyć oddzielny katalog w którym będziesz kompilować gcc np:

mkdir gcc-build

i dajesz: cd gcc-build

Następnie:

```
../gcc-4.3.1/configure --target=avr --enable-languages=c --enable-shared --disable-libssp --disable-werror --prefix=$HOME/cross-avr

make

make install
```

Nie dam sobie ręki uciąć że zadziała, w moim przypadku przeszło  :Smile: 

Jeśli się uda to otwórz z katalogu domowego plik .bash_profile i dopisz coś takiego:

```
export PATH="$PATH:$HOME/cross-avr/bin"
```

i zaloguj się ponownie na swoim koncie.

Od teraz bedziesz miał polecenie avr-gcc.

3. avrlibc http://download.savannah.gnu.org/releases/avr-libc/avr-libc-1.6.2.tar.bz2

Na samym końcu jak nie wyskoczy wcześniej jakiś error:

tar -jxvf avr-libc-1.6.2.tar.bz2

cd avr-libc-1.6.2

./configure --host=avr --prefix=$HOME/cross-avr

make

make install

Po zainstalowaniu avr-libc, teoretycznie będziesz miał w pełni sprawny kompilator C dla procesorów avr  :Smile: 

Do całości przyda się jeszcze jakiś debugger, np. gdb, który też trzeba zbudować z --target=avr

PS. Oczywiście nie odpowiadam za wynikłe szkody  :Smile: 

Pozdrawiam

----------

## szybi

No pięknie  :Very Happy:  Zadziałało  :Smile:  A już traciłem wiarę  :Smile:  Trochę ten patch nie zadziałał do końca - jakiś błąd przy modyfikacji ostatniego z plików. Ale generalnie sukces  :Smile: 

Bardzo dziękuję i pozdrawiam  :Smile: 

----------

## tallica

Ja używam z powodzeniem cross-avr/gcc-4.1.2 nie widzę potrzeby przechodzenia na nowszą wersję.

```
# crossdev --g 4.1.2 -v -t avr
```

----------

