udon's blog

思いついたことを、思いついた時に。忘れないように。

コマンドラインArduino環境の構築

つかれたー

ことの始まり

使いにくい。あの中途半端なIDE

http://www.arduino.cc/en/Main/software

で、イロイロぼやいていたわけです。

どうせ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ライフ!な、はず!!!

*1:Arduino IDEも同じような動きみたいです

*2:inoと同じ階層で sudo easy_install inoとか。sudo python setup.py install --force とか

*3:git amっつうのもあるらしいけど