yumetodoの旅とプログラミングとかの記録

旅や登山の記録やプログラミング関連の話とかフリーソフト紹介とか

東京理科大学のLinux環境に最新のgitを自前ビルドして導入しようとしたが挫折した話

はじめに

まじでCentOS6、ひいてはRedHatに殺意を覚える内容となっている。大体2009年とかでバージョンが止まってるものが多すぎる。今2017年だぞ?8年前とかもはや旧石器時代だ。

以下のビルド手順はArch Linux RepositoryおよびArch User RepositoryのPKGBUILDに大いにお世話になっている。これなしでは挫折したであろうこと疑いない。

なぜgitのビルドが必要か

実は理科大は今年Linux環境がCentOS5からCentOS6になった。なんでCentOS7じゃないんだよという話は

yumetodo.hateblo.jp

でしたので割愛して、その影響で今年からgitが使えるようになった。人権がある、そう思っていた。

ところが

$ git --version
git version 1.7.1

となる。1.7.1だぁ?時代は2.xだぞ?

しかも困ったことがある。

https://help.github.com/articles/https-cloning-errors/

によれば

Check your Git version

There’s no minimum Git version necessary to interact with GitHub, but we’ve found version 1.7.10 to be a comfortable stable version that’s available on many platforms. You can always download the latest version on the Git website.

1.7.10以上が必要らしい。Git使うのにGithubにpushできないとか人権がない(fechはできる)。

まだgitがビルドできると思っていた頃の記録

下準備(大学のPCのWindows上)

どういうわけか~/.bashrcのwrite permissionが無いので大学のPCのWindows上で~/.bashrcの中身をコピーした改行コードがLFのテキストファイルを作成し、powershellとかコマンドプロンプト

copy a.sh .bashrc

とかする。するとwrite permissionとexecution permissionが手に入る。

ここまでやればあとはssh越しでもできる。

下準備
cd ~
mkdir -P local

それから~/.bashrc

export PATH=/home/232/2314090/local/bin:$PATH
export LD_LIBRARY_PATH='/home/232/2314090/local/lib:$LD_LIBRARY_PATH'
export PKG_CONFIG_PATH='/home/232/2314090/local/lib/pkgconfig:$PKG_CONFIG_PATH'

を追記して

source ~/.bashrc

しておく。

cmake

cmakeが2.8.12.2とか古すぎてやってられないので、公式から新しくbinaryを取ってくる。

cd /dev/shm
wget https://cmake.org/files/v3.9/cmake-3.9.0-rc3-Linux-x86_64.sh
chmod +x cmake-3.9.0-rc3-Linux-x86_64.sh
./cmake-3.9.0-rc3-Linux-x86_64.sh

くっそ長いライセンス同意文を慎重に読み飛ばして、Do you accept the license?y、ついでDo you want to include the subdirectoryn。そうしたら

source ~/.bashrc

する。これを忘れると

CMake Error: Could not find CMAKE_ROOT !!!
CMake has most likely not been installed correctly.
Modules directory not found in
/home/232/2314090/local/bin
セグメンテーション違反です (コアダンプ)

とか怒られる。

stackoverflow.com

zlib
cd /dev/shm
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -xf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/home/232/2314090/local
make
make install

どういうわけかpkgconfigがぶっ壊れているので自力で書き換える。

vim ~/local/lib/pkgconfig/zlib.pc

などして

prefix=~/local

となっているのを

prefix=/home/232/2314090/local

にすればよい。

openssl
cd /dev/shm
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
tar -xf openssl-1.1.0f.tar.gz
cd openssl-1.1.0f
./config --prefix=/home/232/2314090/local --with-zlib-include=/home/232/2314090/local/include/ --with-zlib-lib=/home/232/2314090/local/lib/ zlib
cd ~/local/ssl/certs
ln -s /etc/pki/tls/certs/ca-bundle.crt ca-bundle.crt
ln -s /etc/pki/tls/certs/ca-bundle.trust.crt ca-bundle.trust.crt
ln -s /etc/pki/tls/certs/localhost.crt localhost.crt

