コマンドラインArduino環境の構築
つかれたー
ことの始まり
使いにくい。あの中途半端なIDE
http://www.arduino.cc/en/Main/software
で、イロイロぼやいていたわけです。
IDEのコードをチラ見すると叩いてるコマンドをログに出しそうなオプションがある模様。これであの中途半端なツールから脱却できるかもしれん #arduino
どうせavrなコンパイラ叩いたりとかだけだろうし、IDEにverboseなログ出すなりでコマンド解析して、ちょっとしたスクリプトでも書けばイケるだろうとか考えてたわけですわ。
でもそんな言ってると、コマンドラインツールがあると教えてもらえました!
https://github.com/amperka/ino
ino init
でプロジェクト作って、
ino build
でビルドできて、
ino upload
で書き込みできるわけです。 コレは便利!!!!
なぞのエラー
で、調子に乗ってちょろっとソースを変えたりしてみました。
main.ino
#include <SD.h> #include "foo.h" File root; void setup() { } void loop() { foo(root); }
foo.h
#ifndef FOO_H_INCLUDED #define FOO_H_INCLUDED #include <SD.h> void foo( File root ); #endif
foo.ino
#include <SD.h> void printDirectory(File dir ) { // もろもろコード // ... return; }
これでビルドするとエラーになると。。。 なんか、Fileの定義が無い とか言われるわけです。 Fileの定義はSD.hにちゃんとあるんですがね・・・・
で、ちょっと見てみると.inoを.cppに一旦変換してからコンパイルしてるみたいだったので見てみました。*1
./build/uno/src/foo.cpp
#include <Arduino.h> void printDirectory(File dir ); #line 1 "src/foo.ino" #include <SD.h> void printDirectory(File dir ) { // もろもろコード
・・・・ヘッダのインクルードより前にプロタイプ書き込まれてる!?
そらいかんわな・・・
ふぁいっ!
ていうか、何か環境悪い?とか、インクルードの書き方間違えてる?!とかイロイロ見てみたけどダメ。。。 ino本体はgithubに公開されているもののpython製のためかなりしんどい。 コレ?とか思うのに手を入れたりしてみたけど、そもそもeasy_installしたモジュールをローカルファイルで更新する方法すら知らない状態。。。。 *2
で、いろいろ探してると、実は既知のバグだった 事が判明。
https://github.com/amperka/ino/issues/35
ぐぬぬ・・・。一瞬ino使うの諦めかけた・・・。
けどよく考えれば、forkするなりしてパッチ当てればよくね?とね。
ざ・ぱっち
issueに書いてくれてるパッチはgitのdiffだったりして当て方わからん・・・。*3
ので、手元で修正して当てた。
--- ino/commands/preproc.py
+++ ino/commands/preproc.py
@@ -35,6 +35,7 @@ class Preprocess(Command):
sketch = open(args.sketch, 'rt').read()
+ out.write('\n'.join(self.includes(sketch)))
header = 'Arduino.h' if self.e.arduino_lib_version.major else 'WProgram.h'
out.write('#include <%s>\n' % header)
out.write('\n'.join(self.prototypes(sketch)))
@@ -47,6 +48,11 @@ class Preprocess(Command):
matches = regex.findall(src)
return [m + ';' for m in matches]
+ def includes(self, src):
+ regex = re.compile("\\s*#.*")
+ matches = regex.findall(src)
+ return [m.strip() for m in matches]
+
def collapse_braces(self, src):
"""
Remove the contents of all top-level curly brace pairs {}.
ようやく
・・・で、いろいろ遠回りしたけどようやく環境が整いましたわ。 なんかこんなんばっかで気力使ってるくね?
ちなみに今回直したinoはforkしたレポジトリに上げましたとさ。
https://github.com/datsuns/ino
コレでようやく快適Arduinoライフ!な、はず!!!