Squid4.0.7をインストール

Squid4.0.7をRHEL6へインストールしてみました。RHELyumで入ってくるgccは4.4.7。これでコンパイル、リンクするとこんなエラーがでてきます。

libtool: compile:  g++ -DHAVE_CONFIG_H -I../.. -I../../include -I../../lib -I../../src -I../../include -I../../libltdl -Wall -Wpointer-arith -Wwrite-strings -Wcomments -Wshadow -Werror -Wno-deprecated-register -pipe -D_REENTRANT -g -O2 -march=native -std=c++0x -MT AllocatorProxy.lo -MD -MP -MF .deps/AllocatorProxy.Tpo -c AllocatorProxy.cc -o AllocatorProxy.o >/dev/null 2>&1
In file included from ../../src/acl/forward.h:12,
                 from ../../src/acl/AclNameList.h:12,
                 from old_api.cc:13:
../../src/base/RefCount.h:67: error: only declarations of constructors can be ‘explicit’
In file included from old_api.cc:14:
../../src/base/PackableStream.h:30: error: expected ‘;’ before ‘override’
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/functional:56,
                 from ../../src/HttpHeaderTools.h:16,
                 from ../../src/SquidConfig.h:18,
                 from old_api.cc:26:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/typeinfo:36: error: expected ‘;’ before end of line
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/typeinfo:36: error: expected ‘}’ before end of line
In file included from old_api.cc:14:
../../src/base/PackableStream.h: In constructor ‘PackableStreamBuf::PackableStreamBuf(Packable&)’:
../../src/base/PackableStream.h:23: error: class ‘PackableStreamBuf’ does not have any field named ‘buf_’
../../src/base/PackableStream.h:23: error: ‘buf_’ was not declared in this scope
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/functional:56,
                 from ../../src/HttpHeaderTools.h:16,
                 from ../../src/SquidConfig.h:18,
                 from old_api.cc:26:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/typeinfo: At global scope:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/typeinfo:36: error: expected unqualified-id before end of line
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/typeinfo:36: error: expected declaration before end of line
libtool: compile:  g++ -DHAVE_CONFIG_H -I../.. -I../../include -I../../lib -I../../src -I../../include -I../../libltdl -Wall -Wpointer-arith -Wwrite-strings -Wcomments -Wshadow -Werror -Wno-deprecated-register -pipe -D_REENTRANT -g -O2 -march=native -std=c++0x -MT Pool.lo -MD -MP -MF .deps/Pool.Tpo -c Pool.cc -o Pool.o >/dev/null 2>&1
cc1plus: warnings being treated as errors
cc1plus: error: unrecognized command line option "-Wno-deprecated-register"
make[3]: *** [old_api.lo] エラー 1
make[3]: *** 未完了のジョブを待っています....
libtool: compile:  g++ -DHAVE_CONFIG_H -I../.. -I../../include -I../../lib -I../../src -I../../include -I../../libltdl -Wall -Wpointer-arith -Wwrite-strings -Wcomments -Wshadow -Werror -Wno-deprecated-register -pipe -D_REENTRANT -g -O2 -march=native -std=c++0x -MT PoolMalloc.lo -MD -MP -MF .deps/PoolMalloc.Tpo -c PoolMalloc.cc -o PoolMalloc.o >/dev/null 2>&1
libtool: compile:  g++ -DHAVE_CONFIG_H -I../.. -I../../include -I../../lib -I../../src -I../../include -I../../libltdl -Wall -Wpointer-arith -Wwrite-strings -Wcomments -Wshadow -Werror -Wno-deprecated-register -pipe -D_REENTRANT -g -O2 -march=native -std=c++0x -MT PoolChunked.lo -MD -MP -MF .deps/PoolChunked.Tpo -c PoolChunked.cc -o PoolChunked.o >/dev/null 2>&1
make[3]: ディレクトリ `/home/hoge/squid/squid-4.0.7/src/mem' から出ます
make[2]: *** [all-recursive] エラー 1
make[2]: ディレクトリ `/home/hoge/squid/squid-4.0.7/src' から出ます
make[1]: *** [all] エラー 2
make[1]: ディレクトリ `/home/hoge/squid/squid-4.0.7/src' から出ます
make: *** [all-recursive] エラー 1

Squidのドキュメントをみてもなにもこの件については書いてないのですが、コンパイルできる環境との差分をとってみると、どうやらgcc(またはgccから呼ばれるプリプロセッサ)が古いためらしい。
そこで昨日のエントリにてgccの最新をインストール。あらためてsquidコンパイル・リンクに挑戦。

ソースを展開

適当なところへソースを展開します。

$ cd squid
$ tar -zxvf /tmp/squid-4.0.7.tar.gz

環境変数設定

昨日のインストールではgcc5.3.0は/usr/local以下へインストールしたので環境変数でそちらを参照するように設定します。

$ export PATH=/usr/local/bin:$PATH
$ export LDFLAGS='-L/usr/local/lib64'
$ export LD_LIBRARY_PATH=/usr/local/lib64
$ export LD_RUN_PATH=/usr/local/lib64
$ export CC=/usr/local/bin/gcc

一番下のCCは要らないけど、一応明示的にしたくて。
LD_RUN_PATHは設定しないと、コンパイル中にこんなエラーがでます。

./cf_gen
./cf_gen: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./cf_gen)
./cf_gen: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ./cf_gen)
./cf_gen: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./cf_gen)

libstdc++.so.6を/usr/lib64のものを参照しているためですね。gcc5.3.0のものを参照するために必要です。

configure

今回はすでに入っているSquidとは別の場所へインストールしたいので、--prefix を指定します。

$ ./configure --prefix=/usr/local/squid2/

make

$ make -j8

インストール

# make install