--with-zlib-includeを間違えて-with-zlib-includeにしていてエラーになり質問したりしてた。恥ずかしい。

pip(python)

~/.bashrc

export PYTHONPATH='/home/232/2314090/local/lib/python2.6/site-packages:$PYTHONPATH'

と追記し、

mkdir -p ~/local/lib/python2.6/site-packages
source ~/.bashrc
easy_install --prefix=$HOME/local pip

とする。get-pip.pyはインストール先を使えないので使わない。

libev
cd /dev/shm
git clone https://github.com/JiapengLi/libev.git --depth=1
cd libev
./configure --prefix=/home/232/2314090/local/
make
make install
libevent
cd /dev/shm
git clone --depth=1 -b release-2.1.8-stable https://github.com/libevent/libevent.git
./autogen.sh
./configure --prefix=/home/232/2314090/local --disable-libevent-regress --disable-samples
make
make install
jansson
cd /dev/shm
git clone https://github.com/akheron/jansson.git
cd jansson/
git checkout -b build v2.10
cmake -DCMAKE_INSTALL_PREFIX=/home/232/2314090/local -DJANSSON_BUILD_DOCS=false
make
make install

-DJANSSON_BUILD_DOCS=falseをしないとsphinxというpython製のドキュメント生成ツールを要求されます。pipは上述の通り入れられるがpipを使ったインストールがどうもできない。

pip install --install-option="--prefix=$HOME/local" sphinx
pip install sphinx --user

は試したけどだめだった。

libunistring
cd /dev/shm
wget https://ftp.gnu.org/gnu/libunistring/libunistring-0.9.7.tar.xz
tar -xf libunistring-0.9.7.tar.xz 
cd libunistring-0.9.7
./configure --prefix=/home/232/2314090/local 
make
make install
gettext
cd /dev/shm
wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.8.1.tar.gz
tar -xf gettext-0.19.8.1.tar.gz 
cd gettext-0.19.8.1
./configure --prefix=/home/232/2314090/local --libdir=/home/232/2314090/local/lib --libexecdir=/home/232/2314090/local/lib
make
make install

わりとビルドには時間がかかる。これの依存ライブラリのlibaclはCentOS6にくっついてくるものでよさそうだ。

autoconf

なんとxzをビルドするのにまさかのautoconfのビルドが必要だった。さもないと

error: Autoconf version 2.64 or higher is required

とか言われる。ちくせう。

cd /dev/shm
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz
tar -xf autoconf-2.69.tar.xz 
cd autoconf-2.69
./configure --prefix=/home/232/2314090/local
make
make install
automake

なんとxzをビルドするのにまさかのautomakeのビルドも必要だった。さもないと

require Automake 1.12, but have 1.11.1

とか言われる。ちくせう。

cd /dev/shm
wget http://ftp.gnu.org/gnu/automake/automake-1.15.1.tar.xz
tar -xf automake-1.15.1.tar.xz 
cd automake-1.15.1
./configure --prefix=/home/232/2314090/local
make
make install
xz

なんかこいつのためにえらいいろいろビルドさせられた感ある。

git clone https://git.tukaani.org/xz.git
cd xz
git checkout -b build v5.2.3
./autogen.sh
./configure --prefix=/home/232/2314090/local --disable-rpath --enable-werror
make
make install
libicu(失敗)
cd /dev/shm
wget http://download.icu-project.org/files/icu4c/59.1/icu4c-59_1-Fedora25-x64.tgz
tar -xf icu4c-59_1-Fedora25-x64.tgz
cd icu/usr
rsync -a local/ ~/local

これはビルドが面倒そうなので公式配布のfedora向けのbinaryを拝借しようとしたらglibcのバージョンが合わずに失敗した。仕方ないからビルドしようとするじゃん?std::nullptr_tって何ですか?ってエラーが出るんですね、C++11に対応した環境じゃないとビルドできない。

