フリーソフトウェアのコンパイル

Solaris 階層に戻る  |  ホームに戻る

私が 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

1. 開発環境

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 以前のアーキテクチャで動作しなくなってしまうので、注意されたい。

m4-1.4.2

# gzip -cd m4-1.4.2.tar.gz | tar xf -
# cd m4-1.4.2
# CFLAGS=-O3 ./configure --prefix=/usr/local
# make
# make install

libiconv-1.9.2

# 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

gettext-0.14.1

# gzip -cd gettext-0.14.1.tar.gz | tar xf -
# cd gettext-0.14.1
# CFLAGS=-O3 ./configure --prefix=/usr/local
# make
# make install

bison-1.875

# gzip -cd bison-1.875.tar.gz | tar xf -
# cd bison-1.875
# CFLAGS=-O3 ./configure --prefix=/usr/local
# make
# make install

flex-2.5.4a

# gzip -cd flex-2.5.4a.tar.gz | tar xf -
# cd flex-2.5.4
# CFLAGS=-O3 ./configure --prefix=/usr/local
# make
# make install

make-3.80

# gzip -cd make-3.80.tar.gz | tar xf -
# cd make-3.80
# CFLAGS=-O3 ./configure --prefix=/usr/local
# LANG=C make
# make install

bzip2-1.0.2 (bzip2 コマンドが無い場合)

# gzip -cd bzip2-1.0.2.tar.gz | tar xf -
# cd bzip2-1.0.2
# make
# make install

gcc-3.4.2

# 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

patch-2.5.4 (Solaris 7 以前のみ)

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

diffutils-2.8.1

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

tar-1.14

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

2. ユーティリティ

tcsh-6.12.03

# 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

less-358

# 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 より入手。

perl-5.8.5

# 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

nkf-2.04

# 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

3. SSH 関連

zlib-1.2.1

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

tcp_wrappers-7.6 (IPv6 対応版)

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 以前では egdPRNGDANDIrand のいずれかをインストールする。以下は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

openssl-0.9.7d

# 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

openssh-3.9p1

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 あたりに置き、そのスクリプトからデーモンを起動する。

4. サーバプログラム

bind-8.4.4

# mkdir bind
# cd bind
# gzip -cd ../bind-src.tar.gz | tar xf -
# cd src
# gpatch -p1 < ../../bind-sol.patch
# make
# make install

db-4.2.52 (sendmail 等で利用)

# 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

sendmail-8.12.11

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

apache-1.3.31

# 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

squid-2.5STABLE5


# 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

net-snmp-5.1.1

# 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

proftpd-1.2.10rc1

# 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

5. その他

jpeg-6b

Solaris 9 では SUNWjpg に入っている。

# gzip -cd jpegsrc.v6b.tar.gz | tar xf -
# cd jpeg-6b
# CFLAGS=-O3 ./configure --enable-shared --enable-static
# make
# make install

libpng-1.2.5

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

tiff-3.5.7

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

libxml2-2.6.9

# 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

netpbm-10.22

# 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

ImageMagick-6.0.1-1

# 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

mozilla-1.7rc1

# 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

bash-2.05b (static link 版)

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!" となってしまうので注意。

Solaris 階層に戻る  |  ホームに戻る

Copyright (C) 2001-2003
Last modified: Fri Sep 1 10:51:49 JST 2006
You are the 132061 th visitor.