CentOS5.11/32bit で Arduino IDE 1.6.7を動作させる。

1.はじめに
CentOS5.11/32bit で バイナリ配布版のArduino IDE 1.6.7 を実行してコンパイル作業をすると以下のエラーが出てコンパイルできません。

https://www.arduino.cc/en/Main/Software
> Linux 32bit

```
/var/tmp/arduino-1.6.7/hardware/tools/avr/bin/avr-g++: /lib/libc.so.6: version `GLIBC_2.11' not found (required by /var/tmp/arduino-1.6.7/hardware/tools/avr/bin/avr-g++)
exit status 1
コンパイル時にエラーが発生しました．
```

Arduino IDEに内蔵されている Arduino用のg++コンパイラが要求しているGLIBCをCentOS5が持ってないんですね。

CentOS5はまだセキュリティサポートなどがされているOSですが少々古いLinuxなので新しいライブラリが入っていません。今回都合でOSの更新が出来ないため、CentOS5用で実行できるよう思考錯誤しまして成功しました。

作業の流れですが、 Arduino用のクロスコンパイルのgccを構築、関連ツールを構築、関連ライブラリを構築します。

その後、バイナリ配布のArduino IDEの環境変数を書き換えて、新たに構築した上記ライブラリを使うように設定する。

という流れになります。

補足: 本作業ですが、一見、こちらの方法でIDEを再コンパイルすれば良いように見えますが、

https://code.google.com/archive/p/arduino/wikis/BuildingArduino.wiki

上記URLの手順でGitでソースコードをダウンロードしたところ、ソースコードの中にバイナリのArduino用のgcc/g++がそのまま入っていました。そのバイナリ版のgcc/g++が使われるArduino IDEが再構築されただけでした。つまりバイナリ配布版のArduino IDEをダウンロードするのとほとんど変わりません。


2.準備

CentOS5の環境
gcc/g++とか開発環境入れてください。実際に必要なライブラリなどは細かく確認していません。

```
$ uname -a
Linux example.jp 2.6.18-408.el5PAE #1 SMP Tue Jan 19 09:54:24 EST 2016 i686 i686 i386 GNU/Linux
```

Oracleが配布している最新版のJDKを導入して下さい。
https://java.com/ja/download/help/linux_install.xml

update-alternativesを使って標準のJavaを置き換えています。

```
$ which java
/usr/bin/java

$ java -version
java version "1.8.0_72"
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) Server VM (build 25.72-b15, mixed mode)
```

インストール先を決めて下さい。今回は標準のPATHではなく独自の場所(/usr/local/avr)に入れています。

```
$ sudo mkdir /usr/local/avr
$ sudo chown あなたのログインID /usr/local/avr
```

Arduino IDEを /usr/local/avr/arduino-ideに展開.

https://www.arduino.cc/en/Main/Software

からdownloadして ~/SRC に置いてください。

独自の場所に展開。

```
cd /usr/local/avr
tar xvf ~/SRC/arduino-1.6.7-linux32.tar
mv arduino-1.6.7 arduino-ide
```

独自の場所にPATHを通すため、~/.bash_profileに以下を追加

```
PATH=$PATH:/usr/local/avr/bin:/usr/local/avr/arduino-ide
```

CentOS5からログアウトしてログインするとPATHが有効になります。

3.gccのコンパイル

参考: http://flakrat.blogspot.jp/2013/06/building-gcc-481-on-centos-59.html
> Building GCC 4.8.1 on CentOS 5.9 

https://ftp.gnu.org/gnu/
から以下のファイルをdownload
 binutils-2.26.tar.gz
 gcc-4.8.5.tar.gz

http://gcc.gnu.org/install/prerequisites.html
を参考にして以下のファイルをdownload
 gmp-5.1.3.tar.bz2
 mpfr-3.1.3.tar.gz
 mpc-1.0.3.tar.gz
 isl-0.14.tar.bz2  (補足: 0.15はgcc-4.8.5で不可)

上記のファイルを ~/SRC に保存して下さい。

続いてコンパイル＆インストール。

```
cd /var/tmp
bzip2 -dc ~/SRC/gmp-5.1.3.tar.bz2 | tar xvf -
cd gmp-5.1.3/
./configure --prefix=/usr/local/avr
make
make check
make install
```

```
cd /var/tmp
gtar xvfz ~/SRC/mpfr-3.1.3.tar.gz
cd mpfr-3.1.3
./configure --prefix=/usr/local/avr --with-gmp=/usr/local/avr
make
make check
make install
```

```
cd /var/tmp
gtar xvfz ~/SRC/mpc-1.0.3.tar.gz
cd mpc-1.0.3/
./configure --prefix=/usr/local/avr --with-gmp=/usr/local/avr --with-mpfr=/usr/local/avr
make
make check
make install
```

```
cd /var/tmp
tar xvfj ~/SRC/isl-0.14.tar.bz2
cd isl-0.14
./configure --prefix=/usr/local/avr --with-gmp-prefix=/usr/local/avr
make
make check
make install
```

```
cd /var/tmp
tar xvfz ~/SRC/gcc-4.8.5.tar.gz
cd gcc-4.8.5/
mkdir AVR
cd AVR
export LD_RUN_PATH=/usr/local/avr/lib
../configure --prefix=/usr/local/avr --target=avr \
 --enable-languages="c,c++" --with-gmp=/usr/local/avr \
 --with-mpfr=/usr/local/avr --with-isl=/usr/local/avr \
  --enable-multilib --disable-nls

