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!"
相关推荐
Leo.yuan27 分钟前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi
Runing_WoNiu36 分钟前
MySQL与Oracle对比及区别
数据库·mysql·oracle
天道有情战天下1 小时前
mysql锁机制详解
数据库·mysql
看山还是山,看水还是。1 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
谷新龙0011 小时前
Redis运行时的10大重要指标
数据库·redis·缓存
CodingBrother1 小时前
MySQL 中单列索引与联合索引分析
数据库·mysql
精进攻城狮@1 小时前
Redis缓存雪崩、缓存击穿、缓存穿透
数据库·redis·缓存
小酋仍在学习1 小时前
光驱验证 MD5 校验和
数据库·postgresql
keep__go1 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
矛取矛求1 小时前
Linux中给普通账户一次性提权
linux·运维·服务器