Galileo?
IntelのGalileoのArduinoIDE付属のクロスコンパイラを抜き出して使う - Galileo †
概要 †
Intelが公式に用意しているArduinoIDEから,Galileo向けのクロスコンパイラを抜き出して,自分の書いたソースコードをコンパイルしてしまおう.
Arduino環境からクロスコンパイラを抜き出す †
IntelのGalileoのSDカード用Linuxイメージを作る - Galileoに示す方法でLinuxイメージをビルドすると,一緒にクロス環境の開発ツールもビルドされるのだが,時間がかかって仕方ないので,Arduino環境からクロスコンパイラを抜き出して使ってみることにする.
Linuxの場合,ArduinoIDEのアーカイブを展開すると,次のようなディレクトリ構造になっているだろう.
ツール群は,hardware/tools/sysrootsの中にある.
$ ls hardware/tools/sysroots
i586-poky-linux-uclibc i586-pokysdk-linux
このディレクトリの中にあるファイルをごっそり別の場所にコピーする.
少々荒っぽいが,この2つのディレクトリの中身をいっしょくたにしてしまおう(そうするとおさまりがよかった).
$ cd harware/tools/sysroots
$ sudo mkdir -p /opt/cross/i586-poky-linux-uclibc-x-tools
$ sudo cp -R i586-poky-linux-uclibc/* /opt/cross/i586-poky-linux-uclibc-x-tools/
$ sudo cp -R i586-pokysdk-linux/* /opt/cross/i586-poky-linux-uclibc-x-tools/
Makefile †
Makefileは準備したので,これを使用すると良い.
SHELL = /bin/sh
TARGET_BIN = helloworld
TARGET_ARCH = -m32 -march=i586 --sysroot=/opt/cross/i586-poky-linux-uclibc-x-tools
INCLUDE_DIRS = -I $(TOOLDIR)../include \
-I $(TOOLDIR)../include/c++ \
-I $(TOOLDIR)../lib/i586-poky-linux-uclibc/gcc/i586-poky-linux-uclibc/4.7.2/include
LIBRARY_DIRS = -L $(TOOLDIR)../../lib \
-L $(TOOLDIR)../lib \
-L $(TOOLDIR)../lib/i586-poky-linux-uclibc/4.7.2 \
-L $(TOOLDIR)../lib/i586-poky-linux-uclibc/4.7.2
COMPILE_OPTS = -O2 -pipe -g -feliminate-unused-debug-types -fpermissive -Wall $(INCLUDE_DIRS) $(BOARD_OPTS) $(FIRMWARE_OPTS)
TOOLDIR = /opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/
CC = $(TOOLDIR)i586-poky-linux-uclibc-g++
CXX = $(CC)
AS = $(CC)
LD = $(CC)
AR = $(TOOLDIR)i586-poky-linux-uclibc-ar
CFLAGS = $(COMPILE_OPTS)
CXXFLAGS= $(COMPILE_OPTS)
LDFLAGS = -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed $(LIBRARY_DIRS) --sysroot=/opt/cross/i586-poky-linux-uclibc-x-tools -lstdc++
all: target
target: $(patsubst %.c,%.o,$(wildcard *.c)) $(patsubst %.cpp,%.o,$(wildcard *.cpp))
$(LD) $(LDFLAGS) $(TARGET_ARCH) $^ -o $(TARGET_BIN)
clean:
rm -f $(TARGET_BIN) *.o
Hello World †
せっかくだからHello, Worldでもやってみよう.
helloworld.c
#include <stdio.h>
int main(int argc, char const* argv[])
{
printf("Hello, World!\n");
return 0;
}
PCでmakeする.
$ make
/opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/i586-poky-linux-uclibc-g++ -O2 -pipe -g -feliminate-unused-debug-types
-fpermissive -Wall -I /opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/../include
-I /opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/../include/c++
-I /opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/../lib/i586-poky-linux-uclibc/gcc/i586-poky-linux-uclibc/4.7.2/include
-m32 -march=i586 --sysroot=/opt/cross/i586-poky-linux-uclibc-x-tools -c -o helloworld.o helloworld.c
/opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/i586-poky-linux-uclibc-g++ -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed
-L /opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/../../lib
-L /opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/../lib
-L /opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/../lib/i586-poky-linux-uclibc/4.7.2
-L /opt/cross/i586-poky-linux-uclibc-x-tools/usr/bin/i586-poky-linux-uclibc/../lib/i586-poky-linux-uclibc/4.7.2
-lstdc++ -m32 -march=i586 --sysroot=/opt/cross/i586-poky-linux-uclibc-x-tools helloworld.o -o helloworld
$ file helloworld
helloworld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs),
BuildID[sha1]=0x78594d3015aacfc8322039aa54927e3e6d9b4561, not stripped
これをsshか何かでGalileoに転送して実行すると,
root@clanton:~# chmod +x helloworld
root@clanton:~# ./helloworld
Hello, World!
root@clanton:~#
抜き出したコンパイラでもっと遊ぶ †
基本的にはGalileoで動くバイナリを吐くコンパイラとして使えるので,ある程度のものならそのままビルドしてしまえる.
例えば,拙作のマイクロマウスの迷路シミュレータ(旧バージョン)tokoro10g / mousesimなんかは,標準入出力と計算しかしていないのでテストとしては適している気がする.
ということでやってみた.やはり先ほどのMakefileを使ってビルド.(TARGET_BIN=adachitest)とした.
これも同様に転送して実行すると,
root@clanton:~# chmod +x adachitest
root@clanton:~# ./adachitest < mazedat/maze.dat
何の問題もなく動いた.
コメントはこちら †