Rindrics Mumbles

processing-mode を使って Emacs から Processing のコンパイルを通す条件

Processing も Emacs で書きたい!ということで久しぶりに processing-mode を触ってみたら、環境設定で何箇所かハマったのでメモしておく。

概要

processing-mode の設定:

(leaf processing-mode
  :ensure t
  :require t
  :setq
  `((processing-location . "/usr/local/bin/processing-java")
    (processing-application-dir . "/Applications/Processing.app")
    (processing-sketchbook-dir . "/Users/rindrics/dev/processing")))

実行した Processing コード:

ellipse(25, 25, 50, 50);

観測した要件:

  • .pdeprocessing-sketchbook-dir に同名のディレクトリを作って配置すること
  • v4.0 beta 8 ではなく v3.5.4v2.2.1 は未確認)の Processing を使うこと
  • ファイル名の先頭に数字を使わない

.pdeprocessing-sketchbook-dir に同名のディレクトリを作って配置すること

これを守らないとコンパイルできない。 この要件の破り方には少なくとも 2 パターンあるので、それぞれについてまとめておく。

同名ディレクトリを作らない場合

例えば processing-sketchbook-diryour-dir/processing である場合、 hoge.pdeyour-dir/processing/hoge/hoge.pde に置く必要がある。

これを your-dir/processing/hoge.pde に置いてしまうと Not a valid sketch folder. your-dir/hoge/hoge.pde does not exist. エラーが出る。

processing-sketchbook-dir に置かない場合

.pde を同名のディレクトリに置いていたとしても、それを processing-sketchbook-dir に配置しないと下記のエラーが出る:

/usr/local/bin/processing-java --force --sketch=/your-dir/processing/hoge/ --run --output=/your-dir/processing/hoge/output
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
      at processing.app.Sketch.getCode(Sketch.java:1686)
      at processing.app.Sketch.getMainProgram(Sketch.java:1711)
      at processing.mode.java.JavaBuild.preprocess(JavaBuild.java:216)
      at processing.mode.java.JavaBuild.preprocess(JavaBuild.java:155)
      at processing.mode.java.JavaBuild.build(JavaBuild.java:122)
      at processing.mode.java.Commander.<init>(Commander.java:274)
      at processing.mode.java.Commander.main(Commander.java:86)

Processing Compilation exited abnormally with code 1 at Thu Jun  9 06:03:45

余談ではあるが、 .pde を Mac OSX におけるデフォルトのスケッチブック用ディレクトリ ~/Doccuments/Processing に置いた場合にもコンパイルが通った。 私の環境では、このディレクトリは Processing App 側の環境設定における “Sketchbook location” と同じ値だったのが気になった。 そこで、”Sketchbook location” を ~/fuga に変更した上で ~/fuga/hoge/hoge.pde をコンパイルしてみたが、エラーとなってしまった。 これ以上の調査はしていないが、 ~/Documents/Processing におけるコンパイル成功は例外的な挙動な気がしている。

v4.0 beta 8 ではなく v3.5.4v2.2.1 は未確認)の Processing を使うこと

上で述べたディレクトリに関する条件を満たしていても、執筆時点で最新であった v4.0 beta 8 の Processing を使うと、下のエラーが出た:

/usr/local/bin/processing-java --force --sketch=/your-dir/processing/hoge/ --run --output=/your-dir/processing/hoge/output
Exception in thread "main" java.lang.NoClassDefFoundError: org/antlr/v4/runtime/CharStream
      at processing.mode.java.JavaBuild.preprocess(JavaBuild.java:144)
      at processing.mode.java.JavaBuild.build(JavaBuild.java:110)
      at processing.mode.java.Commander.<init>(Commander.java:233)
      at processing.mode.java.Commander.main(Commander.java:417)
Caused by: java.lang.ClassNotFoundException: org.antlr.v4.runtime.CharStream
      at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
      at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
      at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
      ... 4 more

Processing Compilation exited abnormally with code 1 at Thu Jun  9 05:57:24

そこで、本家から v3.5.4 をインストールし直すことにした。

Processing のバージョンを変更するときの注意

Processing のバージョンを変える時には、ひとつ注意点がある。 /usr/local/bin/processing-java というファイルが jdk のバージョン依存のパスを参照しているため、Processing のバージョンを変えてそのままコンパイルすると No such file or directory が出てしまう。 なので、ターミナルなどを使って jdk 周りの状況を調べ、現状に合うように /usr/local/bin/processing-java を編集する必要がある。 Mac OS 12.3.1 の環境では、当該 jdk のパスは次の通りだった: /Applications/Processing.app/Contents/PlugIns/jdk1.8.0_202.jdk/Contents/Home/jre/bin/java

ファイル名の先頭に数字を使わない

haru さんがまとめてくださっているのでリンクで済ませる: https://harujisaku.fc2.net/blog-entry-148.html

まとめ

私の環境では、上で述べた 3 つの要件を満たすことで、無事コンパイルが通った。

Hello, ellipse!

Hello, ellipse!