mazinlabsのブログ

RubyとかCloudとかその辺の記事を書いたり書かなかったり

CentOS(64bit)にMercurialを入れてみた

CentOS5.4(64bit)にMercurialを入れようとしたらレポジトリに見つからない。
ちょっと調べてみたところ公式のレポジトリにはMercurialは入ってないらしい。

# yum search mercurial
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * addons: www.ftp.ne.jp
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Warning: No matches found for: mercurial
No Matches found

野良パッケージにはあるらしいが、
そちらを使うと他の依存したものも野良パッケージから大量に導入されるそうなので、
ちょっとそれは避けてたい。


そんなわけでソースコードからインストールすることに。
Mercurial 1.5 source code

# wget http://mercurial.selenic.com/release/mercurial-1.5.tar.gz
--2010-03-14 20:39:35--  http://mercurial.selenic.com/release/mercurial-1.5.tar.gz
mercurial.selenic.com をDNSに問いあわせています... 173.11.57.243
mercurial.selenic.com|173.11.57.243|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2017153 (1.9M) [application/x-gzip]
`mercurial-1.5.tar.gz' に保存中

100%[================================================>] 2,017,153    497K/s 時間 4.3s

2010-03-14 20:39:40 (455 KB/s) - `mercurial-1.5.tar.gz' へ保存完了 [2017153/2017153]


拾ってきた物を解凍。

# tar xvfz mercurial-1.5.tar.gz
# cd mercurial-1.5
# ll
合計 120
-rw-r--r-- 1 root root  1663  3月  6 09:26 CONTRIBUTORS
-rw-r--r-- 1 root root 17992  3月  6 09:26 COPYING
-rw-r--r-- 1 root root  3580  3月  6 09:26 Makefile
-rw-r--r-- 1 root root   236  3月  6 09:26 PKG-INFO
-rw-r--r-- 1 root root   306  3月  6 09:26 README
drwxr-xr-x 8 root root  4096  3月  6 09:26 contrib
drwxr-xr-x 2 root root  4096  3月  6 09:26 doc
-rwxr-xr-x 1 root root   774  3月  6 09:26 hg
-rwxr-xr-x 1 root root  1251  3月  6 09:26 hgeditor
drwxr-xr-x 6 root root  4096  3月  6 09:26 hgext
-rw-r--r-- 1 root root   886  3月  6 09:26 hgweb.cgi
-rw-r--r-- 1 root root  2279  3月  6 09:26 hgwebdir.cgi
drwxr-xr-x 2 root root  4096  3月  6 09:26 i18n
drwxr-xr-x 6 root root  4096  3月  6 09:26 mercurial
-rw-r--r-- 1 root root 10693  3月  6 09:26 setup.py
drwxr-xr-x 5 root root 36864  3月  6 09:26 tests


次にインストール

# make install
(中略)
running build_ext
building 'mercurial.base85' extension
creating build/temp.linux-x86_64-2.4
creating build/temp.linux-x86_64-2.4/mercurial
gcc -pthread -fno-strict-aliasing -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fPIC -I/usr/include/python2.4 -c mercurial/base85.c -o build/temp.linux-x86_64-2.4/mercurial/base85.o
/usr/include/python2.4/Python.h:8 から include されたファイル中,
                 mercurial/base85.c:12 から:
/usr/include/python2.4/pyconfig.h:6:25: error: pyconfig-64.h: そのようなファイルやディレクトリはありません
/usr/include/python2.4/Python.h:55 から include されたファイル中,
                 mercurial/base85.c:12 から:
/usr/include/python2.4/pyport.h:612:2: error: #error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)."
error: command 'gcc' failed with exit status 1
make: *** [build] エラー 1


調べてみたところpython-develがないことが原因らしい。
yumからpython-develをインストール

# yum install python-devel -y
(中略)
Running Transaction
  Installing     : python-devel                                                       1/1

Installed:
  python-devel.x86_64 0:2.4.3-27.el5

Complete!


これで再度インストール。

