Problem:

Gentoo's crossdev is not able to compile a toolchain with one command in one process. Since I am using Ardunio for embedded prototyping I really needed to fix this!

If you don't have crossdev installed just execute:

emerge crossdev

Here you find more information about crossdev

crossdev is modifying /etc/portage/package.use while compile time... :/ Before stage2 it adds the obsolete USE="nocxx" flag to cross-avr/gcc. If you have USE="cxx" flag set in /etc/make.conf or when USE="cxx" is not set in make.conf it will fail to build; I think it is a default value. So you need to add USE="-cxx" in /etc/make.conf at the beginning of the process. When crossdev reaches stage2 it removes USE="nocxx" in /etc/portage/package.use and expects USE="cxx" and not USE="-cxx" in /etc/make.conf. If the compile error rises up, simply change USE="-cxx" to USE="cxx" in /etc/make.conf. Then execute the crossdev command again. Since everything before gcc stage2 is compiled already, crossdev is not doing it again and continues at gcc stage2 with the USE flag changes set.

Solution:

  • /etc/make.conf: USE="-cxx"
  • crossdev -t avr
  • Compile error at stage2
  • Change USE="-cxx" to USE="cxx" in /etc/make.conf
  • crossdev -t avr
  • Installation complete! :)
  • ln -s /usr/i686-pc-linux-gnu/avr/lib/ldscripts /usr/avr/lib/ldscripts
  • This is filed in Gentoo bug #147155.
  • For each AVR MCU you are using you need to do this:
  • ln -s /usr/avr/lib/avr5/crtm168.o /usr/avr/lib/crtm168.o
  • The Arduino IDE gives an error if the library for the used MCU is not found! Simply create the symlink for it and everything works... :/
  • All done!

After all this pain in the last two days I have decided to build my own AVR toolchain in the future. I will never again go through this evil process of installing all this with packages provided by a Linux distribution regardless of Gentoo...

More about:

For Arduino users this solution does not fix the following problem:

https://wiki.archlinux.org/index.php/Arduino#delay.28.29_function_doesn.27t_work

It seems Gentoo is using a broken version of the avr-gcc toolchain. I have tried installing older versions of gcc, binutils and libc for AVR but with no luck. It took hours trying this out... :/

All the time I am getting problems related to the error described in the link from Archlinux above or much more complex problems I don't wanna talk about. I am using the workaround described above for now but I think there must be a solution for these problems in the future.

I think this does not only happen for Arduino users because the compiled file implies the broken data and when writing it to an AVR using avrdude your program is broken regardless of Arduino. This is a problem for all people trying to use Gentoo for AVR development. After talking to some people on the Arduino develper list it seems not only Gentoo is broken at this place. Many distributions are shipping the latest avr-gcc version, utterly unaware how broken the most recent versions usually are.

I hope this information is helpful to someone and I wish good luck... ;)

BTW: I am using the wonderful GNOME based Arduino IDE called Gnoduino which I found by researching my problems today... ;) Give it a try! I love it because it natively runs on my Desktop, not GNOME but Xfce, without the use of JAVA.

Just ask me if you have questions!

Comments