pygrib が Microsoft Visual Studio でビルド出来るようになる話

GPVで沸点予報(誰得?)」で誤魔化した pygrib の MSVS 対応の話。

気象屋さん以外でこれを必要とする人は稀だろうなぁ、とは思うけれど。まぁだからこそこの情報を供給する人も少ないだろうからな。

今週対応するってさ。

なお、Microsoft Visual C++ Compiler for Python 2.7では、この対応でもちょいとツラいとこは残るよ:

  1. Microsoft Visual C++ Compiler for Python 2.7 だけではソリューションファイル・プロジェクトファイルを扱えないので、ECMWF GRIB-API Microsoft Windows (experimental)のほうのビルドが手間。
  2. Microsoft Visual C++ Compiler for Python 2.7、というか VC9 には inttypes.h がないので、pygrib ではエラーになる(はず)。Jeff Whitaker の作業次第、かな。

それと実行環境もひと手間必要。Unix 系だと GRIB-API の「make install」(だっけ?)で definitions が適切な場所に置かれるけど、ECMWF GRIB-API Microsoft Windows (experimental)はなんにもしてくんないので、自分で「置いて」、自分で「環境変数設定」しないといけない。

まぁこんな状態なんで、「出来る人だけやれば?」てのは「GPVで沸点予報(誰得?)」での状態とあんまし変わんない。単に「ずっと楽になる」だけ。












なんというかさ、こういうのをね、例えば業務で必要とするとするじゃない? でターゲットが Unix 系なら、「Unixでだけ動けばいいじゃん」はもちろん正論だし、ワタシも別に大抵はそれでいいと思うんだけれども、たださ、「Windows でも動かせる」と、やっぱりとっても便利なんだよねぇ。

なんでかってぇと、だいたいの企業ってこうだからなのよ:

  • 日常作業に与えられる PC は全て Windows
  • 「開発機」として数少ないサーバ機が、「検証フェーズ」時に導入される(なかなか不自由な、リモートログイン)
  • 「開発フェーズ」直前に、「Unix がインストールされた開発機が開発者に貸与される」、もしくは、「Windows だが VirtualBox などの仮想化で Unix が使える開発機が別途貸与される」、あるいは「VirtualBox などの仮想化で Unix 仮想マシンが配られる」

デスクトップ機として Unix を使うような企業って、今や相当限られてるんじゃないかね。とにかくなかなか Unix を自由に使える状態にならんのよ。こんな状態のときって、「Windows でも検証出来る」って、とってもありがたいことなのね。

まぁ cygwin が許されるようなとこならこれまでも Windows で使えたんだけれどさ…。












2015-10-24 追記
see bump version number, add Changelog entry for pull request #18.

inttypes.h の問題はそのままにしたみたい。ので、MSVC9 の場合(つまり CPython2.7 の場合)は、g2clib.pyx を一箇所変更必要。この部分:

122 cdef extern from "stdlib.h":
123     void free(void *ptr)
124 
125 # get 32 bit integer type
126 cdef extern from "inttypes.h":
127     ctypedef long int32_t

これを例えばこう:

122 cdef extern from "stdlib.h":
123     void free(void *ptr)
124 
125 # get 32 bit integer type
126 #cdef extern from "inttypes.h":
127 ctypedef long int32_t

ChangeLog とコミットログからわかる通り 2.0.1 としてリリースするつもりみたい。だいたいのプロジェクトでは「Bump version number」はリリースを決断してるときなんで、数日中に 2.0.1 入手可能かもしれないね。

2015-10-26 追記
inttypes.h については、MSVC9以前の inttypes.h, stdint.h 問題参照。pyx に手を入れるよりは、ちゃんとした inttypes.h 持ってた方がいいでせう。

それより PR #11 での改造みるまで気付かなかったんだけど、int32_t の typedef、間違ってるのよね。正しくは

122 cdef extern from "stdlib.h":
123     void free(void *ptr)
124 
125 # get 32 bit integer type
126 cdef extern from "inttypes.h":
127     ctypedef int int32_t