cross compile toolchain on ubuntu 2204

bash 复制代码
#!/bin/bash
##-------------------------------------------------------------
## Configuration variables
##-------------------------------------------------------------
root_dir="/home/prometheus/module-test/cross-compile"
target="powerpc-eabi"

clean_install=true

build_binutils=true
build_gcc_static=true
build_newlib=true
build_gcc=true

# gcc dependency
isl_tar_link="ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.15.tar.bz2"
mpfr_tar_link="ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2"
mpc_tar_link="ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz"
gmp_tar_link="ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2"

# use gcc492, confirmed ok
binutils_tar_link="http://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.gz"
#binutils_tar_link="https://ftp.gnu.org/gnu/binutils/binutils-2.39.tar.gz"
#gcc_tar_link="http://mirrors.kernel.org/gnu/gcc/gcc-6.1.0/gcc-4.9.2.tar.gz"
gcc_tar_link="https://mirrors.kernel.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.gz"
newlib_tar_link="ftp://sourceware.org/pub/newlib/newlib-2.4.0.tar.gz"

##-------------------------------------------------------------
## Function definitions
##-------------------------------------------------------------
function announce {
  now=$(date +"%T")
  echo
  echo "[$now] $1"
  echo
}

pushd () {
  command pushd "$@" > /dev/null
}

popd () {
  command popd "$@" > /dev/null
}

# download_and_extract (URL, tarball_name, target_dir)
download_and_extract  () {
  local tarball="${1##*/}"

  # Eat up strings after 2 dots i.e.   .tar.gz
  local tarball_dir="${tarball%.*}"
  local tarball_dir="${tarball_dir%.*}"

  # Clean up older downloads
  rm -rf $tarball_dir
  rm -rf $2

  # download
  wget -nc $1

  # extract
  tar xf $tarball
  mv $tarball_dir $2
}

##-------------------------------------------------------------
## Script main
##-------------------------------------------------------------

install_dir="${root_dir}/install"
PATH=${PATH}:$install_dir/bin
PATH=${PATH}:$install_dir

announce "Moving to root=$root_dir"
cd $root_dir

