2004/01/13  Finally Moved to MacOS X Release 10.3

本業が忙しくて、ずいぶん長い間、更新できずにいた。このページ、日記のつもりが、ほとんど年記である(何度この台詞を使ったことか)。忙しくて仕事に使える環境を壊す危険を冒すわけにいかず、年末まで 10.2 を使っていてた。すっかり時代に取り残された感があったが、 新しい PowerBook G4 の購入を契機に(10.3 preinstalled なので)ようやくMacOS X 10.3 に移行した。 10.2.X のバイナリーは基本的にそのまま使えるようであるが、 デフォールトのコンパイラーが gcc-3.3 ベースになってしまったので、 全てのパッケージを更新あるいは再コンパイルした。 また、移行の際に気付いたこととしては、

  1. ユーザーの標準シェルが が /bin/bash になった(すばらしい)。
  2. libdl.dylib が標準サポートになった(すばらしい)。ただし、10.2 の時と仕様が変わって、dlsym で関数ポインターを取得する際にシンボル名の始めのアンダースコアーが不要になった。これで paw の comis が動かずしばらくはまった。まぁ、これが標準的な動きだから今までが変だったとも言うが。
  3. cups も gimp-print も標準サポート(すばらしい)。
  4. Canna のコンパイルで、wchar_t が再定義できずにまともに動かないバイナリーができてしまう。これは __WCHAR_TYPE__ がどこかで定義されていて、stddef.h の中で再定義の部分がスキップされてしまうため。この問題を回避するため widedef.h の中で #undef __WCHAR_TYPE__ とする私家版パッチをあてた。
  5. ImageMagick は、以下のようなエラーを吐いて死ぬので、configure の中で poll のテストが失敗するように私家版パッチをあて、システムの poll を使わないようにした。どうも、MacOSX の poll はできそこないのようだ。
  6. また、TeX 関連では dvidfmx で dvi から pdf を生成しようとしても、eps の絵をうまく取り込んでくれない。これは ghostscript の gdevpdfw.c のバグだと判明。pdf_finalize_font_descriptor は pdf->base_font=0 とするが、notify handler (pdf_font_notify_proc) は pdf ポインターがゼロでない限り pdf->base_font に参照可能なアドレスが入っていることを仮定しているため、font を解放しにいくと必ず bus error がおこる。これを回避する私家版パッチをあてた。

また、g77 は、gcc を 10.3 で使われているバージョン(gcc-3.3 20030304: gcc-1495)の ソースを使って作りなおした。ところが、これが結構くせ者で、

$ cat test.F
          stop
           end
$ g77 test.F
/var/tmp//ccr9QDpP.s:23:section difference relocatable subtraction expression, "LC0" minus "L00000000001$pb" using a symbol at the end of section will not produce an assembly time constant
/var/tmp//ccr9QDpP.s:23:use a symbol with a constant value created with an assignment instead of the expression, L_const_sym = LC0 - L00000000001$pb
/var/tmp//ccr9QDpP.s:22:section difference relocatable subtraction expression, "LC0" minus "L00000000001$pb" using a symbol at the end of section will not produce an assembly time constant
/var/tmp//ccr9QDpP.s:22:use a symbol with a constant value created with an assignment instead of the expression, L_const_sym = LC0 - L00000000001$pb

てな具合で、こんな簡単なプログラムがコンパイルできない。ところが

$ vi test.F
          stop 0
           end
$ g77 test.F

のように stop に戻り値を入れるとコンパイルできる。ネットを探しまわった結果、Geoffrey Keating 氏が 2003/07/26 づけで gcc 本家の CVS にパッチ (varasm.c) をあげていることが分かったので、これをバックポートした。これは、Apple のアセンブラの仕様が変わってしまって、今まで許されていたコードが許されなくなってしまったことによるらしい。パッチは新しいアセンブラが気に入るように、出力アセンブラコードに対して STOP に戻り値を与えたときと同じ効果を与えるようにするものである。また、open 文で direct access file 開く際のデフォールトが FORMATTED になってしまって使いにくくて仕方がないので、これも gcc 本家からこれを UNFORMATTED にするパッチ (open.c) をバックポートしてあてた。また、gcc-3.1(10.2)の時代の g77 にくらべて最適化で壊れたコードを吐く確率が上がったような気がする。より賢くなろうとしてなりきれないで失敗するぐらいなら何もしない(たぶんこれが gcc-3.1 でうまくいっていた理由)方がましとも言う。安全のため今までにもまして最適化レベルを変えて結果をテストすることが必要。

HEP on X ページ(英語)もこれに合わせて更新、移動した。 新しいページは http://www-jlc.kek.jp/~fujiik/macosx/10.3.X/ である。 詳細はそちらを参照のこと。

今までにコンパイルしたMacOS X Release 10.3.X 用の rpm については、 spec ファイル、パッチ、ソース RPM、バイナリー RPM それぞれについて SPECSSOURCESSRPMSRPMS に対応するものが置いてある。RPMS 以下の ppc はマシン依存な RPM 、noarch はマシン非依存な RPM の置き場所である。バイナリーのみの RPM および Tar Ball のみのパッケージの場合には、ソースおよびパッチは src に、また、Tar Ball は tgz にそれぞれ置いてある。新しいものは ~fujiik/macosx/10.3.X/ 以下にある点に注意(~fujiik/macosx 直下のものは Public Beta 用、~fujiik/macosx/10.0.X/、~fujiik/macosx/10.1.X/、~fujiik/macosx/10.2.X/ 以下は 10.0.X、10.1.X、10.2.X 用の古いもの、今後更新の予定なし)。  

いつものように使う場合は自己責任で。
Back to Keisuke Fujii's MkLinux/LinuxPPC Life