源码编译MongoDB

上周放假正好有时间,编译安装了MongoDB,虽然MongoDB用了挺长时间的,但还是第一次用源码编译。在此做个备忘。因为已经完整编译安装过了,所以写起来的时候,就按照先知视角来写了~ 2333

下载MongoDB源码

MongoDB的官网上是有已经编译好的二进制包的,这里选择clone MongoDB在github上的仓库

1
git clone https://github.com/mongodb/mongo && cd mongo

docs/building.md中是编译所需的依赖。

  • A modern C++ compiler. One of the following is required.
    • GCC 4.8.2 or newer
    • Clang 3.4 (or Apple XCode 5.1.1 Clang) or newer
    • Visual Studio 2013 Update 2 or newer
  • Python 2.7
  • SCons 2.3

我这台服务器是CentOS 6.5, 上面的gcc版本比较低,这里就先更新gcc咯.

1
2
3
4
5
6
gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)
Copyright © 2010 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。
本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。

编译升级gcc

在gcc的官网找到下载页面。使用svn或者通过ftp镜像站下载源码.
我使用了一个ftp镜像站下载的源码压缩包。 然后进行解压和安装依赖。

1
2
3
tar -xjf gcc-5.2.0.tar.bz2 && cd gcc-5.2.0
./contrib/download_prerequisites(等待依赖完成)

之后编译

1
2
3
4
5
cd .. && mkdir gcc-build-5.2.0 && cd gcc-build-5.2.0
# 编译
../gcc-5.2.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for a sed that does not truncate output... /bin/sed
checking for gawk... gawk
checking for libatomic support... yes
checking for libcilkrts support... yes
checking for libitm support... yes
checking for libsanitizer support... yes
checking for libvtv support... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking whether g++ accepts -static-libstdc++ -static-libgcc... no
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16 $$f1 $$f2
checking for objdir... .libs
configure: WARNING: using in-tree ISL, disabling version check

一般情况下, 就这样gcc就可以编译完成了。 但是因为我这台机器是单核1G没有swap区, 所以我遇到了下面的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 排版有点错乱惹...
build/vec.o
build/min-insn-modes.o
build/gensupport.o
build/print-rtl.o
build/read-md.o
build/errors.o ../build-x86_64-unknown-linux-gnu/libiberty/libiberty.a
build/genattrtab ../../gcc-5.2.0/gcc/common.md ../../gcc-5.2.0/gcc/config/i
386/i386.md insn-conditions.md \
-Atmp-attrtab.c -Dtmp-dfatab.c -Ltmp-latencytab.c
make[3]: *** [s-attrtab] 已杀死
make[3]: Leaving directory `/home/tao/gcc-build-5.0.2/gcc'
make[2]: *** [all-stage1-gcc] 错误 2
make[2]: Leaving directory `/home/tao/gcc-build-5.0.2'
make[1]: *** [stage1-bubble] 错误 2
make[1]: Leaving directory `/home/tao/gcc-build-5.0.2'
make: *** [all] 错误 2

大致查了下,是因为没有swap区的原因,根据这篇 得到的解决办法是:

1
2
3
4
SWAP=/tmp/swap
dd if=/dev/zero of=$SWAP bs=1M count=500
mkswap $SWAP
sudo swapon $SWAP

之后就是gcc 的编译时间了, 这个时间可以去写写代码补个番啥的。这台机器只是平时拿来玩的,配置炒鸡低。编译gcc从17:20开始,一直到20:09停止。(期间我去补番啦 2333)

1
2
3
4
5
6
7
8
9
10
11
# 只会执行下面的命令
make
make install
# 切换gcc到新版本
update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc-5.0.2 66
# 我重新ssh登录后才看到更新生效的
gcc --version
gcc (GCC) 5.2.0
Copyright © 2015 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。

升级Python

CentOS上默认的Python对于之后要安装的scons来说,还是版本太低。再次上Python 官网 (官网真是个好地方2333)下载Python2.7的源码
编译过很多次了, 就只写主要的东西了

1
2
3
4
5
6
7
8
9
10
xz -d python-2.7.10.tar.xz
tar -xvf python-2.7.10.tar && cd python-2.7.10
# 对于这次编译MongoDB来说,一定需要安装的是bzip2依赖
yum install -y bzip2-devel
# 编译
./configure --prefix=/usr/local/python2.7
make
make install
# 更新
update-alternatives --install /usr/bin/python python /usr/local/bin/python 69

安装scons

官网上找到源码包直接安装

1
2
3
4
5
# 依赖解决
yum install pcre-devel python-devel
# 解压安装
tar -zxvf scons-2.3.6.tar.gz && cd scons-2.3.6
python setup.py install

编译安装MongoDB

最后的安装过程就不是这篇里面的重点了, 遇到的一个坑是:

1
Initializer* _theGlobalInitializer = &getGlobalInitializer();

有这样的报错信息。 查了一下,根据这篇只要在构建的时候,加上--disable-warnings-as-errors就可以解决了

1
2
scons all --disable-warnings-as-errors
# 其他的设置可以查看scons的相关文档

本篇的重点是编译的过程,后续MongoDB配置部分抽空再写。全文完。