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. PyQt5+Python3.5.2-32bit开发环境搭建

      1.基本环境. Window 8.1 64bit Python3.5.2-32bit.exe PyQt5 2.安装python. 去官网下载32位版本的python3.5.2(就是x86那个) 备 ...

  2. JDK7和JDK8一些重要新特性

    jdk7新特性(部分) switch支持字符串 List AutoCloseable接口实现自动关闭,在try()中 新增获取环境信息的工具方法,getJavaHomeDir,getUserHomeD ...

  3. Python-内置函数小结

    内建函数,Python内置的函数(build in function),不需要引用其他包,一般成为BIF   abs() 计算绝对值,abs(-10),接收number,返回一个number   ma ...

  4. web适配问题

    bootstrap模板为使IE6.7.8版本(IE9以下版本)浏览器兼容html5新增的标签,引入下面代码文件即可. <script src="https://oss.maxcdn.c ...

  5. Eclipse 调试Bug之使用断点的七大技巧

    原文链接:http://xiaohuafyle.iteye.com/blog/1705494 调试竟然有这么多技巧,亏我以前竟不知道...   Eclipse这个开发工具为我们调试bug提供了非常便利 ...

  6. Beginning Scala study note(4) Functional Programming in Scala

    1. Functional programming treats computation as the evaluation of mathematical and avoids state and ...

  7. 对于挑战书上的很久之前都看不懂的DP看懂的突破

    突破一..牢记问题概念 并且牢记dp状态方程 突破二..一直有一个求和dp转化成O1dp递推的式子看不懂.. 看不懂的原因是..没有分清求和符号作用的范围 提醒:以后遇到求和符号一定明确其求和的式子的 ...

  8. 改变按钮在iPhone下的默认风格

    -webkit-appearance: none; "来改变按钮在iPhone下的默认风格,其实我们可以反过来思路,使用"appearance"属性,来改变任何元素的浏览 ...

  9. XE2 IntraWeb尝试

    新建--选择--确定 简单放几个控件在TIWForm1上面,运行,生成一个项目服务器:    复制 URL  http://127.0.0.1:8888/$/start 打开网页.

  10. ipad上自定义view的旋转适配

    ios8横屏时宽高会自动转换,但是ios7不是 CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width; CGFloat scree ...