私が Solaris 9 で行ったフリーソフトウェアのコンパイル手順を以下に示す。 私のインストールポリシーは以下の通りである。
あらかじめ環境変数 PATH だけは設定しておく。Solaris では、標準の make やアセンブラ、リンカは /usr/ccs/bin に入っているので、このディレクトリをパスに含めなければならない。
私の /.profile には以下のように書いてある (実際は1行)。
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/usr/sfw/bin: /usr/openwin/bin:/usr/dt/bin:/usr/ccs/bin:/usr/ucb; export PATH
gcc だけはあらかじめ SunSITE Japan からダウンロードしたパッケージでインストールしておく (gcc-3.4.2 のパッケージは、さらに libiconv を必要とする)。
この gcc のパッケージには不具合があり、そのまま実行すると以下のエラーが出る。
$ gcc -v ld.so.1: gcc: 重大なエラー: libgcc_s.so.1: open に失敗しました: ファイルもディレクトリもありません。 Killed
gcc に含まれる共有ライブラリ libgcc_s.so.1 が /usr/local/lib にインストールされており、Solaris 標準のライブラリ検索パスには /usr/local/lib が含まれていないため、このエラーが出る。
これを解決するには、/usr/local/lib をシステムのライブラリ検索パスに 含める:
crle -c /var/ld/ld.config -l /usr/lib:/usr/local/lib
もしくは、環境変数 LD_LIBRARY_PATH を
export LD_LIBRARY_PATH=/usr/local/lib
と設定して
/usr/local/lib を一時的にライブラリパスに含めることになるが、
これらの対処を恒久的に行うことは、私はオススメしない。
libc.so.? なんて名前のファイルを /usr/local/lib に置こうものなら 大変なことになってしまうし。 Solaris の場合はバイナリにライブラリパスを埋め込むことができるので、 その方法を利用するのが正しいと私は思う。
$ gcc -L/usr/local/lib -R/usr/local/lib -lhello hello.o -o hello もしくは $ LD_RUN_PATH=/usr/local/lib gcc -L/usr/local/lib -lhello hello.o -o hello
SunSITE のバイナリは、この gcc に限らず出来の悪いものが多いので、 できるだけ自分でコンパイルしてインストールしたい。 gcc が最初に無いと gcc そのものをコンパイルできないので、 仕方なく最初は SunSITE の gcc をインストールすることになる。
Solaris 7 以前では、パッケージファイルを伸張するための gzip コマンドが無いので SunSITE のパッケージ をインストールしておく。
ビルド環境に GNU autoconf (configure) を利用しているソースでは、
configure スクリプト実行時に環境変数 CFLAGS を与えることによって
コンパイラに対するオプションを指定することができる。以下の記述では、
特に問題がない限り CFLAGS=-O3 として、最適化を行っている。
さらに CPU タイプへの最適化を行いたい場合は、
-mcpu=pentiumpro (CPU が Pentium II/III/Celeron の場合)
などのオプションを加える。
Bourne shell 系での例: CFLAGS="-O3 -mcpu=ultrasparc" ./configure (CPU が UltraSPARC の場合)
C shell 系では環境変数をいきなり指定できないので、env コマンドを利用して
env CFLAGS="-O3 -mcpu=ultrasparc" ./configure
とする (以下の記述では Bourne shell 系の書式を採用している)。
ただし、私の経験上、 最適化を行っても得られる高速化のメリットはさほど無いように思う。 UltraSPARC に最適化してしまうと、生成されるバイナリは sun4m 以前のアーキテクチャで動作しなくなってしまうので、注意されたい。
# gzip -cd m4-1.4.2.tar.gz | tar xf - # cd m4-1.4.2 # CFLAGS=-O3 ./configure --prefix=/usr/local # make # make install
# gzip -cd libiconv-1.9.2.tar.gz | tar xf - # cd libiconv-1.9.2 # CFLAGS=-O3 ./configure --prefix=/usr/local --enable-static # make # LD_LIBRARY_PATH=/usr/local/lib make install
# gzip -cd gettext-0.14.1.tar.gz | tar xf - # cd gettext-0.14.1 # CFLAGS=-O3 ./configure --prefix=/usr/local # make # make install
# gzip -cd bison-1.875.tar.gz | tar xf - # cd bison-1.875 # CFLAGS=-O3 ./configure --prefix=/usr/local # make # make install
# gzip -cd flex-2.5.4a.tar.gz | tar xf - # cd flex-2.5.4 # CFLAGS=-O3 ./configure --prefix=/usr/local # make # make install
# gzip -cd make-3.80.tar.gz | tar xf - # cd make-3.80 # CFLAGS=-O3 ./configure --prefix=/usr/local # LANG=C make # make install
# gzip -cd bzip2-1.0.2.tar.gz | tar xf - # cd bzip2-1.0.2 # make # make install
# bzip2 -cd gcc-3.4.2.tar.bz2 | tar xf - # mkdir obj # cd obj # CFLAGS=-O3 CXXFLAGS=-O3 `pwd`/../gcc-3.4.2/configure --prefix=/usr/local --with-system-zlib # make bootstrap # make install
このあと、最初にインストールしたパッケージは消去しておく。
# pkgrm SMCgcc342
パッケージが /usr/local 以下にインストールしてあると、消去することで 自分のコンパイル・インストールした物も消えてしまうので、 もう一度 gcc のソースディレクトリで make install しておく。
# make install
Solaris 標準の /usr/bin/patch コマンドでは unified diff 形式のパッチが 扱えないため、Solaris 7 までは GNU patch をインストールしておく。
Solaris 8 以降では /usr/bin/gpatch が標準でインストールされているので必要ない。
# gzip -cd patch-2.5.4.tar.gz | tar xf - # cd patch-2.5.4 # CFLAGS=-O3 ./configure --prefix=/usr/local # make # make install-strip
Solaris 8 以前の /usr/bin/diff は、unified diff が生成できない。 Solaris 9 以降では /usr/bin/diff が GNU diffutils に置き換えられているが、 なぜか使えるオプションが少ないので、 ソースからコンパイル・インストールしておく。
# gzip -cd diffutils-2.8.1.tar.gz | tar xf - # cd diffutils-2.8.1 # CFLAGS=-O3 ./configure --prefix=/usr/local # make # make install
Solaris 8 以降では GNU tar が gtar の名前でインストールされているが、 bzip2 を扱うオプション (j) が無いので、最新版をインストールしておく。
# gzip -cd tar-1.14.tar.gz | tar xf - # cd tar-1.14 # CFLAGS=-O3 ./configure --prefix=/usr/local # make # make install
# gzip -cd tcsh-6.12.03.tar.gz | tar xf - # cd tcsh-6.12.03 # CFLAGS=-O3 ./configure --prefix=/usr/local # make # make install install.man
# gzip -cd less-358.tar.gz | tar xf - # cd less-358 # gzip -cd ../less-358-iso254.patch.gz | gpatch -p1 # gzip -cd ../regex_cs-lwp9k.shar.gz | sh # CFLAGS=-O3 ./configure --with-cs-regex # make # make install-strip
日本語化パッチは Jam's freeware page より入手。
# gzip -cd perl-5.8.5.tar.gz | tar xf - # cd perl-5.8.5 # ./Configure -de -Dcc=gcc -Doptimize=-O3 -Dldflags="-L/usr/local/lib -R/usr/local/lib" -Dusethreads # LD_RUN_PATH=/usr/local/lib make # LC_ALL=C make test # make install
# gzip -cd nkf204.tar.gz | tar xf - # cd nkf204 # gpatch -p1 < ../nkf204-sol.patch # make # mkdir -p /usr/local/bin # cp nkf /usr/local/bin
Solaris 8 以降ではシステム標準添付のため不要だが、 Solaris 8 の zlib は 1.1.3 なので、セキュリティパッチを適用しておくこと (Security Alert 参照)。
# gzip -cd zlib-1.2.1.tar.gz | tar xf - # cd zlib-1.2.1 # CFLAGS=-O3 ./configure --prefix=/usr/local # make # make install # CFLAGS="-O3 -fpic" ./configure --shared --prefix=/usr/local # make # make install
Solaris 7 までは OS が IPv6 に対応していないので、 tcp_wrappers_7.6.tar.gz を取得すること。
Solaris 9 では、SUNWcsl (Core Solaris) に tcp_wrappers が含まれているので そちらを使えばよい。tcpd は /usr/sfw/bin/tcpd、libwrap は /usr/sfw/lib にある。
# gzip -cd tcp_wrappers_7.6-ipv6.1.tar.gz | tar xf - # cd tcp_wrappers_7.6-ipv6.1 # gpatch -p1 < ../tcp_wrappers_7.6-ipv6.patch # make sunos5 # make install
Solaris 8 までは標準で /dev/random (疑似乱数生成デバイス) を持たないので、何らかの形で乱数生成ツールをインストールしないと ssh のセッション鍵生成などに時間がかかることになる。
Solaris 8 では Patch ID: 112438-03 (SPARC)、 Patch ID: 112439-02 (Intel) のパッチを適用することにより /dev/random がサポートされるので、 こちらを利用するのが良いだろう。
Solaris 7 以前では egd、 PRNGD、 ANDIrand のいずれかをインストールする。以下はegd をインストールした例である (Perl 必須)。
# gzip -cd egd-0.8.tar.gz | tar xf - # cd egd-0.8 # perl Makefile.PL # make # make install # cp egd.sh /etc/init.d/egd # cd .. # for i in 0 1 2 S; do ln init.d/egd rc$i.d/K04egd; done # ln init.d/egd rc3.d/S88egd
# gzip -cd openssl-0.9.7d.tar.gz | tar xf - # cd openssl-0.9.7d # gpatch -p1 < ../openssl-0.9.7d-sol.patch # ./Configure --prefix=/usr/local --openssldir=/usr/local/etc/ssl shared solaris-sparcv9-gcc (i386 の場合はターゲットを solaris-x86-gcc とする) # make # make install # strip /usr/local/bin/openssl
Solaris 9 では、Entire Distribution でインストールすれば標準で openssh が付いてくる (version string は SSH-2.0-Sun_SSH_1.0) ので、そちらを使えばよい。
# gzip -cd openssh-3.9p1.tar.gz | tar xf - # cd openssh-3.9p1 # ./configure --prefix=/usr/local --sysconfdir=/usr/local/etc/ssh \ > --with-cflags=-O3 \ > --with-tcp-wrappers=/usr/sfw --with-ssl-dir=/usr/local \ (自前で入れた tcp_wrappers の場合は適切なディレクトリを指定すること) > --with-pam --with-default-path=/usr/local/bin:/usr/bin:/usr/ucb \ > --with-ipv4-default --with-4in6 # make # make install
インストールが完了したら、 sshd を起動するスクリプトを /etc/rc2.d あたりに置き、そのスクリプトからデーモンを起動する。
# mkdir bind # cd bind # gzip -cd ../bind-src.tar.gz | tar xf - # cd src # gpatch -p1 < ../../bind-sol.patch # make # make install
# gzip -cd db-4.2.52.tar.gz | tar xf - # cd db-4.2.52 # gpatch -p0 < ../patch.4.2.52.1 # gpatch -p0 < ../patch.4.2.52.2 # gpatch -p1 < ../db-4.2.52.diff # cd build_unix # CC=gcc CFLAGS=-O3 LDFLAGS=-R/usr/local/lib ../dist/configure \ > --prefix=/usr/local --enable-compat185 --enable-cxx --enable-java # make # make install
8.12 系からは sendmail バイナリが setgid smmsp となるので、 ユーザ smmsp、グループ smmsp が必要だが、solaris 9 では既に存在するので作成の必要は無い。
# groupadd -g 25 smmsp # useradd -u 25 -g smmsp -d /etc/mail -s /bin/false smmsp # gzip -cd sendmail.8.12.11.tar.gz | tar xf - # cd sendmail-8.12.11 # cp ../site.config.m4 devtools/Site # sh Build # mv /etc/mail/helpfile /etc/mail/helpfile.orig # mkdir -p /usr/local/man/cat1 /usr/local/man/cat5 /usr/local/man/cat8 # sh Build install
# groupadd -g 80 www # useradd -u 80 -g www -d /usr/local/www -s /bin/false www # gzip -cd apache_1.3.31.tar.gz | tar xf - # cd apache_1.3.31 # gpatch -p1 < ../apache-layout.patch # CFLAGS=-O3 LDFLAGS="-L/usr/local/lib -R/usr/local/lib" \ > ./configure --with-layout=Solaris --prefix=/usr/local \ > --server-uid=www --server-gid=www --with-perl=/usr/bin/perl \ > --without-confadjust --enable-module=most --enable-module=mmap_static \ > --disable-module=auth_dbm --disable-module=auth_db --enable-shared=max \ > --enable-suexec --suexec-caller=www --suexec-docroot=/usr/local/apache/htdocs \ > --suexec-logfile=/var/log/apache/suexec_log \ > --suexec-safepath=/usr/local/bin:/usr/bin:/usr/ucb # make # make install
# gzip -cd squid-2.5.STABLE5.tar.gz | tar xf - # cd squid-2.5.STABLE5 # gpatch -p1 < ../squid-2.5.STABLE5-ntlm_assert.patch # gpatch -p1 < ../squid-2.5.STABLE5-ldap.patch # gpatch -p1 < ../squid-2.5.STABLE5-helper_warning.patch # gpatch -p1 < ../squid-2.5.STABLE5-pkgconfig.patch # gpatch -p1 < ../squid-2.5.STABLE5-vary.patch # gpatch -p1 < ../squid-2.5.STABLE5-lin22_poll.patch # gpatch -p1 < ../squid-2.5.STABLE5-version.patch # gpatch -p1 < ../squid-2.5.STABLE5-deny_info.patch # gpatch -p1 < ../squid-2.5.STABLE5-CONNECT_timeout.patch # gpatch -p1 < ../squid-2.5.STABLE5-cache_swap_log.patch # gpatch -p1 < ../squid-2.5.STABLE5-ntlm_warning.patch # gpatch -p1 < ../squid-2.5.STABLE5-rfc1035NameUnpack.patch # gpatch -p1 < ../squid-2.5.STABLE5-digest_blank.patch # gpatch -p1 < ../squid-2.5.STABLE5-post_assert.patch # gpatch -p1 < ../squid-2.5.STABLE5-spelling.patch # gpatch -p1 < ../squid-2.5.STABLE5-digest_ERR.patch # gpatch -p1 < ../squid-2.5.STABLE5-turkish_ERR_DNS_FAIL.patch # gpatch -p1 < ../squid-2.5.STABLE5-vary_negatively.patch # gpatch -p1 < ../squid-2.5.STABLE5-range_offset_limit.patch # gpatch -p1 < ../squid-2.5.STABLE5-sol.patch # CFLAGS=-O3 ./configure --prefix=/usr/local \ > --bindir=/usr/local/sbin --libexecdir=/usr/local/libexec/squid \ > --sysconfdir=/usr/local/etc/squid --localstatedir=/var \ > --enable-async-io --with-pthreads \ > --enable-storeio="aufs coss diskd null ufs" \ > --enable-delay-pools --enable-useragent-log --enable-referer-log \ > --enable-htcp --enable-snmp --enable-cache-digests \ > --enable-auth-modules="NCSA PAM SMB YP getpwnam" # make # make install
# gzip -cd net-snmp-5.1.1.tar.gz | tar xf - # cd net-snmp-5.1.1 # CFLAGS=-O3 ./configure --prefix=/usr/local --with-zlib=/usr \ > --enable-shared --with-libwrap=/usr/sfw \ > --with-defaults --with-sys-contact=nobody@no.where # make # make install
# gzip -cd proftpd-1.2.10rc1.tar.gz | tar xf - # cd proftpd-1.2.10rc1 # gpatch -p1 < ../proftpd-1.2.10rc1-wtmp.diff # CFLAGS=-O3 ./configure --prefix=/usr/local --localstatedir=/var/run # make # make install
Solaris 9 では SUNWjpg に入っている。
# gzip -cd jpegsrc.v6b.tar.gz | tar xf - # cd jpeg-6b # CFLAGS=-O3 ./configure --enable-shared --enable-static # make # make install
Solaris 9 では SUNWpng に入っている。
# gzip -cd libpng-1.2.5.tar.gz | tar xf - # cd libpng-1.2.5 # cp scripts/makefile.solaris Makefile # make # make install
Solaris 9 では /usr/sfw/lib/libtiff が SUNWTiff に入っている。
9 以前のバージョンでも /usr/openwin/lib/libtiff があるが、 互換ではないようなので使わないこと。
Solaris 9 では、ライブラリパスで /usr/openwin/lib より /usr/sfw/lib が先に来るようにリンクしなければならない。
# gzip -cd tiff-v3.5.7.tar.gz | tar xf - # cd tiff-v3.5.7 # gpatch -p1 < ../tiff-v3.5.7.diff # ./configure (この後設定パラメタについて OK かどうか問われるので、そのまま yes と答える) # make # make install
# gzip -cd libxml2-2.6.9.tar.gz | tar xf - # cd libxml2-2.6.9 # gpatch -p1 < ../libxml2-2.6.9.diff # CFLAGS=-O3 ./configure --with-html-dir=/usr/local/share/doc \ > --with-html-subdir=libxml2 # make # make install
# gzip -cd netpbm-10.22.tgz | tar xf - # cd netpbm-10.22 # gpatch -p1 < ../netpbm-10.22-sol9.diff # /usr/local/bin/make -f GNUmakefile # /usr/local/bin/make -f GNUmakefile package pkgdir=/tmp/netpbm # ./installnetpbm
# gzip -cd ImageMagick-6.0.1-1.tar.gz | tar xf - # cd ImageMagick-6.0.1 # CFLAGS=-O3 CXXFLAGS=-O3 \ > CPPFLAGS="-I/usr/sfw/include -I/usr/local/include" \ > LDFLAGS="-L/usr/sfw/lib -R/usr/sfw/lib -L/usr/local/lib -R/usr/local/lib" \ > ./configure --with-modules --with-perl=/usr/local/bin/perl \ > --with-windows-font-dir=/usr/openwin/lib/X11/fonts/TrueType # make # make install
# bzip2 -cd mozilla-source-1.7rc1.tar.bz2 | tar xf - # cd mozilla # cp ../mozconfig.sparc .mozconfig (UltraSPARC) # cp ../mozconfig.i386 .mozconfig (Intel) # /usr/local/bin/make -f client.mk build # mkdir -p /usr/local/lib/mozilla # cd dist/bin # tar chf - * | (cd /usr/local/lib/mozilla; tar xf -) # cd /usr/local/lib/mozilla # MOZILLA_FIVE_HOME=. LD_LIBRARY_PATH=. ./regxpcom # MOZILLA_FIVE_HOME=. LD_LIBRARY_PATH=. ./regchrome
Solaris では非常時に使われるバイナリが静的リンクされて /sbin
に配置されているが、自分でバイナリを静的リンクすることは難しい。
静的リンクすると libdl.so に入っている dlopen()
などの関数が未定義シンボルとなるからだ。
そこで、関連の関数を X11 から持ってきて、更に足りない分は 自ら補うことにする。
まずは、X11 の一部である dlsym.c と bash のソース、パッチを取得しておく。
# gzip -cd bash-2.05b.tar.gz | tar xf - # cd bash-2.05b # gpatch -p0 < ../bash205b-001 # gpatch -p0 < ../bash205b-002 # gpatch -p0 < ../bash205b-003 # gpatch -p0 < ../bash205b-004 # gpatch -p0 < ../bash205b-005 # gpatch -p0 < ../bash205b-006 # gpatch -p0 < ../bash205b-007 # cp ../dlsym.c . # gpatch -p0 < ../dlsym.diff # gcc -c dlsym.c # LOCAL_LIBS=dlsym.o ./configure --enable-static-link # make # cp bash /sbin
これで完全にスタティックリンクされたバイナリができたので、 /sbin にインストールして root のログインシェルとして利用しても問題ない。
ただし、/usr/lib/libc.a の中の getpwnam()
が腐っているらしく、シェル変数 PS1 に \u
を入れても "I have no name!"
となってしまうので注意。