update_engine模块移植到linux平台
2017-03-02 17:45
417 查看
update_engine是google提供的一个升级模块,对于linux的平台,我们可以移植到我们的嵌入式平台,通过update_engine模块对系统升级,最近由于工作需要,在linux平台上面移植一下,其中遇到了很多问题,在不停的寻找答案中,问题都一一解决了,现在分享一下移植的过程,提供给有同样需求的同鞋。
移植过程如下:
1. 获取update_engine的源码
https://github.com/coreos/update_engine。
2. 编译buildroot的代码
source build/envsetup.sh
cd buildroot
make mesona111_xxxxb_defconfig
make
3. 拷贝update_engien代码至buildroot/output/build/
mv update_engine-master update_engine
4. 查看update_engine目录,发现里面没有makefile,只有autogen.sh configure.ac Makefile.am三个文件,我们需要通过这三个文件生成makefile。我们先查看configure.ac:
发现update_engine需要依赖其他的模块,但是我们不确定哪些是已经有的,哪些还没有,我们直接执行,根据错误提示信息,然后把对应的模块添加进来。
5. 生成configure(生成makefile需要的)
./autogen.sh
有如下错误信息:
+ autoreconf --force --install --symlink
Can't exec "libtoolize": No such file or directory at /usr/bin/autoreconf line 196.
Use of uninitialized value in pattern match (m//) at /usr/bin/autoreconf line 196.
configure.ac:4: error: Autoconf version 2.69 or higher is required
configure.ac:4: the top level
autom4te: /usr/bin/m4 failed with exit status: 63
aclocal: /usr/bin/autom4te failed with exit status: 63
autoreconf: aclocal failed with exit status: 63
根据提示信息,是autoconf的版本太低导致的,编译过程我们发现,sdk本身编译出了autoconf工具:
autoconf --version (autoconf (GNU Autoconf) 2.68)
output/host/usr/bin/autoconf --version (autoconf (GNU Autoconf) 2.69)
我们使用buildroot本身编译的工具,
export PATH=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/output/host/usr/bin/:$PATH
然后执行:./autogen.sh 即可生成configure
6. 通过configure生成makefile
由于是使用交叉编译器,所以我们通过--host指定交叉编译器:
./configure --host arm-linux-gnueabihf
错误1: configure: error: *** dbus-binding-tool not found
解决1:在buildroot下面make menuconfig,配置编译dbus-glib
Target package --->
Hardware handing --->
[*] dbus-glib
在下载dbus-glib时,下载失败了,我们修改下载的地址即可
DBUS_GLIB_SITE = http://dbus.freedesktop.org/releases/dbus-glib修改为
DBUS_GLIB_SITE = https://dbus.freedesktop.org/releases/dbus-glib
错误2:configure: error: *** libbz2 not found
解决2:在buildroot下面make menuconfig,配置编译bzip2
Target package --->
Compressors and decompressors --->
[*] bzip2
错误3:configure: error: *** librootdev not found
解决3:由于sdk没有配置编译librootdev,需要我们自己下载对应的源码编译
地址:https://github.com/coreos/seismograph(解压之后放到output/build下面)
cd seismograph
chmod +x autogen.sh
./autogen.sh
./configure --host arm-linux-gnueabihf --prefix=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/
output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr
发现生产makefile过程出错了:No package 'mount' found
我们屏蔽configure.ac里面mount操作:#PKG_CHECK_MODULES([MNT], [mount])
重新执行命令生成makefile,然后make && make install
错误4:configure: error: *** gflags/gflags.h not found
解决4:下载编译libgflags库
地址:https://github.com/gflags/gflags(解压之后放到output/build下面)
cd gflags
mkdir build
cmake -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ .(指定编译器生成makefile)
make
错误5:在解决4中,出错:CMake 2.8.12 or higher is required. You are running version 2.8.7。
意思是说cmake的版本太低。
解决5:下载最新的cmake工具。
地址:https://cmake.org/download/ 选择Unix/Linux Source
cmake-3.8.0-rc1.tar.gz
cd cmake-3.8.0-rc1 (解压之后放到output/build下面)
./configure --prefix=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/output/host/usr/
make && make install
在使用cmake的时候,使用我们最新的cmake工具。
错误6:*** gflags not found
解决6:./configure ac_cv_gflags_namespace=GFLAGS_NAMESPACE --host arm-linux-gnueabihf
错误7:No package 'libglog' found
解决7:下载编译libglog
地址:https://github.com/google/glog(解压之后放到output/build下面)
cd glog-0.3.3
./configure --host arm-linux-gnueabihf --prefix=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/
output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr
make
make install
错误8:No package 'protobuf' found。
解决8:需要下载protobuf的源码编译
地址:https://github.com/google/protobuf (解压之后放到output/build下面)
由于下载google提供的protobuf不再包含gtest的代码,所以还需要下载gtest的代码
地址:https://github.com/google/googletest/archive/release-1.7.0.tar.gz (解压之后放到protobuf)
执行命令:
mv googletest-release-1.7.0 gtest
chmod +x autogen.sh
./autogen.sh
./configure --prefix=/mnt/nfsroot/zhigang.yu/A111_bak_work/buildroot/output/host/usr/
make
make install
错误9: 提示not find 某些.h文件或者库错误。
解决9:寻找这些头文件以及库文件,存放在哪里,把这些头文件及库手动拷贝到/mnt/nfsroot/xxxxx.xx/
A111_bak_work/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr下面即可, 这样使用交叉编译的时候,可以寻找到这些头文件及库。
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
基于这些错误解决之后,即可生成makefile文件了,错误主要是update_engine模块所需要的库找不到导致。
7.make编译
在生成了makefile之后,我们就可以编译update_engine的源码了,在编译update_engine过程,也遇到了一 些错误,然后在网上找了下,发现了很多类似的错误问题。
./src/update_engine/update_metadata.pb.h:17:2: error: #error This file was generated by an older version of protoc
这时由于protoc编译器版本和protobuf头文件不对应的问题,原因就是系统里可能存在多个protoc的版本,但 是protobuf的包含文件可能只有一种,所以就会造成这种问题,回想起之前我们下载了protobuf库编译,同时编译 生成了protoc,这样就有两个protoc了,一个是系统的/usr/bin/protoc,一个是我们编译生成的/mnt/nfsroot/
xxxxx.xx/A111_bak_work/buildroot/output/host/usr/bin/protoc,我们修改makefile,把PROTOC = /usr/bin/protoc
把protoc修改为我们sdk编译的新版本即可
./src/update_engine/certificate_checker.h:11:50: fatal error: gtest/gtest_prod.h: No such file or directory
这个错误是由于update_engine里面需要包含gtest相关的头文件,但是没有找到,我们手动拷贝下即可。
把protobuf-2.6.1/gtest/include/gtest拷贝到output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/include,然 后重新编译即可。
make all即可生成我们需要的update_engine update_engine_client delta_generator可执行bin了
AR libupdate_engine.a
CXX src/update_engine/update_engine_client.o
CXXLD update_engine_client
CXX src/update_engine/generate_delta_main.o
CXXLD delta_generator
CXX src/update_engine/main.o
CXXLD update_engine
8.总结
我们只是需要下载update_engine源码,然后生成编译的makefile, 通过makefile生成我们所要的bin即可,每 个人可能遇到的错误不一样,以上解决方法仅供参考,主要是下载编译所依赖的库,对于有相似需求的,提供移 植参考。
移植过程如下:
1. 获取update_engine的源码
https://github.com/coreos/update_engine。
2. 编译buildroot的代码
source build/envsetup.sh
cd buildroot
make mesona111_xxxxb_defconfig
make
3. 拷贝update_engien代码至buildroot/output/build/
mv update_engine-master update_engine
4. 查看update_engine目录,发现里面没有makefile,只有autogen.sh configure.ac Makefile.am三个文件,我们需要通过这三个文件生成makefile。我们先查看configure.ac:
发现update_engine需要依赖其他的模块,但是我们不确定哪些是已经有的,哪些还没有,我们直接执行,根据错误提示信息,然后把对应的模块添加进来。
5. 生成configure(生成makefile需要的)
./autogen.sh
有如下错误信息:
+ autoreconf --force --install --symlink
Can't exec "libtoolize": No such file or directory at /usr/bin/autoreconf line 196.
Use of uninitialized value in pattern match (m//) at /usr/bin/autoreconf line 196.
configure.ac:4: error: Autoconf version 2.69 or higher is required
configure.ac:4: the top level
autom4te: /usr/bin/m4 failed with exit status: 63
aclocal: /usr/bin/autom4te failed with exit status: 63
autoreconf: aclocal failed with exit status: 63
根据提示信息,是autoconf的版本太低导致的,编译过程我们发现,sdk本身编译出了autoconf工具:
autoconf --version (autoconf (GNU Autoconf) 2.68)
output/host/usr/bin/autoconf --version (autoconf (GNU Autoconf) 2.69)
我们使用buildroot本身编译的工具,
export PATH=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/output/host/usr/bin/:$PATH
然后执行:./autogen.sh 即可生成configure
6. 通过configure生成makefile
由于是使用交叉编译器,所以我们通过--host指定交叉编译器:
./configure --host arm-linux-gnueabihf
错误1: configure: error: *** dbus-binding-tool not found
解决1:在buildroot下面make menuconfig,配置编译dbus-glib
Target package --->
Hardware handing --->
[*] dbus-glib
在下载dbus-glib时,下载失败了,我们修改下载的地址即可
DBUS_GLIB_SITE = http://dbus.freedesktop.org/releases/dbus-glib修改为
DBUS_GLIB_SITE = https://dbus.freedesktop.org/releases/dbus-glib
错误2:configure: error: *** libbz2 not found
解决2:在buildroot下面make menuconfig,配置编译bzip2
Target package --->
Compressors and decompressors --->
[*] bzip2
错误3:configure: error: *** librootdev not found
解决3:由于sdk没有配置编译librootdev,需要我们自己下载对应的源码编译
地址:https://github.com/coreos/seismograph(解压之后放到output/build下面)
cd seismograph
chmod +x autogen.sh
./autogen.sh
./configure --host arm-linux-gnueabihf --prefix=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/
output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr
发现生产makefile过程出错了:No package 'mount' found
我们屏蔽configure.ac里面mount操作:#PKG_CHECK_MODULES([MNT], [mount])
重新执行命令生成makefile,然后make && make install
错误4:configure: error: *** gflags/gflags.h not found
解决4:下载编译libgflags库
地址:https://github.com/gflags/gflags(解压之后放到output/build下面)
cd gflags
mkdir build
cmake -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ .(指定编译器生成makefile)
make
错误5:在解决4中,出错:CMake 2.8.12 or higher is required. You are running version 2.8.7。
意思是说cmake的版本太低。
解决5:下载最新的cmake工具。
地址:https://cmake.org/download/ 选择Unix/Linux Source
cmake-3.8.0-rc1.tar.gz
cd cmake-3.8.0-rc1 (解压之后放到output/build下面)
./configure --prefix=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/output/host/usr/
make && make install
在使用cmake的时候,使用我们最新的cmake工具。
错误6:*** gflags not found
解决6:./configure ac_cv_gflags_namespace=GFLAGS_NAMESPACE --host arm-linux-gnueabihf
错误7:No package 'libglog' found
解决7:下载编译libglog
地址:https://github.com/google/glog(解压之后放到output/build下面)
cd glog-0.3.3
./configure --host arm-linux-gnueabihf --prefix=/mnt/nfsroot/xxxxx.xx/A111_bak_work/buildroot/
output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr
make
make install
错误8:No package 'protobuf' found。
解决8:需要下载protobuf的源码编译
地址:https://github.com/google/protobuf (解压之后放到output/build下面)
由于下载google提供的protobuf不再包含gtest的代码,所以还需要下载gtest的代码
地址:https://github.com/google/googletest/archive/release-1.7.0.tar.gz (解压之后放到protobuf)
执行命令:
mv googletest-release-1.7.0 gtest
chmod +x autogen.sh
./autogen.sh
./configure --prefix=/mnt/nfsroot/zhigang.yu/A111_bak_work/buildroot/output/host/usr/
make
make install
错误9: 提示not find 某些.h文件或者库错误。
解决9:寻找这些头文件以及库文件,存放在哪里,把这些头文件及库手动拷贝到/mnt/nfsroot/xxxxx.xx/
A111_bak_work/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr下面即可, 这样使用交叉编译的时候,可以寻找到这些头文件及库。
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
基于这些错误解决之后,即可生成makefile文件了,错误主要是update_engine模块所需要的库找不到导致。
7.make编译
在生成了makefile之后,我们就可以编译update_engine的源码了,在编译update_engine过程,也遇到了一 些错误,然后在网上找了下,发现了很多类似的错误问题。
./src/update_engine/update_metadata.pb.h:17:2: error: #error This file was generated by an older version of protoc
这时由于protoc编译器版本和protobuf头文件不对应的问题,原因就是系统里可能存在多个protoc的版本,但 是protobuf的包含文件可能只有一种,所以就会造成这种问题,回想起之前我们下载了protobuf库编译,同时编译 生成了protoc,这样就有两个protoc了,一个是系统的/usr/bin/protoc,一个是我们编译生成的/mnt/nfsroot/
xxxxx.xx/A111_bak_work/buildroot/output/host/usr/bin/protoc,我们修改makefile,把PROTOC = /usr/bin/protoc
把protoc修改为我们sdk编译的新版本即可
./src/update_engine/certificate_checker.h:11:50: fatal error: gtest/gtest_prod.h: No such file or directory
这个错误是由于update_engine里面需要包含gtest相关的头文件,但是没有找到,我们手动拷贝下即可。
把protobuf-2.6.1/gtest/include/gtest拷贝到output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/include,然 后重新编译即可。
make all即可生成我们需要的update_engine update_engine_client delta_generator可执行bin了
AR libupdate_engine.a
CXX src/update_engine/update_engine_client.o
CXXLD update_engine_client
CXX src/update_engine/generate_delta_main.o
CXXLD delta_generator
CXX src/update_engine/main.o
CXXLD update_engine
8.总结
我们只是需要下载update_engine源码,然后生成编译的makefile, 通过makefile生成我们所要的bin即可,每 个人可能遇到的错误不一样,以上解决方法仅供参考,主要是下载编译所依赖的库,对于有相似需求的,提供移 植参考。
相关文章推荐
- 将引擎向Linux平台移植
- 基于S3C2410平台USB Host Driver for Linux 2.6移植
- linux 2.6.22.1内核在s3c2410平台的移植
- 在ARM-Linux平台上移植SQLite
- ACE网管平台移植Linux
- 在ARM-Linux平台上移植SQLite
- TL-WN321G (rt73)USB无线网卡驱动在armlinux平台上的移植
- linux 2.6.22.1内核在s3c2410平台的移植
- Linux2.6内核驱动移植(与2.4模块的区别)
- linux 2.6.22.1内核在s3c2410平台的移植
- windows平台开发移植到linux部署注意事项
- 基于S3C2410平台移植Linux 2.6.14内核指南
- 在arm平台下移植linux
- ACE Proactor 框架移植到Linux平台后无法响应events
- 基于S3C2410平台移植Linux 2.6内核指南
- Windows 打印选项设置在 Linux 平台上的一种移植方法
- 基于S3C2410平台的Linux 2.6.14内核+平台驱动的移植指南(最终版)
- ARM Linux平台QTE+tslib移植后感
- linux-2.6.26内核移植到S3C2440平台
- 成功将ICTCLAS分词模块移植到.net平台