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!"
相关推荐
有想法的py工程师4 分钟前
PostgreSQL【内核】 CBO 优化器的“早停下注”与数学模型失效分析
数据库·postgresql
Apipi*4 分钟前
30天速通Linux 第九章Linux网络编程
linux·运维·网络
报错小能手17 分钟前
Channel面试题。Sync面试题
linux·服务器·windows
冰暮流星22 分钟前
sql之计算
数据库·sql
xiaoqiMikko25 分钟前
Linux 实战(五):DNS、hosts、CLOSE-WAIT、SSH 权限与改端口 —— 三台真机实测
linux·centos
Linux-lucky30 分钟前
43-Linux学习之旅之Shell 脚本(二)
linux·运维·学习·ubuntu·dash
yv798an41 分钟前
从 OpenSBI 引导到 C++17 异步运行时:自制 RISC-V 嵌入式专有 NAS 踩坑全记录
linux
dishugj1 小时前
HANA集群状态监控
数据库·系统架构
不悔哥1 小时前
Linux系统编程多线程程序如何安全退出
linux
小蒜学长1 小时前
基于Java的公司采购系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·公司采购系统