在FreeBSD上装linux skype 4

折腾了一个晚上好歹是搞出来了……
起因是把linux_base更新到了linux_base-c6,也就是CentOS 6。这是个相当新的版本,各种rpm找起来也比较容易。
但是问题是,ports里其他linux包基本都是老的,要么是fc4的,要么是f10的…… 反正用不了。于是统统删掉。但是这样linux程序基本就跑不了,缺很多包……
于是就自己搞rpm来装。但是rpm这回又不好使,试了ports里rpm3/4/5貌似都不行。
怀疑是因为rpm调了cpio,而FreeBSD 8-STABLE里的cpio貌似还不支持xz? 因为CentOS那些新包是xz压缩的,于是就解不了。
后来干脆不管rpm了,搞个脚本:

if [ ! -f $1 ]; then
        wget http://mirror.yandex.ru/centos/6.2/os/i386/Packages/$1
fi
rpm2cpio $1 | unxz > ~/tmp
cd /compat/linux
sudo cpio -idv < ~/tmp

加上包文件名,就能自动下载安装…… 坏处是没有rpm帮着记录包信息了…… 以后删起来会很麻烦…… 再说吧……

首先搞下来skype 4.0.0.7的动态链接版本,解压后尝试运行,一堆链接失败…… 拿ldd看一眼,然后逐个去rpmfind找包名,用那个脚本装…… 装了几十个包,好歹差不多可以跑了。主要是一堆libX*,qt,dbus,… 但是没声,也不能输入中文。

首先是声的问题,选项里声音设备连OSS都没。额外装了alsa-plugins-oss,还是没有OSS设备。尝试装alsa-plugins-pulseaudio,pulse设备倒是出来了,但是启用就出问题…… 研究了下,貌似alsa要配置,改了asound.conf,引入oss配置文件,再进去,好歹声音正常了。

然后是中文。本来xim配fcitx应该就可以,但是不知道为啥不行,切不出来。
于是我想看看有啥问题,尝试写了个LD_PRELOAD用的hook XOpenIM的库。native的BSD程序测试没啥问题,找个Linux机子编译,那儿测了也没问题,但是弄回来,就没有反应…… 为了确认,我又hook了XOpenDisplay,结果这次更奇怪,貌似会陷入无限递归一类的情况,反正LD_PRELOAD不成,xim也没法调。

那就转而用fcitx的qt im module。csslayer说fcitx的im module是用dbus通信的。试了一下linux的dbus-monitor和qdbus,貌似都连不上。根据ktrace,貌似是linux程序在bsd下连unix socket会有问题?…… 于是转而研究能不能用tcp socket。改了dbus配置,让它也监听tcp端口。然后dbus-launch出来个shell,确认环境变量之后,linux的qdbus还是不行…… 这回貌似是dbus那边的问题?反正看来dbus服务器自己只能用unix socket才能好好工作?…… 最后参考dbus源代码,改了之前写的一个tcp转发程序,搞了个dbus专用tcp socket转发unix socket的程序。dbus的第一个包带有认证信息,是用sendmsg发的,还要特殊处理…… 这个日后再说吧,反正搞出这个程序之后,篡改DBUS的环境变量,把环境变量DBUS_SESSION_BUS_ADDRESS里的unix:path=/var/tmp/dbus-zGrz0qEmd9改成tcp:host=localhost,port=xxxx,再启动linux的qdbus…… 好歹是连上了。

搞定dbus之后,尝试搞输入法模块本身。貌似centos上根本没有fcitx的包,于是搞了fc15/17的,反正应该关系很近嘛…… 结果就是不出来,右键菜单里没有fcitx这个。后来问csslayer,他说可能是qt版本问题,说插件编译环境qt版本要比当前qt低才行。centos的qt是4.6.2,然后抓了几个fc15/16/17的fcitx-qt4下来,发现都依赖4.7或者4.8+(用strings看,能看见version=4.8.0之类……)。先尝试篡改一把,用二进制编辑器改成4.6.2,倒是能载入,但是会有找不到的qt的符号…… 换个办法,去找centos更新的qt4,倒是找到了,在http://pkgs.org/centos-6-rhel-6/russian-fedora-free-updates-i386/有qt4 4.8.0。搞上这个qt4,再找个依赖qt4 4.8.0的fcitx-qt4…… 还是有问题,不过这次是linux的fcitx-utils版本太老…… 更新之后,又说我本机fcitx太老…… 更新本机fcitx之后…… 终于可以输入中文了!……
之后搞了个脚本自动篡改dbus地址,启动转发……

#!/bin/sh
 
export QT_IM_MODULE=fcitx
/home/henryhu/src/tcp2unix &
 
DBUS_ORIG=$DBUS_SESSION_BUS_ADDRESS
DBUS_NEW=`echo -n $DBUS_ORIG | sed -e 's/unix:path.*,/tcp:host=localhost,port=8888,/'`
export DBUS_SESSION_BUS_ADDRESS=$DBUS_NEW
 
/home/henryhu/soft/skype-4.0.0.7/skype

于是终于可以好好用skype了……