make
make install
unset LD_RUN_PATH
```

上記でArduino用のgccのコンパイルは完了です。

4.Arduino用のライブラリのコンパイル

http://www.nongnu.org/avr-libc/
> AVR Libc Home Page

上記より
avr-libc-1.8.1.tar.bz2
をダウンロードしてコンパイル＆インストール。

```
cd /var/tmp
tar xvfj ~/SRC/avr-libc-1.8.1.tar.bz2
cd avr-libc-1.8.1/
./configure --prefix=/usr/local/avr --host=avr --target=avr
make
make install
```

5.ctagのコンパイル

https://github.com/arduino/ctags/releases
> 5.8-arduino6: c++: Properly parse C++11 override and final members

上記から「Source code (tar.gz)」 をクリックして、ctag-5.8-arduini6.tar.gzという名前で保存して下さい。そしてコンパイル＆インストール。

```
cd /var/tmp
tar xvfz ~/SRC/ctag-5.8-arduini6.tar.gz
cd  ctags-5.8-arduino6/
 ./configure --prefix=/usr/local/avr
make
make install
```

6.avrdudeのコンパイル

http://www.nongnu.org/avrdude/
> AVRDUDE - AVR Downloader/UploaDEr

最新は6.2ですが、動きませんでした。6.1を採用しました。ファイルavrdude-6.1.tar.gzをダウンロードして下さい。

ちなみに6.2だと以下のようにArduinoに書き込み時にエラーになりました。

```
-Arduino UNOに書き込んだ時のエラー
avrdude: Cannot get serial port settings. ioctl returned -1
avrdude: ser_open(): can't set attributes for device "/dev/ttyACM0": Invalid argument

-Arduino Duemilanoveに書き込んだ時のエラー
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
```

そのため6.1を採用しましたが、6.1もそのままではコンパイルできません。

```
cd /var/tmp
tar xvfz ~/SRC/avrdude-6.1.tar.gz
cd avrdude-6.1/
./configure --prefix=/usr/local/avr

(configure途中こんな感じのエラーが多数)
configure: WARNING: pthread.h: accepted by the compiler, rejected by the preprocessor!
configure: WARNING: pthread.h: proceeding with the compiler's result

(configureの最終結果)

DON'T HAVE libelf
DO HAVE    libusb
DON'T HAVE libusb_1_0
DON'T HAVE libftdi1
DON'T HAVE libftdi
DON'T HAVE libhid
DO HAVE    pthread
DISABLED   doc
ENABLED    parport
DISABLED   linuxgpio
```

おそらくconfigureのライブラリ検出に問題があると思います。あと、最終結果の部分が異なる場合は私の環境とインストールされているライブラリなどに差異があると思いますので以降の作業でうまくいかない場合はライブラリなど追加して下さい。（詳細は調べてません。）

続いてコンパイルすると

```
make
(省略)
gcc -DHAVE_CONFIG_H -I.  -DCONFIG_DIR=\"/usr/local/avr/etc\"  -Wall -Wno-pointer-sign -g -O2 -MT libavrdude_a-flip1.o -MD -MP -MF .deps/libavrdude_a-flip1.Tpo -c -o libavrd\
ude_a-flip1.o `test -f 'flip1.c' || echo './'`flip1.c
flip1.c:171: error: expected declaration specifiers or ‘...’ before ‘uint32_t’
flip1.c:173: error: expected declaration specifiers or ‘...’ before ‘uint32_t’
(省略)
```

上記エラーが出てとまります。これはuint32_tが定義されてないからです。下記の修正を行ってください。

```
cp ac_cfg.h ac_cfg.h.ORG
vi ac_cfg.h
diff	-u	ac_cfg.h.ORG	ac_cfg.h
---	ac_cfg.h.ORG	2016-02-03	13:27:18.000000000	+0900
+++	ac_cfg.h	2016-02-03	13:27:35.000000000	+0900
@@	-12,6	+12,7	@@

/*	Define	to	1	if	you	have	the	<inttypes.h>	header	file.	*/
/*	#undef	HAVE_INTTYPES_H	*/
+#define	HAVE_INTTYPES_H	1

/*	Define	if	ELF	support	is	enabled	via	libelf	*/
/*	#undef	HAVE_LIBELF	*/
```

そして再コンパイルとインストール。

```
make	clean
make
make install
```

以上で必要なライブラリおよびツールのコンパイルは完了です。

7.Arduino IDEの環境の書き換え。
Arudino IDEの環境設定ファイルを書き換えて、新たにコンパイルしたライブラリおよびツールにPATHを通して下さい。

```
cd /usr/local/avr/arduino-ide/
cp -p hardware/arduino/avr/platform.txt hardware/arduino/avr/platform.txt.ORG
vi hardware/arduino/avr/platform.txt
diff  hardware/arduino/avr/platform.txt.ORG hardware/arduino/avr/platform.txt
------------
21c21
< compiler.path={runtime.tools.avr-gcc.path}/bin/
---
> compiler.path=/usr/local/avr/bin/
94c94
< tools.avrdude.path={runtime.tools.avrdude.path}
---
> tools.avrdude.path=/usr/local/avr
------------

cp -p hardware/platform.txt  hardware/platform.txt.ORG
vi hardware/platform.txt

diff  hardware/platform.txt.ORG   hardware/platform.txt
3c3
< tools.ctags.path={runtime.tools.ctags.path}
---
> tools.ctags.path=/usr/local/avr/bin
```

8.おわりに
以上で設定は終わりです。

作業用に/var/tmpを使ってますので、展開したソースコードなどは消しておいてください。

軽く試した感じでは特に問題なくCentOS5/32itで動作するようになりました。