ほとんど手を加えなくても Interix で使えるものをリストアップしてみました(まだ全然揃ってませんが)。
コンパイル済のバイナリパッケージは,interix.com に いくと 大量に置かれていたりしますが, 最新版にキープされているわけでもなさそうだし,コンパイル手順をまとめておくのは意義がありそうなので。
ソースのどういった箇所を修正する必要があるかは interix.com の各パッケージディレクトリにある README に 書かれているので,それを参考にすればいけそうです。
SFU3.5β/wget 1.9.1 で確認。
./configure --prefix=/usr --sysconfdir=/etc; make; make install するだけで正常動作。
i586-pc-interix3 として host が自動認識される。Windows xp + ipv6 install 環境でも IPv6 は on になっていない。
OpenSSL 存在下では(インストールの prefix にもよるが)自動的に認識される 。
SFU3.5β/m4 1.4 で確認。autoconf が要求する。
CFLAGS=-D_ALL_SOURCE で ./configure --prefix=/usr; make; make install で完了。正常動作かは不明。
SFU 3.5β/make 3.80 で確認。
CFLAGS=-D_ALL_SOURCE で ./configure --prefix=/usr; make でコンパイル通過。
make check も通過するが,通過後に uptime を起動しようとして失敗する。
make install すると,実行中の make が text file busy といって失敗するので手動でコピーする。
SFU 3.5β/autoconf 2.57 で確認。
CFLAGS=-D_ALL_SOURCE で ./configure --prefix=/usr; make でコンパイル通過。
make check も(ほぼ)通過 。make install も通過。
autoconf 2.58 では configure が動作しない(bash を入れると動くのだろうか?)。
> sh configure configure[3039]: no closing back quote
autoconf 2.59 では configure は通過するが,make に失敗する。
automake 1.7.9 は autoconf 2.57 存在下において,CFLAGS=-D_ALL_SOURCE で ./configure --prefix=/usr; make; make install でインストールまで通過。
automake 1.8 は autoconf 2.58 or better を要求するので configure を通過しない。
SFU3.5β/pkg-config 0.15.0 で確認。
autoconf 2.57 存在下で CFLAGS=-D_ALL_SOURCE ./configure --prefix=/usr --host=i586-pc-interix3 すると configure 通過 。
interopsystems.com によると
a change in the sub-packaged glib 1.X.Y in gmain.c to use.
だそうで,実際,手元の環境でも sub-packaged な glib 1.2.8 でコンパイルエラーが出た(gmain.c だけではなかった)。
glib-1.2.8/gerror.c:select まわりでエラーが出るので,スタックトレースの出力機能を殺す。
195: #ifndef NATIVE_WIN32
195: #if 0
glib-1.2.8/gmain.c:poll を使うように修正する。
47: #ifdef GLIB_HAVE_SYS_POLL_H 48: # include <sys/poll.h>
47: #define GLIB_HAVE_SYS_POLL_H 48: #ifdef GLIB_HAVE_SYS_POLL_H 49: # include <poll.h>
warning がたくさん出るが,make check は通過するようだ 。
make install も無事に成功。
デフォルトの Interix にも iconv は入っているのだが ―――
> /bin/iconv -l ASCII EUC-JP eucJP SJIS windows-932 Unicode
なので,iso-8859-* や C が使えない。
iconv がデフォルトで存在するので libiconv を別途入れるのはリスクがありそうだが(libiconv は日本語に関しては だめだめのはずなので),仕方なくインストール。
SFU3.5β/libiconv 1.9.1 で確認。
既存の /usr/include/iconv.h は /usr/include/iconv.h.org にでも rename しておく。/bin/iconv も /bin/iconv.org などにしておく。
CFLAGS=-D_ALL_SOURCE で ./configure --prefix=/usr 通過 。make 通過。make check 通過 。make install 通過。
--prefix=/usr でデフォルト iconv の代わりにシステムデフォルトとしてインストールしてしまう。
SFU3.5β/sed 4.0.8 で確認。
./configure --prefix=/usr 通過。make 通過。
make check も通過したと主張している のだが,core dumped が1つあるのは合っているのだろうか……。
make install 通過。
SFU3.5β/gawk 3.1.3 で確認。
./configure --prefix=/usr --bindir=/bin 通過 。make 通過。make check 通過 。make install 通過。
ここでは --bindir=/bin を指定して /bin/awk(gawk でない)を置換をしているが,/usr/contrib/bin/gawk に gawk 2.15 がデフォルトで入っている。
SFU 3.5β/readline 4.3(+ readline-4.3-patches)で確認。
./configure --prefix=/usr --libdir=/lib 通過。make 通過。make install 通過。
SFU 3.5β/bash 2.05b で確認。readline 4.3 を使用。
CFLAGS='-D_ALL_SOURCE -DUSE_POSIX_GLOB_LIBRARY' で,./configure --prefix=/usr --bindir=/bin 通過 。-DUSE_POSIX_GLOB_LIBRARY がないと,ワイルドカード展開が不可能になる。
make 通過。make test の結果 。
make install 通過。これで /bin/bash をインストール完了。/bin/sh はデフォルト(ksh)のまま。
interopsystems.com によると他にも修正すべき箇所があると記述されているので,interopsystems の修正版ソースを使った方が安全確実かもしれない。
SFU 3.5β/tar 1.13 で確認。
interopsystems.com にあるように,config.guess を新しいもので上書き(インストール済 automake 1.7 の config.guess を使用した)したのち,./configure --prefix=/usr --bindir=/bin 通過。
interopsystems.com にも書いてあるが,makedev でエラーが発生するので,mkdev にするマクロを入れてエラーを回避する。
src/list.c:
(line 32付近に追加)
#ifdef __INTERIX #define makedev(x, y) mkdev((x), (y)) #endif
これで make 通過。make check 通過 。make install 通過。
SFU 3.5β/gettext 0.13.1 で確認。iconv 1.9.1 を使用。
gettext がインストール済の場合は古いヘッダファイル・ライブラリファイルを削除した上で,CFLAGS='-D_ALL_SOURCE' CXXFLAGS='-D_ALL_SOURCE' にして,./configure --prefix=usr --with-iconv=/usr --without-libintl 通過 。
make 通過。
make check は一部通過しない 。msgconv については問題がある気がする。sh が ksh なのと Python がインストールされていないのが原因ぽいので,その他は無視して構わないように見える(sed が GNU sed でないと FAIL はさらに増える)。
SFU3.5β/glib 2.2.3 で確認。pkg-config 0.15.0 を使用。
CFLAGS='-D_ALL_SOURCE -I/usr/local/include -liconv' CXXFLAGS='-D_ALL_SOURCE -I/usr/local/include -liconv' LDFLAGS='-liconv' で ./configure --prefix=/usr 通過 。
glib/gmain.c:pkg-config 時と同様の修正を行う。
45: #ifdef GLIB_HAVE_SYS_POLL_H 46: # include <sys/poll.h>
45: #define GLIB_HAVE_SYS_POLL_H 46: #ifdef GLIB_HAVE_SYS_POLL_H 47: # include <poll.h>
GNU libiconv を使わせるために config.h を修正。
348: /* Using GNU libiconv */ 349: /* #undef USE_LIBICONV_GNU */
348: /* Using GNU libiconv */ 349: /* #undef USE_LIBICONV_GNU */ 350: #define USE_LIBICONV_GNU
make 通過。
make check は通過しない。make install は完了する。
SFU3.5β/bzip2 1.0.2 で確認。
make; make install するだけで正常動作。
SFU3.5β/zlib 1.2.1 で確認。
./configure --prefix=/usr --shared でコンパイル・インストール通過。
SFU3.5β/ 2.04 で確認。
Makefile を一部書き換えて make するだけ。
CC = cc CFLAGS = -O
CC = gcc CFLAGS = -O3 -fomit-frame-pointer -mcpu=pentium4
make test 通過 。make install はないので手動で /usr/bin に cp する。
SFU3.5β/ruby 1.8.1 で確認。
./configure --prefix=/usr --with-static-linked-ext 通過 。
make 通過 。make test 通過 。make install 通過。
--enable-pthread や --enable-shared をつけるとコンパイルに失敗するようなので,色気を出さずにこのへんで抑えておくのが良いかと。--with-static-linked-ext をつけないと,部分的に dynamic link library を作成するため Interix3 の制約にひっかかり(?),正常にコンパイルできない。
$ ruby --version ruby 1.8.1 (2003-12-25) [i586-interix3]
interopsystems.com より,Configure スクリプトの変更部分を調べてみると,config と Configure に Interix 用の記述が追加されていた。Configure のほうを使えば良いので,config を更新する必要はない。
Configure:
513: # UWIN
514: "UWIN", "cc:-DTERMIOS -DL_ENDIAN -O -Wall:::UWIN::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::win32",
515:
516: # Cygwin
513: # UWIN
514: "UWIN", "cc:-DTERMIOS -DL_ENDIAN -O -Wall:::UWIN::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::win32",
515:
516: #Interix
517: "Interix-gcc", "gcc:-D_ALL_SOURCE -DL_ENDIAN -DTERMIOS -g -Wall::(unknown)::::::::::::dlfcn:interix_gcc_shared:::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
518:
519: # Cygwin
最適化オプションが(おそらく gcc3 のバグ対策で)外されているので,なんとなく許せない場合は復活させておく。
#Interix "Interix-gcc", "gcc:-D_ALL_SOURCE -DL_ENDIAN -DTERMIOS -O3 -march=pentium4 -fomit-frame-pointer -g -Wall::(unknown)::::::::::::dlfcn:interix_gcc_shared:::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
perl Configure --prefix=/usr threads Interix-gcc で Makefile が作成されるので make するだけ。
手元の gcc3.3 では make test を通過した ので,たぶんだいたい大丈夫なのだろう(make test が遅いのは裏でエンコードしているからというのもあるが,そもそもあまり速くない)。 アセンブリルーチンの使用も OFF になっているが,面倒くさそうなので放置する。
問題なのは,Interix3 の仕様で shared library を正常に作成できないことだろうか(作成できるが,リンクしたプログラムでシンボル解決に失敗する)。ライブラリが要求するデフォルトライブラリを解決できないとかなんとかいう噂。
現状では static link であきらめる。
これはかなり修正を加えなければコンパイル動作しない模様。
interopsystems.com に感謝して 変更済ソースをいただいてくる のが賢明だと思われる。ftp に置かれている README.interix に書かれているように,展開後 configure せずに make する。
修正箇所は root が uid=0 とは限らないことによるものをはじめ,ユーザ管理まわりがほとんどの模様。同様の理由で UsePrivilegeSeparation も no に設定しておく必要があるようだ。README.interix から引用:
Now edit the '/usr/local/etc/sshd-config' file and set the configuration from: #UsePrivilegeSeparation yes to the setting: UsePrivilegeSeparation no
とはいっても,PrivilegeSeparaion を no にしないとエラーが出るので嫌でも気づく:
$ /usr/local/sbin/sshd Privilege separation user sshd does not exist
インストールは --prefix=/usr/local 状態で行われるようなので,必要に応じて Makefile の書き換えをしたほうがいいかもしれない。
SFU3.5β/rxvt 2.7.10 で確認。
CFLAGS=-D_ALL_SOURCE で,./configure --prefix=/usr/X11R6 --enable-languages --enable-xpm-background --enable-transparency --enable-menubar --enable-graphics --enable-rxvt-scroll --enable-next-scroll --enable-xterm-scroll --enable-xim --enable-frills --enable-linespace --enable-24bit --enable-keepscrolling --enable-mousewheel --enable-slipwheeling --enable-old-selection 通過。でも pixmap サポートはライブラリがないので off のまま。
make 通過。make install 通過。
LANG=ja_JP.sjis rxvt すると:
SFU3.5β/xlockmore 5.01.2 で確認。GTK+ 非存在下。
CFLAGS=-D_ALL_SOURCE CXXFLAGS=-D_ALL_SOURCE し,config.guess をインストール済の automake 1.7 のものと差し替えてから ./configure --prefix=/usr/X11R6 する 。make 通過。make install 通過。
ASTEC-X では遠隔マシンのデスクトップに見えてしまうので怒られる。-remote で回避。
$ xlock xlock: can not lock 127.0.0.1's display
手元の環境ではパスワードまわりで怒られた(ぉ
$ xlock -remote xlock: could not get encrypted root password.
単に xlock を見たいだけだったので -nolock して実行してみた。文字化け Matrix は残念きわまりない 。
パスワードを読むために,普通は xlock の permission を 4111 にしておくようだ(?)
SFU3.5β/apr 0.9.4 にて。Apache 2.0.48 に同梱されている apr でも同様。
CFLAGS=-D_ALL_SOURCE にて,./configure --prefix=/usr --enable-static --disable-shared 通過 。
file_io/unix/filestat.c:utime.h の include を追加。
59: #include "apr_errno.h" 60: 61: static apr_filetype_e filetype_from_mode(mode_t mode)
59: #include "apr_errno.h" 60: 61: #include <utime.h> 62: 63: static apr_filetype_e filetype_from_mode(mode_t mode)
make 通過。make check 通過 。make install 通過。
SFU3.5β/apr-utils 0.9.4 にて。apr-0.9.4 も同じ親ディレクトリの下で make 完了状態で展開しておく。
CFLAGS=-D_ALL_SOURCE CXXFLAGS=-D_ALL_SOURCE で,./configure --prefix=/usr --with-apr=/usr 通過 。
make 通過。make check 通過 (日付が出たあとに止まるので Enter を入力すると続行される)。
make install 通過。
SFU 3.5β/apache httpd 2.0.48 にて。apr,apr-utils インストール済。
server/mpm_common.c:initgroups を殺す。
362: #ifndef HAVE_INITGROUPS
363: int initgroups(const char *name, gid_t basegid)
364: {
365: #if defined(QNX) || defined(MPE) || defined(BEOS) || defined(_OSD_POSIX) || defined(TPF) || defined(__TANDEM) || defined(OS2) || defined(WIN32) || defined(NETWARE)
366: /* QNX, MPE and BeOS do not appear to support supplementary groups. */
367: return 0;
368: #else /* ndef QNX */
362: #ifndef HAVE_INITGROUPS
363: int initgroups(const char *name, gid_t basegid)
364: {
365: #if 1
366: /* QNX, MPE and BeOS do not appear to support supplementary groups. */
367: return 0;
368: #else /* ndef QNX */
support/suexec.c:ダミーの initgroups を on にする。
106: #if defined(NEED_INITGROUPS)
107: int initgroups(const char *name, gid_t basegid)
108: {
109: /* QNX and MPE do not appear to support supplementary groups. */
110: return 0;
111: }
112: #endif
106: #if 1
107: int initgroups(const char *name, gid_t basegid)
108: {
109: /* QNX and MPE do not appear to support supplementary groups. */
110: return 0;
111: }
112: #endif
make 通過。make install 通過。
適宜 httpd.conf を修正して apachectl start すると単純な機能については動いているようだが,詳細は未調査。
Web ブラウザで見ると見えるのに telnet でつなぐと切られるなど,若干挙動不審(interopsystems 版 2.0.44 でも同様)。
SFU3.5β/darts 0.2:
./configure --prefix=/usr 通過。make 通過。make check 通過 。make install 通過。
SFU3.5β/ChaSen 2.3.3:
config.guess を automake 1.7 のものと交換して ./configure; make 通過。make check 通過。
$ ls /bin/
[ csh ipcrm pax stty
addr csplit ipcs pdomain su
alias ctags ispell pg sum
ar cut jobs ping syslogd
at date join pkg tail
atq dc kill pkg_add talk
atrm dd ksh pkg_create tar
awk df last pkg_delete tcsh
banner diff less pkg_info tee
basename diff3 lessecho pkg_sign telnet
batch dig lesskey posixpath2nt test
bc dircmp lex pr tftp
bg dirname line printf tic
bp dnsquery ln ps time
du locale pstat tip
echo localedef psxoffset tkpkg
ed logger pwd toe
egrep login ranlib touch
env loginenv rcp tput
ex logname rdist tr
expand lp rdistd true
expr ls read truss
false m4 regpwd tset
fc mail renice tsort
fg mailx reset tty
c89 fgrep make rlogin tzselect
cal file man rm umask
calendar fileinfo mkdir rmdir unalias
captoinfo fileinfo.exe mkfifo rpcgen uname
cat find more rpcinfo unexpand
cat32 finger mpack rsh unifdef
cat32.exe flip mt rstartd uniq
cc fmt munpack runwin32 unixpath2win
cd fold mv script unvis
chgpath ftp mvwtmpx sdiff uudecode
chgrp gencat newgrp sed uuencode
chmod getconf nice service vi
chown getopt nl sh view
chsh getopts nm showmount vis
cksum grep nohup size wait
clear head nslookup sleep wc
cmp hexdump nsupdate sort who
col host ntpath2posix spell whoami
column hostname nvi split winpath2unix
comm iconv od ssimda wvisible
command id passwd strerror xargs
cp infocmp paste strings yacc
cpio infotocap patch strip yearistype
crontab install pathchk strsignal
$ ls /usr/local/bin/ a2p h2xs perldoc pod2text s2p c2ph perl pl2pm pod2usage splain dprofpp perl5.6.1 pod2html podchecker find2perl perlbug pod2latex podselect h2ph perlcc pod2man pstruct
$ ls /usr/sbin/ chroot in.rexecd mail.local nfsmount popper cron in.rlogind mailq nfsshare purgestat hoststat in.rshd makedev nfsstat sendmail igetty in.telnetd mapadmin nfsumount syslogd in.fingerd in.tftpd mknod nis2ad zdump in.ftpd inetd newaliases nisadmin zic in.ntalkd init nfsadmin nismap zzInterix
$ ls /usr/X11R6/bin/ Xmark makeg xclipboard xkbcomp xrdb appres mergelib xclock xkbevd xrefresh atobm mkdirhier xcmsdb xkbprint xset bdftopcf mkfontdir xconsole xkbvleds xsetroot bitmap oclock xcutsel xkbwatch xsm bmtoa proxymngr xdm xkill xstdcmap editres resize xdpyinfo xlogo xterm fsinfo rstart xfd xlsatoms xuctblgen fslsfonts sessreg xfindproxy xlsclients xwd fstobdf smproxy xfs xlsfonts xwininfo iceauth startx xfwp xmag xwud imake twm xhost xmkmf lbxproxy x11perf xieperf xmodmap lndir x11perfcomp xinit xon makedepend xauth xkbbell xprop
$ ls /usr/contrib/bin/ ci gawk pack rlog zip co gunzip pcat uncompress compress gzip rcs unpack elvis ident rcsdiff unzip elvrec merge rcsmerge zcat
$ ls /usr/contrib/win32/bin/ append drwatson mspaint recover wfind arp drwtsn32 musrmgr regedt32 wfinger assoc edit nbtstat ren wftp attrib edlin net rename whostname backup erase netstat replace winchat cacls eventvwr nlsfunc restore windisk calc exe2bin notepad route winfile cdplayer fastopen ntbackup savedump winhlp32 charmap findstr packager setver winmsd chcp fontview path sndrec32 winspool chkdsk forcedos pause sndvol32 winver chkntfs format pbrush start wmkdir clipbrd ftype pentnt subst wmore clock graftabl perfmon sysedit wnslookup cmd grpconv portuas syskey wping comp help posix taskman wprint compact inetins progman taskmgr wrcp control internat prompt tracert wrmdir convert ipconfig psxrun tree wrsh copy keyb qbasic unlodctr wset dcomcnfg label rasadmin ver wsort ddeshare loadfix rasautou verify wtelnet del lodctr rasdial vol wtftp dir md rasman wat wtime diskcomp mem rasmon wdate wtype diskcopy mode rasphone wecho wwrite diskperf move rassprxy wexit xcopy doskey mplay32 rd wexpand dosx mscdexnt rdisk wfc