C++11環境が必要になった

gcc

C++11がまともに使えないgccではclangをビルドできないので、gccgccをビルドする。

cd /dev/shm
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.bz2
tar -xf gcc-7.1.0.tar.bz2
cd gcc-7.1.0
mv ./contrib/download_prerequisites ./contrib/download_prerequisites_bk
sed -e "s/ftp/http/g" ./contrib/download_prerequisites_bk > ./contrib/download_prerequisites
chmod +x contrib/download_prerequisites
./contrib/download_prerequisites
cd /dev/shm
mkdir gcc_build
cd gcc_build/
../gcc-7.1.0/configure --prefix=$HOME/local --enable-languages=c,c++ --disable-multilib 2>&1 | tee ~/gcc710_configure.log
make -j2  2>&1 | tee ~/gcc710_build.log

なんと容量不足でコケる。libstdc++のリンク作業で詰む。

WebDAVをマウントして速度を犠牲に容量不足を解消しようとした

幸い理科大のネットワーク回線は比較的高速なので、WebDAVをマウントしてそこでgccビルドすればワンちゃんあると思った。 理科大生なら今年からBoxが無料で無制限に利用できるから容量の心配はいらない。

serverfault.com

によればwdfsってのを使えばrootがなくてもマウントできるぽい。

neon

WebDAV Client library。

wget http://www.webdav.org/neon/neon-0.30.2.tar.gz

tar -xf neon-0.30.2.tar.gz 
cd neon-0.30.2
./configure --prefix=$HOME/local --with-expat --enable-shared --disable-static --with-ssl=openssl --with-ca-bundle=/etc/pki/tls/certs/ca-bundle.crt
make
make install
fuse

mountしちゃう系ソフト。わりとインストールが面倒くさい。configure先生仕事してください。

wget https://github.com/libfuse/libfuse/releases/download/fuse-2.9.7/fuse-2.9.7.tar.gz
tar -xf fuse-2.9.7.tar.gz 
cd fuse-2.9.7
./configure --prefix=/usr --libdir=/usr/lib --enable-lib --enable-util --disable-example
make
mkdir dest
make DESTDIR=/dev/shm/fuse-2.9.7/dest install
cd dest/
mv etc/udev usr/lib/
mv sbin/mount.fuse usr/bin/
rsync -a usr/ ~/local

本当は/etcfuse.confもおかないといけないんだけど、permissionがないので致し方なし。

で、pkgconfigがぶっ壊れているので

vim ~/local/lib/pkgconfig/fuse.pc

などして

prefix=/usr
exec_prefix=${prefix}
libdir=/usr/lib
includedir=${prefix}/include

となっているのを

prefix=/home/232/2314090/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

にすればよい。

wdfs

WebDAVをマウントするソフト。

wget http://noedler.de/projekte/wdfs/wdfs-1.4.2.tar.gz
tar -xf wdfs-1.4.2.tar.gz 
cd wdfs-1.4.2
LDFLAGS='-lpthread' ./configure --prefix=$HOME/local
wget https://raw.githubusercontent.com/jmesmon/overlay/master/net-fs/wdfs/files/wdfs-1.4.2-fix-Waddress.patch
wget https://raw.githubusercontent.com/jmesmon/overlay/master/net-fs/wdfs/files/wdfs-1.4.2-user-agent.patch
patch -p1 -t -N < wdfs-1.4.2-fix-Waddress.patch 
patch -p1 -t -N < wdfs-1.4.2-user-agent.patch 
make
make install

github.com

のパッチを利用させてもらった。

ビルドは通ったがいざ使おうとすると

$wdfs https://dav.box.com/dav $HOME/mnt/box
username: 2314090@ed.tus.ac.jp
password:
fusermount: mount failed: Operation not permitted

権限がないと言われる。詰んだ。あーもーだめだ(AMD)。