交叉编译详解 三 使用脚本自动生成交叉编译链
来源:互联网 发布:js文本框提示信息 编辑:程序博客网 时间:2024/06/06 00:27
简介
鉴于从零制作交叉编译链的命令异常繁杂,很容易因为某个细节出现错误。因此,我将自己创建交叉编译链的步骤写成了脚本,如果大家自己搭建时出现错误,可以直接使用脚本进行创建,以此来确定是自己的步骤有问题还是环境差异造成的。
总共有三个脚本,使用说明和脚本源码见后文:
- toolchain_mkpj.sh 用于创建编译工程目录
- toolchain_build.sh 用于编译交叉工具链
- toolchain_config.lst 配置文件(如果需要定制特殊的交叉编译链可以修改这个文件)
安装host工具
sudo apt-get install libncurses5-devsudo apt-get install gperfsudo apt-get install bisonsudo apt-get install flexsudo apt-get install texinfosudo apt-get install help2mansudo apt-get install gawk楚这三个参数的配置意义
注意:这只是我遇到的需要安装的工具,在编译过程中如果缺了什么工具,请自行安装。
建立SDK工程
按照下列目录结构建立 Develop 文件夹和子目录,并上传脚本文件,顶层目录名字 Develop 可以自由修改。
- script: 编译脚本所在目录
- source: 工具链的源码包所在目录(如果没有源码也不用担心,脚本会自动下载)
注意:如果是通过windows上传脚本,记得使用dos2unix命令进行格式转换。
Develop/ ├── script │ ├── toolchain_build.sh │ ├── toolchain_config.lst │ └── toolchain_mkpj.sh └── source
创建编译工程
$ ./toolchain_mkpj.sh ../../toolchain[INFO] ../../toolchain is not exist, create it[INFO] pkg: binutils-2.27.tar.bz2 is exist, Copy it[INFO] pkg: gcc-5.4.0.tar.bz2 is exist, Copy it[INFO] pkg: glibc-2.23.tar.bz2 is exist, Copy it[INFO] pkg: linux-4.4.25.tar.xz is exist, Copy it../../toolchain├── build├── script│ ├── toolchain_build.sh│ └── toolchain_config.lst├── setup│ ├── binutils-2.27.tar.bz2│ ├── gcc-5.4.0.tar.bz2│ ├── glibc-2.23.tar.bz2│ └── linux-4.4.25.tar.xz├── src└── tool-chain5 directories, 6 files
配置编译参数
进入编译目录并修改配置文件(后续的命令都在该目录下操作)
$ cd ../../toolchain/script/$ vi toolchain_config.lst export PRJROOT=$1 # [不修改] 工程目录名,自动适配export TARGET=arm-none-linux-gnueabi # [可修改] 目标编译器名称export PREFIX=${PRJROOT}/tool-chain # [不修改] 当运行 make install 时的安装目录export TARGET_PREFIX=${PREFIX}/${TARGET} # [不修改]export PATH=${PREFIX}/bin:${PATH} # [不修改] 将新生成的GCC所在目录加入环境变量。脚本执行完毕后恢复export ARCH=arm # [可修改] 需要编译的架构export BINUTILS_VERSION=binutils-2.27 # [可修改] binutils版本export GCC_VERSION=gcc-5.4.0 # [可修改] gcc版本export GLIBC_VERSION=glibc-2.23 # [可修改] glibc版本export KERNEL_VERSION=linux-4.4.25 # [可修改] kernel版本
编译和结果
$ ./toolchain_build.sh
等着吧,如果没问题1个小时左右就编译好了(不同的设备可能编译时间有很大差别),如果有问题,可以给我留言。
Good Luck :)
最终的编译链放在 toolchain/tool-chain 中。
源码
#!/bin/bash# Name: toolchain_mkpj.sh# Author: Peter Peng# Ver: 0.1set -eProjectDir=""function Usage{ echo "usage: `basename $0` [DIR]" echo "Create a toolchain project." echo ""}function ProjectMkdir{ if [ ! -d $ProjectDir ]; then echo "[INFO] $ProjectDir is not exist, create it" mkdir $ProjectDir else echo "[INFO] $ProjectDir is exist" fi [ ! -d $ProjectDir/script ] && mkdir $ProjectDir/script [ ! -d $ProjectDir/setup ] && mkdir $ProjectDir/setup [ ! -d $ProjectDir/src ] && mkdir $ProjectDir/src [ ! -d $ProjectDir/build ] && mkdir $ProjectDir/build [ ! -d $ProjectDir/tool-chain ] && mkdir $ProjectDir/tool-chain cp toolchain_build.sh $ProjectDir/script cp toolchain_config.lst $ProjectDir/script}function SourceSetup{ local src=`pwd`/../source local dest=$PRJROOT/setup if [ -f $src/$BINUTILS_VERSION.tar.bz2 ]; then echo "[INFO] pkg: $BINUTILS_VERSION.tar.bz2 is exist, Copy it" cp $src/$BINUTILS_VERSION.tar.bz2 $dest else echo "[INFO] pkg: $BINUTILS_VERSION.tar.bz2 is not exist, Download it" cd $dest wget http://ftp.gnu.org/gnu/binutils/$BINUTILS_VERSION.tar.bz2 cd - > /dev/null fi if [ -f $src/$GCC_VERSION.tar.bz2 ]; then echo "[INFO] pkg: $GCC_VERSION.tar.bz2 is exist, Copy it" cp $src/$GCC_VERSION.tar.bz2 $dest else echo "[INFO] pkg: $GCC_VERSION.tar.bz2 is not exist, Download it" cd $dest wget http://ftp.gnu.org/gnu/gcc/$GCC_VERSION/$GCC_VERSION.tar.bz2 cd - > /dev/null fi if [ -f $src/$GLIBC_VERSION.tar.bz2 ]; then echo "[INFO] pkg: $GLIBC_VERSION.tar.bz2 is exist, Copy it" cp $src/$GLIBC_VERSION.tar.bz2 $dest else echo "[INFO] pkg: $GLIBC_VERSION.tar.bz2 is not exist, Download it" cd $dest wget ftp://ftp.gnu.org/gnu/glibc/$GLIBC_VERSION.tar.bz2 cd - > /dev/null fi if [ -f $src/$KERNEL_VERSION.tar.xz ]; then echo "[INFO] pkg: $KERNEL_VERSION.tar.xz is exist, Copy it" cp $src/$KERNEL_VERSION.tar.xz $dest else echo "[INFO] pkg: $KERNEL_VERSION.tar.xz is not exist, Download it" cd $dest wget https://www.kernel.org/pub/linux/kernel/v4.x/$KERNEL_VERSION.tar.xz cd - > /dev/null fi}#------------------------------------------------------------------------------------------# main#------------------------------------------------------------------------------------------if [ $# != 1 ]; then Usage exit 1; fiProjectDir=$1source toolchain_config.lst $ProjectDirProjectMkdirSourceSetupecho ""tree -L 2 $ProjectDir
#!/bin/bash# Name: toolchain_config.lst# Author: Peter Peng# Ver: 0.1export PRJROOT=$1export TARGET=arm-none-linux-gnueabiexport PREFIX=${PRJROOT}/tool-chainexport TARGET_PREFIX=${PREFIX}/${TARGET}export PATH=${PREFIX}/bin:${PATH}export ARCH=armexport BINUTILS_VERSION=binutils-2.27export GCC_VERSION=gcc-5.4.0export GLIBC_VERSION=glibc-2.23export KERNEL_VERSION=linux-4.4.25
#!/bin/bash# Name: toolchain_build.sh# Author: Peter Peng# Ver: 0.1set -ePWD_DIR=`pwd`ROOT_DIR=`dirname $PWD_DIR`SETUP_DIR=$ROOT_DIR/setupBUILD_DIR=$ROOT_DIR/buildSRC_DIR=$ROOT_DIR/srcSCRIPT_DIR=$ROOT_DIR/scriptfunction BinutilsBuild{ echo "[INFO] $BINUTILS_VERSION build begin" if [ ! -d $SRC_DIR/$BINUTILS_VERSION ]; then cd $SRC_DIR echo "[DEBUG] $BINUTILS_VERSION: uncompress tar.bz2" tar -jxf $SETUP_DIR/$BINUTILS_VERSION.tar.bz2 cd - > /dev/null fi if [ ! -d $BUILD_DIR/$BINUTILS_VERSION ]; then mkdir $BUILD_DIR/$BINUTILS_VERSION fi cd $BUILD_DIR/$BINUTILS_VERSION echo "[DEBUG] $BINUTILS_VERSION: configure" sh $SRC_DIR/$BINUTILS_VERSION/configure --target=$TARGET --prefix=$PREFIX --disable-nls --enable-shared echo "[DEBUG] $BINUTILS_VERSION: make" make echo "[DEBUG] $BINUTILS_VERSION: make install" make install cd - > /dev/null echo "[INFO] $BINUTILS_VERSION build succeed"}function GCCBuild_BOOTSTRAP{ echo "[INFO] $GCC_VERSION build bootstrap begin" if [ ! -d $SRC_DIR/$GCC_VERSION ]; then cd $SRC_DIR echo "[DEBUG] $GCC_VERSION: uncompress tar.bz2" tar -jxf $SETUP_DIR/$GCC_VERSION.tar.bz2 cd $GCC_VERSION ./contrib/download_prerequisites fi if [ ! -d $BUILD_DIR/"$GCC_VERSION"_bootstrap ]; then mkdir $BUILD_DIR/"$GCC_VERSION"_bootstrap fi cd $BUILD_DIR/"$GCC_VERSION"_bootstrap echo "[DEBUG] $GCC_VERSION: configure" sh $SRC_DIR/$GCC_VERSION/configure --target=$TARGET --prefix=$PREFIX --disable-shared --disable-threads --without-headers --disable-libmudflap --enable-languages=c,c++ --disable-nls echo "[DEBUG] $GCC_VERSION: make all-gcc" make all-gcc echo "[DEBUG] $GCC_VERSION: make install-gcc" make install-gcc echo "[DEBUG] $GCC_VERSION: make all-target-libgcc" make all-target-libgcc echo "[DEBUG] $GCC_VERSION: make install-target-libgcc" make install-target-libgcc cd - > /dev/null echo "[INFO] $GCC_VERSION build bootstrap succeed"}function GIBCBuild{ echo "[INFO] $GLIBC_VERSION build begin" if [ ! -d $SRC_DIR/$GLIBC_VERSION ]; then cd $SRC_DIR echo "[DEBUG] $GLIBC_VERSION: uncompress tar.bz2" tar -jxf $SETUP_DIR/$GLIBC_VERSION.tar.bz2 cd - > /dev/null fi if [ ! -d $BUILD_DIR/$GLIBC_VERSION ]; then mkdir $BUILD_DIR/$GLIBC_VERSION fi cd $BUILD_DIR/$GLIBC_VERSION echo "[DEBUG] $GLIBC_VERSION: configure" sh $SRC_DIR/$GLIBC_VERSION/configure --host=$TARGET --prefix=$PREFIX/$TARGET --with-tls --disable-profile --enable-add-ons --with-headers=$PREFIX/$TARGET/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yes --disable-nls echo "[DEBUG] $GLIBC_VERSION: make" make CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib echo "[DEBUG] $GLIBC_VERSION: make install" make install cd - > /dev/null echo "[INFO] $GLIBC_VERSION build succeed"}function GCCBuild{ echo "[INFO] $GCC_VERSION build begin" if [ ! -d $BUILD_DIR/$GCC_VERSION ]; then mkdir $BUILD_DIR/$GCC_VERSION fi cd $BUILD_DIR/$GCC_VERSION echo "[DEBUG] $GCC_VERSION: configure" sh $SRC_DIR/$GCC_VERSION/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --enable-shared --disable-nls echo "[DEBUG] $GCC_VERSION: make" make echo "[DEBUG] $GCC_VERSION: make install" make install cd - > /dev/null echo "[INFO] $GCC_VERSION build succeed"}function InstallKernelHeaders{ echo "[INFO] $KERNEL_VERSION install headers begin" if [ ! -d $SRC_DIR/$KERNEL_VERSION ]; then cd $SRC_DIR echo "[DEBUG] $KERNEL_VERSION: uncompress tar.xz" tar -xf $SETUP_DIR/$KERNEL_VERSION.tar.xz cd - > /dev/null fi cd $SRC_DIR/$KERNEL_VERSION echo "[DEBUG] $KERNEL_VERSION: make headers_install" make ARCH=$ARCH CROSS_COMPILE=$TARGET- INSTALL_HDR_PATH=$PREFIX/$TARGET headers_install cd - > /dev/null echo "[INFO] $KERNEL_VERSION install headers succeed"}#------------------------------------------------------------------------------------------# main#------------------------------------------------------------------------------------------source toolchain_config.lst $ROOT_DIRBinutilsBuildInstallKernelHeadersGCCBuild_BOOTSTRAPGIBCBuildGCCBuild
0 0
- 交叉编译详解 三 使用脚本自动生成交叉编译链
- arm 交叉编译工具链 生成脚本
- 自动交叉编译 gdb-7.9 脚本
- crosstool-ng 编译生成交叉编译链
- 交叉编译详解 二 从零制作交叉编译链
- 交叉编译详解
- 交叉编译详解
- arm交叉编译详解
- arm交叉编译详解
- PowerPC 交叉编译工具链 创建脚本
- 交叉编译工具使用
- 交叉编译使用libjpeg
- 使用android ndk交叉编译libx264的编译脚本
- iOS 通用交叉编译脚本
- 三、搭建交叉编译平台
- 交叉编译工具链
- 交叉编译工具链
- 建立交叉编译链
- opencv学习笔记(十四)图像金字塔
- HTTP返回码
- MySQL binlog 组提交与 XA(两阶段提交)
- Windows平台下,将mdb文件快速向MySQL中导入数据的方法
- java学习之路 之 基本语法-程序流程控制-(if-else)语句练习题
- 交叉编译详解 三 使用脚本自动生成交叉编译链
- 两阶段提交协议与三阶段提交协议
- 机器学习入门之基本概念
- MXNet 中文教程:图像分类
- 分布式事务 - 两阶段提交与三阶段提交
- CSS学习笔记:border-image
- android mvp模式
- Surrounded Regions
- 一分钟了解两阶段提交2PC(运营MM也懂了)