Redhat环境下编译安装bazel##

作者:Jack47

目前Google Bazel没有提供各个操作系统下的二进制安装包,只提供源代码,需要我们自己编译安装,详情可以见我翻译的中文版Google Bazel FAQ。Google Bazel官方安装文档在这里,里面只介绍了在Ubuntu(14.04,14.10)和Mac OS X下的编译安装。而我们公司的构建机器是Redhat Linux系列,在编译Bazel的时候遇到了很多问题,在这里跟大家分享下解决思路和方法,为了照顾像作者这样的小白,文章写的稍微有点啰嗦,见谅。

编译##

我编译Bazel的系统环境配置是:

系统环境###

操作系统:Redhat Enterprise 5.7
内核版本:2.6.32-220
gcc: 4.1.2

后来发现需要JDK 1.8, 支持C++ 11的编译器才可以顺利编译Bazel,下文会介绍如何安装这些依赖。

下载代码###

$ git clone https://github.com/google/bazel/

编译###

直接执行./compile.sh脚本来编译Bazel

$ ./compile.sh

报错:

Package libarchive was not found in the pkg-config search path.
Perhaps you should add the directory containing 'libarchive.pc' to the PKG_CONFIG_PATH environment variable
No package 'libarchive' found`

可以看到提示是 libarchive 包不在PKG_CONFIG_PATH下。利用Redhat Linux下的包管理工具yum查看到底安装了这个包没有:

$ rpm -qa | grep libarchive

发现就没有安装这个包,于是进行安装。libarchive是一个支持多种格式的档案和压缩的库。

安装libarchive###

从官方网站下载最新版本的 libarchive :

$ wget http://libarchive.org/downloads/libarchive-3.1.2.tar.gz

解压缩得到源码:

$ gunzip libarchive-3.1.2.tar.gz
$ tar libarchive-3.1.2.tar

然后通过查看libarchive-3.1.2目录下的 INSTALL 文件,找到编译安装方法:

编译:

$ ./configure
$ make

安装[需要管理员权限]:

$ sudo make install

此时再次执行Bazel的编译脚本:

$ ./compile.sh

发现还是跟没安装之前报一样的错误:

Package libarchive was not found in the pkg-config search path.
Perhaps you should add the directory containing 'libarchive.pc' to the PKG_CONFIG_PATH environment variable
No package 'libarchive' found

提示是说在pkg-config的搜索路径下找不到 libarchive 这个包,需要把libarchive.pc这个文件的路径添加到PKG_CONFIG_PATH这个环境变量里。回过头查看 libarchive 的安装过程中打印出的信息,可以看到:

/usr/bin/install -c -m 644 build/pkgconfig/libarchive.pc '/usr/local/lib/pkgconfig

发现libarchive.pc是安装到了 /usr/local/lib/pkgconfig 目录下。

于是设定环境变量PKG_CONFIG_PATH:

$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

再编译Bazel,发现又出错了:

JDK version is lower than 1.8, please set $JAVA_HOME.

是jdk的版本不对,看了一下当前环境下的java版本:

$ java -version
java version "1.6.0_20"

安装jdk 1.8###

从Oracle官网下载jdk1.8, 由于我的机器是x86架构,64位机器,于是下载这个版本。如果直接 wget 会失败,需要在网页里同意License才可以下载,所以从浏览器中下载jdk1.8。如果是远程登录到服务器,可以在本地下载,然后使用scp命令上传到服务器:

$scp jdk-8u45-linux-x64.rpm usename@hostname:~/

安装####

$ sudo rpm -ivh jdk-8u45-linux-x64.rpm

bazel需要通过环境变量$JAVA_HOME来得到jdk的安装路径。而jdk rpm安装包不会自动帮助我们设置环境变量JAVA_HOME,需要我们自己设置。

设置JAVA_HOME####

很奇怪,安装后包名称变了,使用如下rpm命令查看安装后jdk 1.8的包名称:

$ rpm -qa | grep jdk
jdk1.8.0_45-1.8.0_45-fcs

查看这个包中文件都安装到哪些路径下了:

$ rpm -ql jdk1.8.0_45-1.8.0_45-fcs

发现安装到/usr/java/jdk1.8.0_45/这个目录下去了。

于是设置JAVA_HOME:

$ export JAVA_HOME=/usr/java/jdk1.8.0_45/

查看JAVA_HOME是否设置正确:

$ echo $JAVA_HOME
/usr/java/jdk1.8.0_45/

可以看到确实设置成功了。

再次编译Bazel,终于看到编译的输出了:

$ ./compile.sh
Compiling Java stubs for protocol buffers...
Compiling Bazel Java code...
Extracting helper classes for Bazel Java...
Creating libblaze.jar...
Compiling SingleJar tool code...
Extracting helper classes for SingleJar tool...
Creating SingleJar_deploy.jar...
Compiling JavaBuilder tool code...
Extracting helper classes for JavaBuilder tool...
Creating JavaBuilder_deploy.jar...
Compiling client .cc files...
cc1plus: error: unrecognized command line option "-std=c++0x"

看起来是不支持这个选项: "-std=c++0x"。

如何查看到底./compile.sh这个脚本执行了哪些语句,到底是哪条命令失败了?编辑这个shell脚本,在开头写入set命令

set -x

然后再次运行Bazel编译,此时可以看到 ./compile.sh 脚本的每一行命令。最终出错误的命令是:

g++ -I. -std=c++0x -c '-DBLAZE_JAVA_CPU="k8"' -DBLAZE_OPENSOURCE=1 -o output/objs/blaze_startup_options.cc.o src/main/cpp/blaze_startup_options.cc

看起来是 g++ 不支持 c++0x标准。上网搜了一下,发现gcc 4.6以上的版本才支持 C++ 11。怎么在Redhat Linux下安装更高版本的gcc呢?

上网搜索后,发现Red Hat Enterprise Linux下有开发工具套件 devtoolset,可以方便的安装各个版本的gcc,而且是可以多个版本并存的,方便的解决了我等小白在源码编译、安装gcc时可能出现的问题。但官方的那一套东西,需要付费,而公司的这个Red Hat版本不支持。后来发现Redhat Linux的社区版本--Centos下有人已经构建好了Redhat Developer Toolset的相关rpm包,参照此文来进行devtoolset的安装。

$ sudo wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo
$sudo yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++

安装完成后,使用scl命令在shell环境中启用devltoolset-2

$ scl enable devtoolset-2 bash

然后验证此时gcc的版本:

$ gcc -v

可以看到此时已经是gcc 4.8.2版本了。有兴趣的同学可以查看一下enable这个脚本的实现,非常简洁,会让你收获一些东西,路径是:/opt/rh/devtoolset-2/

再次编译Bazel,发现又出错了:

src/main/tools/namespace-sandbox.c: In function ‘main’:
src/main/tools/namespace-sandbox.c:140:36: error: ‘CLONE_NEWUTS’ undeclared (first use in this function) CHECK_CALL(unshare(CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWUSER));

在网上看到unshare这个函数的CLONE_NEWUTS参数在我的这个系统版本里2.6.32 里面应该是已经支持了得。后来发信给bazel邮件组求助,他们说是我得系统内核版本太老了,不支持namespace,让我把namespace-sandbox的编译去掉,不影响正常功能。

于是注释掉,sandbox的编译:

#if [[ $PLATFORM == "linux" ]]; then
# log "Compiling sandbox..."
# "${CC}" -o output/namespace-sandbox -std=c99 src/ main/tools/namespace-sandbox.c
#fi`

