| #!/usr/bin/env bash | |
| set -eo pipefail | |
| function extract() { | |
| echo "Extracting ${1}..." | |
| case $1 in | |
| *.tar.bz2) tar xjf "$1" ;; | |
| *.tar.xz) tar xJf "$1" ;; | |
| *.tar.gz) tar xzf "$1" ;; | |
| *) | |
| >&2 echo "don't know how to extract '$1'..." | |
| exit 1 | |
| esac | |
| } | |
| function unpack() { | |
| mkdir -p "${ARCHIVE_DIR}" | |
| cd "${ARCHIVE_DIR}" || exit 2 | |
| local -r URL=$1 | |
| local -r RELATIVE_DIR=$2 | |
| local -r DESTINATION="${ARCHIVE_DIR}/${RELATIVE_DIR}" | |
| if [[ ! -d "${DESTINATION}" ]] ; then | |
| echo "Downloading ${URL}..." | |
| local -r ARCHIVE_NAME=$(basename "${URL}") | |
| [[ -f "${ARCHIVE_NAME}" ]] || wget --no-verbose "${URL}" | |
| extract "${ARCHIVE_NAME}" | |
| rm -f "${ARCHIVE_NAME}" | |
| fi | |
| } | |
| function install_qemu() { | |
| if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then | |
| >&2 echo 'QEMU is disabled !' | |
| return 0 | |
| fi | |
| local -r QEMU_VERSION=${QEMU_VERSION:=7.1.0} | |
| local -r QEMU_TARGET=${QEMU_ARCH}-linux-user | |
| if echo "${QEMU_VERSION} ${QEMU_TARGET}" | cmp --silent "${QEMU_INSTALL}/.build" -; then | |
| echo "qemu ${QEMU_VERSION} up to date!" | |
| return 0 | |
| fi | |
| echo "QEMU_VERSION: ${QEMU_VERSION}" | |
| echo "QEMU_TARGET: ${QEMU_TARGET}" | |
| rm -rf "${QEMU_INSTALL}" | |
| # Checking for a tarball before downloading makes testing easier :-) | |
| local -r QEMU_URL="http://wiki.qemu-project.org/download/qemu-${QEMU_VERSION}.tar.xz" | |
| local -r QEMU_DIR="qemu-${QEMU_VERSION}" | |
| unpack ${QEMU_URL} ${QEMU_DIR} | |
| cd ${QEMU_DIR} || exit 2 | |
| # Qemu (meson based build) depends on: pkgconf, libglib2.0, python3, ninja | |
| ./configure \ | |
| --prefix="${QEMU_INSTALL}" \ | |
| --target-list="${QEMU_TARGET}" \ | |
| --audio-drv-list= \ | |
| --disable-brlapi \ | |
| --disable-curl \ | |
| --disable-curses \ | |
| --disable-docs \ | |
| --disable-gcrypt \ | |
| --disable-gnutls \ | |
| --disable-gtk \ | |
| --disable-libnfs \ | |
| --disable-libssh \ | |
| --disable-nettle \ | |
| --disable-opengl \ | |
| --disable-sdl \ | |
| --disable-virglrenderer \ | |
| --disable-vte | |
| # wrapper on ninja | |
| make -j8 | |
| make install | |
| echo "$QEMU_VERSION $QEMU_TARGET" > "${QEMU_INSTALL}/.build" | |
| } | |
| function assert_defined(){ | |
| if [[ -z "${!1}" ]]; then | |
| >&2 echo "Variable '${1}' must be defined" | |
| exit 1 | |
| fi | |
| } | |
| function clean_build() { | |
| # Cleanup previous build | |
| rm -rf "${BUILD_DIR}" | |
| mkdir -p "${BUILD_DIR}" | |
| } | |
| function expand_linaro_config() { | |
| #ref: https://releases.linaro.org/components/toolchain/binaries/ | |
| local -r LINARO_VERSION=7.5-2019.12 | |
| local -r LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/${LINARO_VERSION} | |
| local -r GCC_VERSION=7.5.0-2019.12 | |
| local -r GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-${GCC_VERSION}-x86_64_${TARGET}.tar.xz | |
| local -r GCC_RELATIVE_DIR="gcc-linaro-${GCC_VERSION}-x86_64_${TARGET}" | |
| unpack "${GCC_URL}" "${GCC_RELATIVE_DIR}" | |
| local -r SYSROOT_VERSION=2.25-2019.12 | |
| local -r SYSROOT_URL=${LINARO_ROOT_URL}/${TARGET}/sysroot-glibc-linaro-${SYSROOT_VERSION}-${TARGET}.tar.xz | |
| local -r SYSROOT_RELATIVE_DIR=sysroot-glibc-linaro-${SYSROOT_VERSION}-${TARGET} | |
| unpack "${SYSROOT_URL}" "${SYSROOT_RELATIVE_DIR}" | |
| local -r SYSROOT_DIR=${ARCHIVE_DIR}/${SYSROOT_RELATIVE_DIR} | |
| local -r STAGING_DIR=${ARCHIVE_DIR}/${SYSROOT_RELATIVE_DIR}-stage | |
| local -r GCC_DIR=${ARCHIVE_DIR}/${GCC_RELATIVE_DIR} | |
| # Write a Toolchain file | |
| # note: This is manadatory to use a file in order to have the CMake variable | |
| # 'CMAKE_CROSSCOMPILING' set to TRUE. | |
| # ref: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux | |
| cat >"$TOOLCHAIN_FILE" <<EOL | |
| set(CMAKE_SYSTEM_NAME Linux) | |
| set(CMAKE_SYSTEM_PROCESSOR ${TARGET}) | |
| set(CMAKE_SYSROOT ${SYSROOT_DIR}) | |
| set(CMAKE_STAGING_PREFIX ${STAGING_DIR}) | |
| set(tools ${GCC_DIR}) | |
| set(CMAKE_C_COMPILER \${tools}/bin/${TARGET}-gcc) | |
| set(CMAKE_CXX_COMPILER \${tools}/bin/${TARGET}-g++) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) | |
| EOL | |
| CMAKE_ADDITIONAL_ARGS+=( -DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN_FILE}" ) | |
| QEMU_ARGS+=( -L "${SYSROOT_DIR}" ) | |
| QEMU_ARGS+=( -E LD_LIBRARY_PATH=/lib ) | |
| } | |
| function expand_bootlin_config() { | |
| # ref: https://toolchains.bootlin.com/ | |
| local -r GCC_DIR=${ARCHIVE_DIR}/${GCC_RELATIVE_DIR} | |
| case "${TARGET}" in | |
| "aarch64") | |
| local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--glibc--stable-2021.11-1.tar.bz2" | |
| local -r GCC_PREFIX="aarch64" | |
| ;; | |
| "aarch64be") | |
| local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64be/tarballs/aarch64be--glibc--stable-2021.11-1.tar.bz2" | |
| local -r GCC_PREFIX="aarch64_be" | |
| ;; | |
| "ppc64le") | |
| local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/powerpc64le-power8/tarballs/powerpc64le-power8--glibc--stable-2021.11-1.tar.bz2" | |
| local -r GCC_PREFIX="powerpc64le" | |
| ;; | |
| "ppc64") | |
| local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/powerpc64-power8/tarballs/powerpc64-power8--glibc--stable-2021.11-1.tar.bz2" | |
| local -r GCC_PREFIX="powerpc64" | |
| ;; | |
| "ppc") | |
| #local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/powerpc-e500mc/tarballs/powerpc-e500mc--glibc--stable-2021.11-1.tar.bz2" | |
| local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/powerpc-440fp/tarballs/powerpc-440fp--glibc--stable-2021.11-1.tar.bz2" | |
| local -r GCC_PREFIX="powerpc" | |
| ;; | |
| "riscv32") | |
| local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/riscv32-ilp32d/tarballs/riscv32-ilp32d--glibc--bleeding-edge-2022.08-1.tar.bz2" | |
| local -r GCC_PREFIX="riscv32" | |
| ;; | |
| "riscv64") | |
| local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/riscv64-lp64d/tarballs/riscv64-lp64d--glibc--stable-2022.08-1.tar.bz2" | |
| local -r GCC_PREFIX="riscv64" | |
| ;; | |
| "s390x") | |
| local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/s390x-z13/tarballs/s390x-z13--glibc--stable-2022.08-1.tar.bz2" | |
| local -r GCC_PREFIX="s390x" | |
| ;; | |
| *) | |
| >&2 echo 'unknown power platform' | |
| exit 1 ;; | |
| esac | |
| local -r TOOLCHAIN_RELATIVE_DIR="${TARGET}" | |
| unpack "${TOOLCHAIN_URL}" "${TOOLCHAIN_RELATIVE_DIR}" | |
| local -r EXTRACT_DIR="${ARCHIVE_DIR}/$(basename ${TOOLCHAIN_URL%.tar.bz2})" | |
| local -r TOOLCHAIN_DIR=${ARCHIVE_DIR}/${TOOLCHAIN_RELATIVE_DIR} | |
| if [[ -d "${EXTRACT_DIR}" ]]; then | |
| mv "${EXTRACT_DIR}" "${TOOLCHAIN_DIR}" | |
| fi | |
| local -r SYSROOT_DIR="${TOOLCHAIN_DIR}/${GCC_PREFIX}-buildroot-linux-gnu/sysroot" | |
| #local -r STAGING_DIR=${SYSROOT_DIR}-stage | |
| # Write a Toolchain file | |
| # note: This is manadatory to use a file in order to have the CMake variable | |
| # 'CMAKE_CROSSCOMPILING' set to TRUE. | |
| # ref: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux | |
| cat >"${TOOLCHAIN_FILE}" <<EOL | |
| set(CMAKE_SYSTEM_NAME Linux) | |
| set(CMAKE_SYSTEM_PROCESSOR ${GCC_PREFIX}) | |
| set(CMAKE_SYSROOT ${SYSROOT_DIR}) | |
| #set(CMAKE_STAGING_PREFIX ${STAGING_DIR}) | |
| set(tools ${TOOLCHAIN_DIR}) | |
| set(CMAKE_C_COMPILER \${tools}/bin/${GCC_PREFIX}-linux-gcc) | |
| set(CMAKE_C_FLAGS "${POWER_FLAGS}") | |
| set(CMAKE_CXX_COMPILER \${tools}/bin/${GCC_PREFIX}-linux-g++) | |
| set(CMAKE_CXX_FLAGS "${POWER_FLAGS} -L${SYSROOT_DIR}/lib") | |
| set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) | |
| EOL | |
| CMAKE_ADDITIONAL_ARGS+=( -DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN_FILE}" ) | |
| QEMU_ARGS+=( -L "${SYSROOT_DIR}" ) | |
| QEMU_ARGS+=( -E LD_PRELOAD="${SYSROOT_DIR}/usr/lib/libstdc++.so.6:${SYSROOT_DIR}/lib/libgcc_s.so.1" ) | |
| } | |
| function expand_codescape_config() { | |
| # https://www.mips.com/develop/tools/codescape-mips-sdk/mips-toolchain-configurations/ | |
| # mips-mti: MIPS32R6 and MIPS64R6 | |
| # mips-img: MIPS32R2 and MIPS64R2 | |
| # ref: https://codescape.mips.com/components/toolchain/2020.06-01/downloads.html | |
| local -r DATE=2020.06-01 | |
| local -r CODESCAPE_URL=https://codescape.mips.com/components/toolchain/${DATE}/Codescape.GNU.Tools.Package.${DATE}.for.MIPS.MTI.Linux.CentOS-6.x86_64.tar.gz | |
| local -r GCC_RELATIVE_DIR="mips-mti-linux-gnu/${DATE}" | |
| # ref: https://codescape.mips.com/components/toolchain/2019.02-04/downloads.html | |
| #local -r DATE=2019.02-04 | |
| #local -r CODESCAPE_URL=https://codescape.mips.com/components/toolchain/${DATE}/Codescape.GNU.Tools.Package.${DATE}.for.MIPS.IMG.Linux.CentOS-6.x86_64.tar.gz | |
| #local -r GCC_RELATIVE_DIR="mips-img-linux-gnu/${DATE}" | |
| local -r GCC_URL=${CODESCAPE_URL} | |
| unpack "${GCC_URL}" "${GCC_RELATIVE_DIR}" | |
| local -r GCC_DIR=${ARCHIVE_DIR}/${GCC_RELATIVE_DIR} | |
| local MIPS_FLAGS="" | |
| local LIBC_DIR_SUFFIX="" | |
| local FLAVOUR="" | |
| case "${TARGET}" in | |
| "mips32") | |
| MIPS_FLAGS="-EB -mips32r6 -mabi=32" | |
| FLAVOUR="mips-r6-hard" | |
| #MIPS_FLAGS="-EB -mips32r2 -mabi=32" | |
| #FLAVOUR="mips-r2-hard" | |
| LIBC_DIR_SUFFIX="lib" | |
| ;; | |
| "mips32el") | |
| MIPS_FLAGS="-EL -mips32r6 -mabi=32" | |
| FLAVOUR="mipsel-r6-hard" | |
| #MIPS_FLAGS="-EL -mips32r2 -mabi=32" | |
| #FLAVOUR="mipsel-r2-hard" | |
| LIBC_DIR_SUFFIX="lib" | |
| ;; | |
| "mips64") | |
| MIPS_FLAGS="-EB -mips64r6 -mabi=64" | |
| FLAVOUR="mips-r6-hard" | |
| #MIPS_FLAGS="-EB -mips64r2 -mabi=64" | |
| #FLAVOUR="mips-r2-hard" | |
| LIBC_DIR_SUFFIX="lib64" | |
| ;; | |
| "mips64el") | |
| MIPS_FLAGS="-EL -mips64r6 -mabi=64" | |
| FLAVOUR="mipsel-r6-hard" | |
| #MIPS_FLAGS="-EL -mips64r2 -mabi=64" | |
| #FLAVOUR="mipsel-r2-hard" | |
| LIBC_DIR_SUFFIX="lib64" | |
| ;; | |
| *) | |
| >&2 echo 'unknown mips platform' | |
| exit 1 ;; | |
| esac | |
| local -r SYSROOT_DIR=${GCC_DIR}/sysroot | |
| local -r STAGING_DIR=${SYSROOT_DIR}-stage | |
| # Write a Toolchain file | |
| # note: This is manadatory to use a file in order to have the CMake variable | |
| # 'CMAKE_CROSSCOMPILING' set to TRUE. | |
| # ref: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux | |
| cat >"${TOOLCHAIN_FILE}" <<EOL | |
| set(CMAKE_SYSTEM_NAME Linux) | |
| set(CMAKE_SYSTEM_PROCESSOR ${TARGET}) | |
| set(CMAKE_SYSROOT ${SYSROOT_DIR}) | |
| set(CMAKE_STAGING_PREFIX ${STAGING_DIR}) | |
| set(tools ${GCC_DIR}) | |
| # R6 | |
| set(CMAKE_C_COMPILER \${tools}/bin/mips-mti-linux-gnu-gcc) | |
| set(CMAKE_C_FLAGS "${MIPS_FLAGS}") | |
| set(CMAKE_CXX_COMPILER \${tools}/bin/mips-mti-linux-gnu-g++) | |
| set(CMAKE_CXX_FLAGS "${MIPS_FLAGS} -L${SYSROOT_DIR}/usr/lib64") | |
| # R2 | |
| #set(CMAKE_C_COMPILER \${tools}/bin/mips-img-linux-gnu-gcc) | |
| #set(CMAKE_C_FLAGS "${MIPS_FLAGS}") | |
| #set(CMAKE_CXX_COMPILER \${tools}/bin/mips-img-linux-gnu-g++) | |
| #set(CMAKE_CXX_FLAGS "${MIPS_FLAGS}") | |
| set(CMAKE_FIND_ROOT_PATH ${GCC_DIR}) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | |
| set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) | |
| EOL | |
| CMAKE_ADDITIONAL_ARGS+=( -DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN_FILE}" ) | |
| QEMU_ARGS+=( -L "${SYSROOT_DIR}/${FLAVOUR}" ) | |
| local -r LIBC_DIR=${GCC_DIR}/mips-mti-linux-gnu/lib/${FLAVOUR}/${LIBC_DIR_SUFFIX} | |
| #local -r LIBC_DIR=${GCC_DIR}/mips-img-linux-gnu/lib/${FLAVOUR}/${LIBC_DIR_SUFFIX} | |
| QEMU_ARGS+=( -E LD_PRELOAD="${LIBC_DIR}/libstdc++.so.6:${LIBC_DIR}/libgcc_s.so.1" ) | |
| } | |
| function build() { | |
| cd "${PROJECT_DIR}" || exit 2 | |
| set -x | |
| clean_build | |
| cmake -S. -B"${BUILD_DIR}" "${CMAKE_DEFAULT_ARGS[@]}" "${CMAKE_ADDITIONAL_ARGS[@]}" | |
| cmake --build "${BUILD_DIR}" --target all -j8 -v | |
| set +x | |
| } | |
| function run_test() { | |
| assert_defined QEMU_ARCH | |
| if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then | |
| >&2 echo "QEMU is disabled for ${TARGET}" | |
| return | |
| fi | |
| install_qemu | |
| RUN_CMD="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} ${QEMU_ARGS[*]}" | |
| cd "${BUILD_DIR}" || exit 2 | |
| declare -a TEST_BINARIES=() | |
| TEST_BINARIES+=($(find "${BUILD_DIR}"/test -executable -type f)) | |
| TEST_BINARIES+=($(find "${BUILD_DIR}" -maxdepth 1 -executable -type f)) | |
| set -x | |
| set -e | |
| for test_binary in ${TEST_BINARIES[*]} ; do | |
| ${RUN_CMD} "${test_binary}" | |
| done | |
| set +e | |
| set +x | |
| } | |
| function usage() { | |
| local -r NAME=$(basename "$0") | |
| echo -e "$NAME - Build using a cross toolchain. | |
| SYNOPSIS | |
| \t$NAME [-h|--help] [toolchain|build|qemu|test|all] | |
| DESCRIPTION | |
| \tCross compile using a cross toolchain. | |
| \tYou MUST define the following variables before running this script: | |
| \t* TARGET: | |
| \t\tx86_64 | |
| \t\taarch64 aarch64be (bootlin) | |
| \t\taarch64-linux-gnu aarch64_be-linux-gnu (linaro) | |
| \t\tarm-linux-gnueabihf armv8l-linux-gnueabihf arm-linux-gnueabi (linaro) | |
| \t\tarmeb-linux-gnueabihf armeb-linux-gnueabi (linaro) | |
| \t\tmips32 mips32el (codespace) | |
| \t\tmips64 mips64el (codespace) | |
| \t\tppc (bootlin) | |
| \t\tppc64 ppc64le (bootlin) | |
| \t\triscv32 riscv64 (bootlin) | |
| \t\ts390x (bootlin) | |
| OPTIONS | |
| \t-h --help: show this help text | |
| \ttoolchain: download, unpack toolchain and generate CMake toolchain file | |
| \tbuild: toolchain + build the project using the toolchain file (note: remove previous build dir) | |
| \tqemu: download, unpack and build qemu | |
| \ttest: qemu + run all executable using qemu (note: don't build !) | |
| \tall: build + test (default) | |
| EXAMPLES | |
| * Using export: | |
| export TARGET=aarch64-linux-gnu | |
| $0 | |
| * One-liner: | |
| TARGET=aarch64-linux-gnu $0" | |
| } | |
| # Main | |
| function main() { | |
| case ${1} in | |
| -h | --help) | |
| usage; exit ;; | |
| esac | |
| assert_defined TARGET | |
| declare -r PROJECT_DIR="$(cd -P -- "$(dirname -- "$0")/.." && pwd -P)" | |
| declare -r ARCHIVE_DIR="${PROJECT_DIR}/build_cross/archives" | |
| declare -r BUILD_DIR="${PROJECT_DIR}/build_cross/${TARGET}" | |
| declare -r TOOLCHAIN_FILE=${ARCHIVE_DIR}/toolchain_${TARGET}.cmake | |
| echo "Target: '${TARGET}'" | |
| echo "Project dir: '${PROJECT_DIR}'" | |
| echo "Archive dir: '${ARCHIVE_DIR}'" | |
| echo "Build dir: '${BUILD_DIR}'" | |
| echo "toolchain file: '${TOOLCHAIN_FILE}'" | |
| declare -a CMAKE_DEFAULT_ARGS=( -G ${CMAKE_GENERATOR:-"Ninja"} ) | |
| declare -a CMAKE_ADDITIONAL_ARGS=() | |
| declare -a QEMU_ARGS=() | |
| case ${TARGET} in | |
| x86_64) | |
| declare -r QEMU_ARCH=x86_64 ;; | |
| arm-linux-gnueabihf | armv8l-linux-gnueabihf | arm-linux-gnueabi) | |
| expand_linaro_config | |
| declare -r QEMU_ARCH=arm ;; | |
| armeb-linux-gnueabihf | armeb-linux-gnueabi) | |
| expand_linaro_config | |
| declare -r QEMU_ARCH=DISABLED ;; | |
| aarch64-linux-gnu) | |
| expand_linaro_config | |
| declare -r QEMU_ARCH=aarch64 ;; | |
| aarch64_be-linux-gnu) | |
| expand_linaro_config | |
| declare -r QEMU_ARCH=aarch64_be ;; | |
| aarch64) | |
| expand_bootlin_config | |
| declare -r QEMU_ARCH=aarch64 ;; | |
| aarch64be) | |
| expand_bootlin_config | |
| declare -r QEMU_ARCH=aarch64_be ;; | |
| mips32) | |
| expand_codescape_config | |
| declare -r QEMU_ARCH=mips ;; | |
| mips32el) | |
| expand_codescape_config | |
| declare -r QEMU_ARCH=mipsel ;; | |
| mips64) | |
| expand_codescape_config | |
| declare -r QEMU_ARCH=mips64 ;; | |
| mips64el) | |
| expand_codescape_config | |
| declare -r QEMU_ARCH=mips64el ;; | |
| ppc64le) | |
| expand_bootlin_config | |
| declare -r QEMU_ARCH=ppc64le ;; | |
| ppc64) | |
| expand_bootlin_config | |
| declare -r QEMU_ARCH=ppc64 ;; | |
| ppc) | |
| expand_bootlin_config | |
| declare -r QEMU_ARCH=ppc ;; | |
| riscv32) | |
| expand_bootlin_config | |
| declare -r QEMU_ARCH=riscv32 ;; | |
| riscv64) | |
| expand_bootlin_config | |
| declare -r QEMU_ARCH=riscv64 ;; | |
| s390x) | |
| expand_bootlin_config | |
| declare -r QEMU_ARCH=s390x ;; | |
| *) | |
| >&2 echo "Unknown TARGET '${TARGET}'..." | |
| exit 1 ;; | |
| esac | |
| declare -r QEMU_INSTALL=${ARCHIVE_DIR}/qemu-${QEMU_ARCH} | |
| case ${1} in | |
| toolchain) | |
| exit ;; | |
| build) | |
| build ;; | |
| qemu) | |
| install_qemu ;; | |
| test) | |
| run_test ;; | |
| *) | |
| build | |
| run_test ;; | |
| esac | |
| } | |
| main "${1:-all}" |