Linux软件移植configure配置、实战
早期Unix/Linux的软件开发并没有一套统一的预编译标准,从原始代码到目标程序完全是开发人员一行一行敲键盘出来的,这个过程中的产生的代码bug及人工debug,非常耗时,效率极低。后来,Unix社区的广大程序员群体开发出autoconf、automake、libtool等工具,约定了一套configure规则,方便Unix/Linux软件的传播。GNU组织逐渐将其形成了GNU软件发布通用配置,现今绝大多数遵循该规则的开源软件源码包内都含有configure、INSTALL、install-sh、Makefile这几个脚本文件,少数只含有configure.ac、Makefile.am、Makefile.in的源码包,需要运行autoconf等工具生成configure、Makefile等脚本后,才可进行configure预编译配置。
configure的目的,是让使用人员根据需求来定制目标软件,Unix/Linux软件的灵活性就充分体现出来了。软件的功能特性(Optional features)、子项目组件(Optional packages),在预编译阶段指定enable/disable-FEATURE(使能、禁用)、with/without-PACKAGE(包含、不包含)等参数,通过configure脚本生成Makefile,最后进入make正式编译阶段。
下面通过实战项目来体会Unix/Linux开源软件的定制、编译。开始前,我们先来搭建好编译环境:
编译环境:
宿主机系统:Windows 7 x64 + VM VirtualBOX-6.0.18 + Ubuntu 16.04 LTS x32
编译器GCC:gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609 (native-compile)
mips-unknown-linux-uclibc-gcc (Buildroot 2011.11) 4.6.2 (cross-compile)
更改系统shell:dash 更改为 bash
sudo dpkg-reconfigure dash
实战项目:binutils源码编译
一、同构编译native-compile
1、下载源码并解压:http://mirrors.ustc.edu.cn/gnu/binutils/binutils-2.21.1.tar.bz2 (中国科技大学开源镜像站)
cd ~
mkdir -p src/build && cd src
wget http://mirrors.ustc.edu.cn/gnu/binutils/binutils-2.21.1.tar.bz2
tar -xf binutils-2.21.1.tar.bz2
cd build/
2、安装依赖库
sudo apt-get install build-essential bison flex m4 texinfo libgmp-dev libmpc-dev libmpfr-dev ppl-dev libppl-dev cloog-ppl libcloog-ppl-dev
3、configure配置
# 链接库方式:dynamically linked
../binutils-2.21.1/configure --disable-werror --prefix=/usr LDFLAGS="-s"
# 链接库方式:statically linked
../binutils-2.21.1/configure --disable-werror --prefix=/usr LDFLAGS="--static -s"
说明:小型GNU开源软件可以在源码目录内直接配置、编译,中、大型GNU开源软件不要在源码目录内配置、编译,尤其是GCC工具链编译,这个Note在GCC构建说明文档中特别提及。
4、编译、安装
make && make install DESTDIR=`pwd`/123-i386
说明:编译完成生成的目标程序,默认工作目录就是“--prefix=/usr”指定的/usr,本实例中指定安装到DESTDIR=`pwd`/123-i386,方便进行二进制binary程序打包。
二、交叉编译cross-compile
1、清理目录(如果直接cross-compile,可略过此步)
make distclean
说明:如果直接cross-compile,务必安装必要的依赖库。
2、设置交叉编译环境变量
export PATH=/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21/usr/bin:$PATH
说明:这里的PATH指定了你的cross-gcc工具链路径,优先于系统原PATH
3、configure配置
# 链接库方式:dynamically linked
../binutils-2.21.1/configure --host=mips-unknown-linux-uclibc --disable-werror --prefix=/usr LDFLAGS="-s"
# 链接库方式:statically linked
../binutils-2.21.1/configure --host=mips-unknown-linux-uclibc --disable-werror --prefix=/usr LDFLAGS="--static -s"
说明:参数--host=mips-unknown-linux-uclibc让配置configure识别cross-gcc,实现交叉编译。
4、编译、安装
make && make install DESTDIR=`pwd`/123-mips
后记:交叉编译有时候要引用额外的库,此时您需要指定库的路径(-Ipath、-Lpath,独立引用,不会污染cross-gcc工具链),本文暂不讨论。