mkdir -p $install_dir
if [ "$clean_install" = "true" ]; then
  pushd $install_dir
    rm -rf ./*
  popd
fi


#libs
#-------------------
announce "Working on libs..."
libs_dir="$root_dir/libs"


mkdir -p $libs_dir
pushd $libs_dir

  # download source
  download_and_extract $gmp_tar_link gmp
  download_and_extract $mpfr_tar_link mpfr
  download_and_extract $mpc_tar_link mpc
  download_and_extract $isl_tar_link isl

popd  # back to root dir
announce "Working on libs... Complete!"

if [ "$build_binutils" = "true" ]; then
  #binutils
  #-------------------
  announce "Working on binutils..."
  binutils_dir="$root_dir/binutils"
  binutils_src_dir="$binutils_dir/binutils-src"
  binutils_build_dir="$binutils_dir/build-$target"

  mkdir -p $binutils_dir
  pushd $binutils_dir

    # download source
    #git clone git://sourceware.org/git/binutils-gdb.git
    download_and_extract $binutils_tar_link binutils-src

    # link any required libraries
    ln -s $libs_dir/isl $binutils_src_dir/isl
    ln -s $libs_dir/gmp $binutils_src_dir/gmp

    mkdir -p $binutils_build_dir
    pushd $binutils_build_dir

      # perform cleanup
      pushd $binutils_src_dir
#        make distclean > /dev/null
      popd
#      rm -rf ./*

      # build and install
      $binutils_src_dir/configure --prefix=$install_dir --target=$target > log-configure-$target.log
      make -j2 > log-make-$target.log
      make install > log-install-$target.log
    popd

  popd  # back to root dir
  tree $install_dir > $install_dir/post-binutils-install.tree
  announce "Working on binutils... Complete!"
fi


if [ "$build_gcc_static" = "true" ]; then
  #gcc-static
  #-------------------
  announce "Working on gcc-static..."
  gcc_dir="$root_dir/gcc"
  gcc_src_dir="$gcc_dir/gcc-src"
  gcc_build_dir="$gcc_dir/build-$target"

  mkdir -p $gcc_dir
  pushd $gcc_dir

    # download source
    download_and_extract $gcc_tar_link gcc-src

    # link any required libraries
    ln -s $libs_dir/isl $gcc_src_dir/isl
    ln -s $libs_dir/gmp $gcc_src_dir/gmp
    ln -s $libs_dir/mpfr $gcc_src_dir/mpfr
    ln -s $libs_dir/mpc $gcc_src_dir/mpc

    mkdir -p $gcc_build_dir
    pushd $gcc_build_dir

      # perform cleanup
  #    rm -rf ./*

      # build and install
      announce "gcc-static configure"
CXXFLAGS="-fpermissive"      $gcc_src_dir/configure --prefix=$install_dir  --target=$target --enable-languages=c --disable-bootstrap --with-newlib > log-configure-$target.log
      announce "gcc-static make"
      make -j2 all-gcc > log-make-$target.log
      announce "gcc-static install"
      make install-gcc > log-install-$target.log

      tree $install_dir > $install_dir/post-gcc-static-install.tree

      announce "gcc-static-libgcc make"
      make -j2 -k all-target-libgcc
      announce "gcc-static-libgcc install"
      make -i install-target-libgcc
    popd

  popd  # back to root dir
  tree $install_dir > $install_dir/post-gcc-static-libgcc-install.tree
  announce "Working on gcc-static... Complete!"
fi

if [ "$build_newlib" = "true" ]; then
  #newlib
  #-------------------
  announce "Working on newlib..."
  newlib_dir="$root_dir/newlib"
  newlib_src_dir="$newlib_dir/newlib-src"
  newlib_build_dir="$newlib_dir/build-$target"

  mkdir -p $newlib_dir
  pushd $newlib_dir

    # download source
    download_and_extract $newlib_tar_link newlib-src

    mkdir -p $newlib_build_dir
    pushd $newlib_build_dir

      # perform cleanup
      #rm -rf ./*

      # build and install
      announce "newlib configure"
      $newlib_src_dir/configure --prefix=$install_dir --target=$target > log-configure-$target.log
      announce "newlib make"
      make -j2 all > log-make-$target.log
      announce "newlib install"
      make install > log-install-$target.log
    popd

  popd  # back to root dir
  tree $install_dir > $install_dir/post-newlib-install.tree
  announce "Working on newlib... Complete!"
fi

if [ "$build_gcc" = "true" ]; then
  #gcc
  #-------------------
  announce "Working on gcc..."
  gcc_dir="$root_dir/gcc"
  gcc_src_dir="$gcc_dir/gcc-src"
  gcc_build_dir="$gcc_dir/build-$target"

  pushd $gcc_build_dir

    # build and install
    announce "gcc configure"
 CXXFLAGS="-fpermissive"    $gcc_src_dir/configure --prefix=$install_dir --target=$target --enable-languages=c,c++ --disable-bootstrap --with-newlib > log-configure-$target.log
    announce "gcc make"
    make -j2 all > log-make-$target.log
    announce "gcc install"
    make install > log-install-$target.log

  popd  # back to root dir
  tree $install_dir > $install_dir/post-gcc-install.tree
  announce "Working on gcc... Complete!"
fi


announce "Cross toolchain ready!"
相关推荐
IT 小阿姨(数据库)2 分钟前
PgSQL中pg_stat_user_tables 和 pg_stat_user_objects参数详解
linux·运维·数据库·sql·postgresql·oracle
倔强的石头_12 分钟前
Windows系统下KingbaseES数据库保姆级安装教程(附常见问题解决)
数据库
MChine慕青17 分钟前
顺序表与单链表:核心原理与实战应用
linux·c语言·开发语言·数据结构·c++·算法·链表
朱自清的诗.18 分钟前
使用虚拟机Ubuntu搭建mosquito服务器 使esp32、上位机通信
ubuntu·esp32·mosquito
虎头金猫28 分钟前
如何在Linux上使用Docker在本地部署开源PDF工具Stirling PDF:StirlingPDF+cpolar让专业操作像在线文档一样简单
linux·运维·ubuntu·docker·pdf·开源·centos
麦兜*1 小时前
MongoDB 常见错误解决方案:从连接失败到主从同步问题
java·数据库·spring boot·redis·mongodb·容器
RestCloud1 小时前
PostgreSQL大表同步优化:如何避免网络和内存瓶颈?
前端·数据库·api
阿里云大数据AI技术1 小时前
淘宝闪购基于Flink&Paimon的Lakehouse生产实践:从实时数仓到湖仓一体化的演进之路
数据库·flink
努力学习的小廉1 小时前
深入了解linux系统—— 线程同步
linux·服务器·数据库·算法
2301_810154552 小时前
VM中CentOS 7密码重置
linux·运维·centos