昨日は、FreeBSDのyacxmドライバをamd64環境で動作させるためのハック(?)をしてました。とはいえ、portsはあるところからソースファイルをもってくるので、portsとsrcの両方をハックする感じです。
portsはまだ自作したことなかったので、少しずつわかってきました。とはいえ、いじるところはソースのダウンロード先くらいなものでよさそうです。
問題のソースのハックですが、なかなかビルドが通らない。warningも出てるし。とりあえず以下が問題でした。
●warning:cast from pointer to integer of different size warning:cast to pointer from integer of different size
→これはキャストするときにサイズが違うというwarningです。tsleep()を呼び出すときに使用しているマクロDISCARD_QUALIFIERがあり、これのキャスト方法が変だとコンパイラをwarningを出したようです。 そのため、DISCARD_QUALIFIERを定義しているcxm.hを修正。
前) #define DISCARD_QUALIFIER(x) (void *)(unsigned int)(x) 後) #define DISCARD_QUALIFIER(x) (void *)(unsigned long)(x)
●error:array type has incomplete element type
→これはi386版でも出るやつです。cxm.hで、配列を定義していますが、ソース側にだけあればよいので、この行は削除(またはコメント)します。
warning:passing argument 5 of 'bus_setup_intr' from incompatible pointer type error:too few arguments to function 'bus_setup_intr'
→これもi386版でも出るやつです。FreeBSD 7.0からbus_setup_intr()のプロトタイプが変わっているので、第4引数filterにNULLを設定し、元からあった第4引数以降は1つずつ後ろへずらします。
●error:SSE register return with SSE disabled
→未解決・・・。 SSEがオフだと抜かしやがります。少し調べてみると、FreeBSD 7.1 Releaseの/usr/bin/gccはバージョンが4.2.1なんですがこれにSSE関連のバグがある模様・・・。コンパイラも新しいバージョンのものに変えるも、今度は別のエラーが出てビルドが通らない・・・。残念。
結局、最後のSSEエラーのせいでまだビルドが通っていません。コンパイラのバージョンの模様なので、stableにあげると通るのか?今のところもう少し調べてみますが、早くAMD64環境でサーバを動かしたいものです。