1.はじめに
CentOS5.11/32bit で バイナリ配布版のArduino IDE 1.6.7 を実行してコンパイル作業をすると以下のエラーが出てコンパイルできません。
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を再コンパイルすれば良いように見えますが、
上記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に展開.
から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用のライブラリのコンパイル
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のコンパイル
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のコンパイル
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で動作するようになりました。