再次编译,编译终于成功了!

Build successful! Binary is here: /home/jack47/bazel/output/bazel

明天如果把bug修完了,会更新一篇如何上手bazel的文章,大家周末愉快!

后记:

其实我在搞明白可以简单的使用devltoolset来安装高版本的gcc之前,自己源码编译,安装gcc后,遇到了一些稀奇古怪的错误,比如系统头文件里的某些宏没有定义,libstdc++中找不到GLIBCXX_3.4.20等,还是花了好几天时间在上面的。所以读者朋友们,你们是幸福的啊,按照我的这篇文章,半天时间怎么着也能编译出Bazel来。

做个调查,C++程序员,你能分清楚这几个名词之间的区别和联系吗?不清楚的默默给我点下文章右下角的“推荐”按钮吧,哈哈。其实我写这篇文章之前也不太清楚glibc和libstdc++这两个东东的:)

GCC

glibc

libstdc++

参考资料:

  1. Redhat Developer toolset的介绍:很有意思,解释了这套工具解决的问题,背后的原理等
  2. Google软件构建工具Bazel原理及使用方法介绍

Redhat环境下编译安装Google Bazel的更多相关文章

  1. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  2. centos7.6环境下编译安装tengine-2.2.2的编译安装

    centos7.6环境下编译安装tengine-2.2.2的编译安装 .获取tengine2..2的源码包 http://tengine.taobao.org/download/tengine-2.2 ...

  3. Ubuntu16.04LTS 环境下编译安装Xen

    一.编译安装xen4.6过程 操作系统使用ubuntu16.04,通过下载xen4.6的源代码并编译安装来创建xen4.6环境. 一.依赖包的安装 sudo apt-get install gcc m ...

  4. Ubuntu1604环境下编译安装mariadb10.2.26

    环境准备:阿里云ecs Ubuntu1604下,编译安装mariadb10-2.26 1.先安装一些初试环境所需要的工具软件包 apt install -y iproute2 ntpdate tcpd ...

  5. 在centos环境下编译安装myrocksdb

    rocksdb(https://rocksdb.org.cn/)是脸书(facebook)公司开源的一个key-value存储引擎,基于leveldb开发.rocksdb使用的是LSM存储引擎,纯c+ ...

  6. Redhat5.8 环境下编译安装 Redis 并将其注册为系统服务

    系统环境: $ cat /etc/issueRed Hat Enterprise Linux Server release 5.8 (Tikanga)Kernel \r on an \m 1. 下载安 ...

  7. centos7.5环境下编译安装php7.0.30并安装redis和mongo扩展

    .安装php7..30的脚本 # vim install_php.sh #!/bin/bash # 安装基本依赖 yum install -y gcc gcc-c++ htop telnet ioto ...

  8. Apache-rhel5.8环境下编译安装

    Apache安装过程 Step 1:安装包gcc或gcc-c++# yum install gcc#yum install gcc-c++ Step 2:安装包APR和APR-Utilapr-1.4. ...

  9. CentOS6.5下编译安装LAMP环境

    LAMP(Linux-Apache-MySQL-PHP)网站架构是目前国际流行的Web框架.该框架能够满足大流量.大并发量的网站需求:当然.也可以直接使用高性能的服务器.高性能的负载均衡硬件以及CDN ...

随机推荐

  1. 用python DIY一个图片转pdf工具并打包成exe

    最近因为想要看漫画,无奈下载的漫画是jpg的格式,网上的转换器还没一个好用的,于是乎就打算用python自己DIY一下: 这里主要用了reportlab.开始打算随便写几行,结果为若干坑纠结了挺久,于 ...

  2. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  3. fullPage.js学习笔记

    中秋节,一个人呆着,挺无聊的,还是学习最有趣,不论是什么,开阔视野都是好的. 参考网址:http://www.dowebok.com/77.html  上面有详细介绍及案例展示,很不错哦,可以先去看看 ...

  4. ubuntu14.04 安装 搜狗输入法

    1.安装或者更新fcitx libssh2-1:sudo  apt-get install fcitx libssh2-1; 2.搜索是否安装成功: dpkg -l | grep fcitx ; dp ...

  5. javascript的对象

    简介: JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等.在 JavaScript 中,对象是拥有属性和方法的数据. 一.对象的类型 本地对象:就是ECMA定义好的一些对象, ...

  6. java-并发-同步

    浏览以下内容前,请点击并阅读 声明 线程间的通信主要是通过访问以及对象引用字段,这种形式的通信非常高效,但是会产生两种可能的错误:线程干扰和内存一致性错误,反正这些错误的工具就是同步. 然而,同步可能 ...

  7. EF DbContext 并发执行时可能出现的问题

    现在许多Web项目都使用了IOC的DI注入组件.其中对象的生命周期管理是非常重要的. 有时我们为了提高请求的响应,经常在请求线程中执行多个子线程,然而忽略了EF的DbContext的生命周期管理. D ...

  8. Linux基础命令-有关于目录的命令

    1. 查看帮助: [root@oracle ~]# man cd //查看 cd 指令的帮助文档 2. 显示当前工作目录: [root@oracle ~]# pwd/root 3. 列出当前目录下的内 ...

  9. 转行|如何成为企业想要的Android工程师

    没经验 一来没钱 二来没时间 三来投简历没人要 四来就算忽悠进去了,也做不了,亚历山大,迟早被踢 1.做好手上的工作 不要裸辞 忌讳心猿意马的心态,当有两个选择的时候,往往 所以要专注于当下手头上唯一 ...

  10. mycat入门教程

    github https://github.com/MyCATApache/Mycat-Server myCat介绍 myCat的诞生,要从其前身Amoeba和Cobar说起. Amoeba(变形虫) ...