OS2/emx/ruby/porting/misc
テンポラリ感ただようメモ
"YOU HAVE BEEN WARNED!!" in python243_emx_readme
EMX 版 Python 2.4.3 の readme から "YOU HAVE BEEN WARNED!!" なセクションだけてきとーに訳してみる。
ちなみに何故 python のドキュメントが ruby/porting のとこにあるかというと、ここに書かれている OS/2 (EMX) 環境固有のことがいろいろ参考になっちゃったりしちゃったりなんかしたりするせいですチョンチョン
- OS/2 環境での fork() はあまり期待通りに動いてくれない(very inefficient)、と EMX 作者の Eberhard Mattes はドキュメントに書いている。 fork() は OMF でなく a.out でリンクした実行ファイルも要求する。 可能なところでは os.exec や os.swpan 系の関数を使おう。
- GNU readline がないとき、インタプリタの終了には Ctrl-Z の後で改行が必要。 Python 1.5.2 の port を行った Jeff Rush がドキュメントを書いている。 Readline があれば、通常の Unix 環境と同じく Ctrl-D が使える。
- EMX は fcntl を部分的にしか実装していない。 今回の port で fcntl モジュールがサポートしているのは EMX がサポートしているものだけである。 fcntl が重要なら EMX の C ライブラリリファレンスをきちんと確認してほしい。 別の副作用のため、テストスクリプト test_fcntl.py を修正して、未サポート機能の実行をしないようにした。
- PyBSDDB3 モジュールは Python の標準ライブラリにインポートされており、これは BSDDB 1.85 モジュール(bsddb)を置き換えることを意図している。 Sleepcat のもっと新しい DB ライブラリ(3.3.x/4.0.x/4.1.x)には満足できる port がまだないので、このモジュールのバイナリは入れていない。 完全を期すとなると PyBSDDB の Python 部分だけではすまなくなってしまう。
- PyBSDDB3 モジュールがインポートされることにより、それ以前の、EMX の DB v1.85 にリンクされている BSD DB (bsddb) モジュールがリネームされて bsddb185 になる。
bsddb185 モジュールは大部分のプラットフォームではデフォルトでビルドされないが、PyBSDDB3 モジュールがないため EMX 版ではこれを残している。
DB ライブラリバージョン 1.85 にはバグがあることが広く知られているが、パッチがいくつか出ている(内蔵の bsddb185 モジュールには組み込んである)。 ソフトウェアライセンス上の問題により GDBM(および GDBM ライブラリをリンクしている dbm モジュール)が使えないとかファイルフォーマットの互換性が必要とされてでもいない限り、もう削除してしまって GDBM に任せたほうがいいかもしれない。
v1.85 bsddb モジュールを使うコードは、
import bsddb
を
import bsddb185 as bsddb
と書き換えることで、リネームしたモジュールを使うように変更できる。
- readline モジュールは、EMX 提供の termcap ライブラリではなく、ncurse ライブラリをリンクしている。
- EMX の標準的なサポートにのっとり、今回の port はパスレパレータに "\" ('\\') ではなく "/" を使うように設定してある。 もちろんバックスラッシュもサポートされており、ソースが完全にノーマライズ化されていないため、いまだ予期せぬ場所で出てくる。
- DistUtil コンポーネントはもう使えるが、その他のパッケージング/バイナリハンドリングのツールと Demo や Tools ディレクトリに入っているようなユーティリティ(特に freeze)は動きそうにない。 もしいけるならどうやるか教えてください。
- 以前 port のどれか(Rush のかな?)にあった [BEGIN|END]LIBATH 機能のサポートは行っていない。もし動いたら教えてください。
- EMX ライブラリルーチンの制約により、標準拡張モジュール pwd は simple passwd データベースのみを合成できる。
grp モジュールはまったくサポートされない。
pwd と grp を Python だけで書き換えて、EMX がエミュレートする以上のものが要求されるアプリケーション(MailMan みたいな)で本物の passwd と group ファイルを処理できるようにしてみた。 PYTHONPATH 中で Lib/plat-os2emx は、ふつう Lib/lib-dynload(ここに pwd.pyd が入ってる)よりも前になっており、その中に pwd.py と grp.py を置く。 pwd.pyd がサポートするところのものを使いたい場合は PYTHONPATH にある Lib/lib-dynload を Lib/plat-os2emx より前に置くか、pwd.py と grp.py をリネーム/削除する。
pwd.py と grp.py がサポートするデータファイル関しては、以下の順序で環境変数を確認し、場所を決定する。
pwd.py:
$ETC_PASSWD (%ETC_PASSWD%)
$ETC/passwd (%ETC%/passwd)
$PYTHONHOME/Etc/passwd (%PYTHONHOME%/Etc/passwd)
grp.py:
$ETC_GROUP (%ETC_GROUP%)
$ETC/group (%ETC%/group)
$PYTHONHOME/Etc/group (%PYTHONHOME%/Etc/group)
環境変数 ETC_PASSWD と ETC_GROUP は複数の passwd/grp ファイルサポートを意図するものであり、他のアプリケーションによる多様な設定(ドライブの再マッピングやセパレータなど)に対応するものではない。
どちらのモジュールもフィールドセパレータとして ":"(Unix 標準)もしくは ";"(OS/2, DOS, Windows 標準)のいずれか一方をサポートしており、pwd.py はホームディレクトリとシェルフィールド用に以下のドライブ文字変換を実装している(":" セパレータの場合のみ)。
$x → x:
x; → x:
passwd と group ファイルのサンプルは Etc サブディレクトリにある。 有効なパスワードやグループファイルが存在しない場合は全体テスト(regression test)が失敗する(test_pwd と test_grp)が、そうなってなければ通るはず。
お気づきかと思うが、Python の pwd と grp モジュールはパスワードとグループ情報をただ読み込めるだけである。 - EMX の termio ルーチンは termios モジュールで公開されている機能のすべてをサポートしているわけではない。 EMX のドキュメントを参照して、何がサポートされているのか確認されたし。
- 大文字/小文字の区別は保持されても判別時には区別されないOS/ファイルシステム(Windows ほか)のために、大文字/小文字を区別するインポートセマンティクスが Python 2.1 で導入され、これはデフォルトで有効になっている。 環境変数 PYTHONCASEOK を設定する(値はなんでもいい)と以前のセマンティクス(大文字/小文字を区別しない)に戻せる。 ファイルやディレクトリ名の大文字/小文字を保持しないファイル管理ユーティリティで問題になる点である。
- ncurses をスタティックリンクしているため、_curses_panel モジュールは個別のライブラリデータ領域に起因する潜在的な問題ができてしまった。
これを回避するため、_curses_.pyd("_curses_panel" としてインポートされる)の設定を、必要とする ncurses のシンボルが _curses.dll からインポートされるようにした(_curses.dll は curses モジュールだが、拡張子が .pyd ではなく .dll なので、ダイナミックローダは DLL とみなして実際のインポートを行う)。
_curses_panel のインポート時に _curses.dll を探すため、site モジュール(Lib/site.py)には BEGINLIBPATH を変更するコードを追加している。 _curses_panel のサポートに何か問題があったらご連絡を。 そのときは別の方法を検討してみる。 - sys.platform は "os2" ではなく "os2emx" を返す。 os.name は以前と同じく "os2" を返す。 この変更は、ともかく DistUtil で VAC++ 版(以前 Michael Muller がメンテナンスしていた)と EMX 版(これ)を簡単に区別できるようにするためのもの。
- EMX の strftime ルーチン中 %W にはすくなくともひとつ以上のバグが判明している。 以前のリリースでは strftime は全体テストをパスしたが、これは全体テストに見落としがあったということである。 ちゃんと修正するにはポータブルな strftime ルーチンが必要になる。 FreeBSD のものを使うことを検討中だが、まだやっていない。
※以下作業中