CYGWINからWINDOWSのコマンドを動かすとき

主にEmacs lispからWINDOWSコマンドを呼ぶ際に、引数としてファイルパスを与える際に問題となっていた。Emacs Lisp側にパッチを入れていたりしたが、こんなのやってられないと思い考えた。

CYGWINからWINDOWSのコマンドを動かすとき、WINDOWS形式のパスとUNIX形式のパスで問題になるなら、ラッパーを挟んでしまえば良いという身も蓋もない結論に達した。

JAVA

WINDOWSネイティブで動作するため、JAVAに渡すパスはWINDOWS形式でないと動いてくれない。で、色々とやった結果、最後はjava_wrapperJAVAコマンドをラップする事になった。インストール手順はスクリプトに書かれているが、JAVAのパスにスペースが含まれていると余計なシンボリックリンクを1つ作る。自分の場合はProgram Files以下にJAVAをインストールしているので、Program -> java_wrapperのシンボリックリンクが出来ていた。

Graphviz

CYGWINにもGraphvizパッケージがあるが、plantumlから呼び出すこともあるのでWINDOWS版を使う。よって、dotコマンドもラッパーを作った。dot.exeへのパスは環境変数を使ったほうが良いのだけど取り敢えずこれで動く。

#!/bin/bash
## http://takuya-1st.hatenablog.jp/entry/20110811/1313045543 を参考とした
# java_wrapperと同じくコマンドのシンボリックリンクを作る
# ln -s /usr/local/bin/dot_wrapper /usr/local/bin/dot

function cygpath_to_winpath(){
  args=()
  for i in $@ ; do
      case $i in
      -*)
      args=(${args[@]} $i)
      ;;
      *)
      args=(${args[@]} `cygpath -w $i`)
      ;;
      esac
  done
  echo ${args[@]}
  return 0
}
/cygdrive/c/Program\ Files\ \(x86\)/Graphviz2.38/bin/dot.exe `cygpath_to_winpath $@`

これで、CYGWINのorg-modeで

#+BEGIN_SRC dot :file dot_example0.png
digraph {
  A->B;
}
#+END_SRC

とdotコマンドを動かして図が書けるようになった。

CYGWINを使うことのバットノウハウ

CYGWINを使うために余計なことが色々と必要になる。大半は先人の知恵で解決済みなのだけど、たまに自分で調べることになる。無駄な作業なので、たまにイラッとくるのだけど、よかった探し*1をしておくと、「どのように動いているか知ることが出来てよかった」。

*1:知らない人のほうが多いのだろな