# make install
(中略)
running install_scripts
copying build/scripts-2.4/hg -> /usr/local/bin
changing mode of /usr/local/bin/hg to 755
make -C doc
make[1]: ディレクトリ `/root/file/mercurial-1.5/doc' に入ります
make[1]: `all' に対して行うべき事はありません.
make[1]: ディレクトリ `/root/file/mercurial-1.5/doc' から出ます
cd doc && make  install
make[1]: ディレクトリ `/root/file/mercurial-1.5/doc' に入ります
for i in hg.1 hgignore.5 hgrc.5 ; do \
          subdir=`echo $i | sed -n 's/^.*\.\([0-9]\)$/man\1/p'` ; \
          mkdir -p /usr/local/share/man/$subdir ; \
          install -c -m 644 $i /usr/local/share/man/$subdir ; \
        done
make[1]: ディレクトリ `/root/file/mercurial-1.5/doc' から出ます


最後の方を見るとインストール失敗に見えるけどちゃんとインストール出来ているらしい。
と思ったらなんかPATHがうまくいってないと怒られる。

# hg version
abort: couldn't find mercurial libraries in [/usr/local/bin /usr/lib64/python24.zip /usr/lib64/python2.4 /usr/lib64/python2.4/plat-linux2 /usr/lib64/python2.4/lib-tk /usr/lib64/python2.4/lib-dynload /usr/lib64/python2.4/site-packages /usr/lib64/python2.4/site-packages/Numeric /usr/lib64/python2.4/site-packages/gtk-2.0 /usr/lib/python2.4/site-packages]
(check your install and PYTHONPATH)


どうやらPYTHONPATHがうまく設定されていないのが原因らしい。
調べたところ64bit版だとMercurialのインストール先がちがうからだとか。
正しいPATHにPTHONPATHを設定して起動確認。

# export PYTHONPATH=/usr/local/lib64/python2.4/site-packages
# hg
Mercurial - 分散構成管理ツール

基本コマンド:

 add        指定ファイルの追加登録予約
 annotate   ファイル行毎のリビジョン情報表示
 clone      既存リポジトリの複製
 commit     指定ファイルないし全ての変更内容のリポジトリへの記録
 diff       作業領域全体(ないし指定ファイル)の差分抽出
 export     1つ以上のリビジョンに対するヘッダおよび変更内容の出力
 forget     次回コミットにおける指定ファイルの登録除外
 init       指定されたディレクトリでの新規リポジトリの作成
 log        リポジトリ全体ないしファイルの変更履歴の表示
 merge      作業領域の内容と他のリビジョンのマージ
 pull       指定リポジトリからの変更履歴の取り込み
 push       指定リポジトリへの変更履歴の反映
 remove     次回コミットにおける指定ファイルの登録除外
 serve      HTTP 経由でのリポジトリの公開
 status     作業領域のファイル操作状況の表示
 summary    作業領域状態の概要表示
 update     作業領域の更新

全コマンドの一覧は "hg help" で、コマンド詳細は "hg -v" で表示されます

これで無事にインストールができた。


追加で毎回exportするのが面倒なのでbashrcに書こうかと思ったが、
本家のページではこんなふうに書いてあった

$ mv /var/hg/bin/hg /var/hg/bin/hg.py
$ cat > /var/hg/bin/hg <<\EOF
#!/bin/sh
PYTHONPATH=/var/hg/lib/python2.5/site-packages:${PYTHONPATH}
export PYTHONPATH
exec /var/hg/bin/hg.py "$@"
EOF

http://mercurial.selenic.com/wiki/UnixInstall

それを真似て設定。

# cp /usr/local/bin/hg /usr/local/bin/hg.py
# vim /usr/local/bin/hg

中身の記述はほとんどそのまんま。

#!/bin/sh
PYTHONPATH=/usr/local/lib64/python2.4/site-packages
export PYTHONPATH
exec /usr/local/bin/hg.py "$@"

一応の起動確認。

# hg version
Mercurial - 分散構成管理ツール(バージョン 1.5)

著作権 (C) 2005-2010 Matt Mackall <mpm@selenic.com> 他
本製品はフリーソフトウェアです。頒布/改変の際はライセンス条項をお読み
ください。市場適合性や特定用途への可否を含め、本製品は無保証です。

これでよし。