#!/bin/bash # # linux kernel CROSS make wrapper # # It will download/unpack the cross tool chain if necessary, # then invoke make with suitable options. # # It detects ARCH in 4 ways. # # - make.i386 # make it a symlink to this script # - make.cross ARCH=i386 # - cd obj-i386; make.cross # - export ARCH=i386; make.cross # # With particular GCC_VERSION: # - GCC_VERSION=7.2.0 make.cross ARCH=arm # # Copyright (c) 2014, Intel Corporation. # Author: Fengguang Wu # Credit: Tony Breeds for crosstool GCC_VERSION=${GCC_VERSION:-""} GCC_INSTALL_PATH="$HOME/0day" if [[ ! "$0" =~ 'make.cross' && "$0" =~ make\.([a-z0-9_]+) ]]; then export ARCH="${BASH_REMATCH[1]}" elif [[ "$*" =~ ARCH=([a-z0-9_]+) ]]; then export ARCH="${BASH_REMATCH[1]}" elif [[ ${PWD##*-} =~ ^(i386|x86_64|alpha|arm|arm64|avr32|blackfin|c6x|cris|frv|h8300|hexagon|ia64|m32r|m68k|microblaze|mips|mn10300|openrisc|parisc|powerpc|s390|score|sh|sh64|sparc|sparc32|sparc64|tile|tilepro|tilegx|um|unicore32|xtensa)$ ]]; then export ARCH=${PWD##*-} elif [[ ! $ARCH ]]; then export ARCH=x86_64 fi [[ "$*" =~ ARCH=([a-z0-9_]+) ]] && [[ $ARCH != ${BASH_REMATCH[1]} ]] && { echo "Conflicting ARCH specified! $ARCH ${BASH_REMATCH[1]}" exit 1 } shopt -s nullglob install_packages() { [[ ! -x /usr/bin/xz || ! -x /usr/bin/lftp ]] && { echo Please install: xz-utils lftp exit 1 } } download_extract() { local URL="$1" local file="$(basename $URL)" local dir="$(basename $(dirname $URL))" mkdir -p $dir || return cd $dir echo lftpget -c $URL lftpget -c $URL || return cd .. mkdir -p $GCC_INSTALL_PATH || return [[ -w "$GCC_INSTALL_PATH" ]] || { echo "Can't use $GCC_INSTALL_PATH as gcc install path, please choose a different GCC_INSTALL_PATH" exit 1 } echo tar Jxf $dir/$file -C $GCC_INSTALL_PATH tar Jxf $dir/$file -C $GCC_INSTALL_PATH } install_crosstool() { local URL='https://download.01.org/0day-ci/cross-package' local list=/tmp/crosstool-files [[ -s $list ]] || { lftp -c "open $URL && find -d 3 > $list" || exit } local file local gcc_arch_pattern=$(echo "${gcc_arch}" | sed 's/*/.*/g') if [[ $GCC_VERSION ]]; then file=$(grep "${gcc_arch_pattern}" $list | grep "${GCC_VERSION}" | tail -1) else file=$(grep "${gcc_arch_pattern}" $list | tail -1) fi [[ $file ]] || { echo "Cannot find $gcc_arch_pattern under $URL check $list" exit 1 } download_extract "$URL/$file" || { echo "Failed to download $URL/$file" exit 1 } } install_linaro() { local URL='http://releases.linaro.org/archive/14.08/components/toolchain/binaries' local file='gcc-linaro-aarch64-linux-gnu-4.9-2014.08_linux.tar.xz' download_extract "$URL/$file" local dir="$GCC_INSTALL_PATH/$(basename $file .tar.xz)" local cross_gcc_version=($dir/bin/${gcc_arch}-gcc-*.*.*) local cross_gcc_version=${cross_gcc_version##*-} echo mkdir -p $GCC_INSTALL_PATH/gcc-$cross_gcc_version mkdir -p $GCC_INSTALL_PATH/gcc-$cross_gcc_version || return echo mv $dir $GCC_INSTALL_PATH/gcc-$cross_gcc_version/$gcc_arch mv $dir $GCC_INSTALL_PATH/gcc-$cross_gcc_version/$gcc_arch } install_cross_compiler() { install_packages if [[ $gcc_arch =~ 'aarch64' ]]; then install_linaro else install_crosstool fi } setup_compiler_for_xtensa() { local variant variant=$(grep -s -h '^CONFIG_XTENSA_VARIANT_CUSTOM_NAME=' .config | head -n1 | cut -f2 -d'"') if [[ "$variant" = 'fsf' ]]; then gcc_arch=$ARCH-linux elif [[ $variant ]]; then gcc_arch=xtensa-${variant}-elf else gcc_arch=$ARCH-linux fi } setup_crosstool() { local gcc_arch local gcc_exec case $ARCH in i386|x86_64) gcc_arch= ;; um) gcc_arch= ;; arm) gcc_arch=arm-*linux-gnueabi ;; arm64) gcc_arch=aarch64-linux-gnu ;; powerpc) gcc_arch=powerpc64-linux ;; blackfin) gcc_arch=bfin-uclinux ;; sh) gcc_arch=sh4-linux ;; parisc) if grep -s -q 'CONFIG_64BIT=y' $SRC_ROOT/arch/parisc/configs/$config; then gcc_arch=hppa64-linux else gcc_arch=hppa-linux fi ;; openrisc) gcc_arch=or1k-linux ;; riscv) gcc_arch=riscv64-linux ;; s390) gcc_arch=s390x-linux ;; tile|tilegx) gcc_arch=tilegx-linux ;; mn10300) gcc_arch=am33_2.0-linux ;; xtensa) setup_compiler_for_xtensa ;; *) gcc_arch=$ARCH-linux ;; esac if [[ $gcc_arch ]]; then gcc_exec=($GCC_INSTALL_PATH/gcc-${GCC_VERSION}*/${gcc_arch}/bin/${gcc_arch}-gcc) [[ -x $gcc_exec ]] || install_cross_compiler gcc_exec=($GCC_INSTALL_PATH/gcc-${GCC_VERSION}*/${gcc_arch}/bin/${gcc_arch}-gcc) [[ -x $gcc_exec ]] || { echo "No cross compiler for $ARCH" exit } # use highest available version gcc_exec=${gcc_exec[-1]} opt_cross="CROSS_COMPILE=${gcc_exec%gcc}" else opt_cross= fi } setup_crosstool [[ "$*" =~ (-j|--jobs) ]] || { nr_cpu=$(getconf _NPROCESSORS_CONF) opt_jobs="--jobs=$((nr_cpu * 2))" } [[ "$*" =~ "ARCH=$ARCH" ]] || { opt_arch="ARCH=$ARCH" } if [ -d obj-$ARCH ]; then export KBUILD_OUTPUT=obj-$ARCH O=KBUILD_OUTPUT=obj-$ARCH fi [[ -f arch/$ARCH/boot/dts/Makefile ]] && make_dts="CONFIG_OF_ALL_DTBS=y CONFIG_DTC=y" [[ -f .make-env ]] && source ./.make-env if [[ -d source && -L source ]]; then echo make -C source O=$PWD $make_dts $opt_arch $opt_cross $subarch $opt_jobs "$@" exec make -C source O=$PWD $make_dts $opt_arch $opt_cross $subarch $opt_jobs "$@" else echo make $O $make_dts $opt_arch $opt_cross $subarch $opt_jobs "$@" exec make $O $make_dts $opt_arch $opt_cross $subarch $opt_jobs "$@" fi