1*eca53ba6SRoland Levillain#!/usr/bin/env bash 2*eca53ba6SRoland Levillainset -eo pipefail 3*eca53ba6SRoland Levillain 4*eca53ba6SRoland Levillainfunction extract() { 5*eca53ba6SRoland Levillain echo "Extracting ${1}..." 6*eca53ba6SRoland Levillain case $1 in 7*eca53ba6SRoland Levillain *.tar.bz2) tar xjf "$1" ;; 8*eca53ba6SRoland Levillain *.tar.xz) tar xJf "$1" ;; 9*eca53ba6SRoland Levillain *.tar.gz) tar xzf "$1" ;; 10*eca53ba6SRoland Levillain *) 11*eca53ba6SRoland Levillain >&2 echo "don't know how to extract '$1'..." 12*eca53ba6SRoland Levillain exit 1 13*eca53ba6SRoland Levillain esac 14*eca53ba6SRoland Levillain} 15*eca53ba6SRoland Levillain 16*eca53ba6SRoland Levillainfunction unpack() { 17*eca53ba6SRoland Levillain mkdir -p "${ARCHIVE_DIR}" 18*eca53ba6SRoland Levillain cd "${ARCHIVE_DIR}" || exit 2 19*eca53ba6SRoland Levillain local -r URL=$1 20*eca53ba6SRoland Levillain local -r RELATIVE_DIR=$2 21*eca53ba6SRoland Levillain local -r DESTINATION="${ARCHIVE_DIR}/${RELATIVE_DIR}" 22*eca53ba6SRoland Levillain if [[ ! -d "${DESTINATION}" ]] ; then 23*eca53ba6SRoland Levillain echo "Downloading ${URL}..." 24*eca53ba6SRoland Levillain local -r ARCHIVE_NAME=$(basename "${URL}") 25*eca53ba6SRoland Levillain [[ -f "${ARCHIVE_NAME}" ]] || wget --no-verbose "${URL}" 26*eca53ba6SRoland Levillain extract "${ARCHIVE_NAME}" 27*eca53ba6SRoland Levillain rm -f "${ARCHIVE_NAME}" 28*eca53ba6SRoland Levillain fi 29*eca53ba6SRoland Levillain} 30*eca53ba6SRoland Levillain 31*eca53ba6SRoland Levillainfunction install_qemu() { 32*eca53ba6SRoland Levillain if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then 33*eca53ba6SRoland Levillain >&2 echo 'QEMU is disabled !' 34*eca53ba6SRoland Levillain return 0 35*eca53ba6SRoland Levillain fi 36*eca53ba6SRoland Levillain local -r QEMU_VERSION=${QEMU_VERSION:=7.1.0} 37*eca53ba6SRoland Levillain local -r QEMU_TARGET=${QEMU_ARCH}-linux-user 38*eca53ba6SRoland Levillain 39*eca53ba6SRoland Levillain if echo "${QEMU_VERSION} ${QEMU_TARGET}" | cmp --silent "${QEMU_INSTALL}/.build" -; then 40*eca53ba6SRoland Levillain echo "qemu ${QEMU_VERSION} up to date!" 41*eca53ba6SRoland Levillain return 0 42*eca53ba6SRoland Levillain fi 43*eca53ba6SRoland Levillain 44*eca53ba6SRoland Levillain echo "QEMU_VERSION: ${QEMU_VERSION}" 45*eca53ba6SRoland Levillain echo "QEMU_TARGET: ${QEMU_TARGET}" 46*eca53ba6SRoland Levillain 47*eca53ba6SRoland Levillain rm -rf "${QEMU_INSTALL}" 48*eca53ba6SRoland Levillain 49*eca53ba6SRoland Levillain # Checking for a tarball before downloading makes testing easier :-) 50*eca53ba6SRoland Levillain local -r QEMU_URL="http://wiki.qemu-project.org/download/qemu-${QEMU_VERSION}.tar.xz" 51*eca53ba6SRoland Levillain local -r QEMU_DIR="qemu-${QEMU_VERSION}" 52*eca53ba6SRoland Levillain unpack ${QEMU_URL} ${QEMU_DIR} 53*eca53ba6SRoland Levillain cd ${QEMU_DIR} || exit 2 54*eca53ba6SRoland Levillain 55*eca53ba6SRoland Levillain # Qemu (meson based build) depends on: pkgconf, libglib2.0, python3, ninja 56*eca53ba6SRoland Levillain ./configure \ 57*eca53ba6SRoland Levillain --prefix="${QEMU_INSTALL}" \ 58*eca53ba6SRoland Levillain --target-list="${QEMU_TARGET}" \ 59*eca53ba6SRoland Levillain --audio-drv-list= \ 60*eca53ba6SRoland Levillain --disable-brlapi \ 61*eca53ba6SRoland Levillain --disable-curl \ 62*eca53ba6SRoland Levillain --disable-curses \ 63*eca53ba6SRoland Levillain --disable-docs \ 64*eca53ba6SRoland Levillain --disable-gcrypt \ 65*eca53ba6SRoland Levillain --disable-gnutls \ 66*eca53ba6SRoland Levillain --disable-gtk \ 67*eca53ba6SRoland Levillain --disable-libnfs \ 68*eca53ba6SRoland Levillain --disable-libssh \ 69*eca53ba6SRoland Levillain --disable-nettle \ 70*eca53ba6SRoland Levillain --disable-opengl \ 71*eca53ba6SRoland Levillain --disable-sdl \ 72*eca53ba6SRoland Levillain --disable-virglrenderer \ 73*eca53ba6SRoland Levillain --disable-vte 74*eca53ba6SRoland Levillain 75*eca53ba6SRoland Levillain # wrapper on ninja 76*eca53ba6SRoland Levillain make -j8 77*eca53ba6SRoland Levillain make install 78*eca53ba6SRoland Levillain 79*eca53ba6SRoland Levillain echo "$QEMU_VERSION $QEMU_TARGET" > "${QEMU_INSTALL}/.build" 80*eca53ba6SRoland Levillain} 81*eca53ba6SRoland Levillain 82*eca53ba6SRoland Levillainfunction assert_defined(){ 83*eca53ba6SRoland Levillain if [[ -z "${!1}" ]]; then 84*eca53ba6SRoland Levillain >&2 echo "Variable '${1}' must be defined" 85*eca53ba6SRoland Levillain exit 1 86*eca53ba6SRoland Levillain fi 87*eca53ba6SRoland Levillain} 88*eca53ba6SRoland Levillain 89*eca53ba6SRoland Levillainfunction clean_build() { 90*eca53ba6SRoland Levillain # Cleanup previous build 91*eca53ba6SRoland Levillain rm -rf "${BUILD_DIR}" 92*eca53ba6SRoland Levillain mkdir -p "${BUILD_DIR}" 93*eca53ba6SRoland Levillain} 94*eca53ba6SRoland Levillain 95*eca53ba6SRoland Levillainfunction expand_linaro_config() { 96*eca53ba6SRoland Levillain #ref: https://releases.linaro.org/components/toolchain/binaries/ 97*eca53ba6SRoland Levillain local -r LINARO_VERSION=7.5-2019.12 98*eca53ba6SRoland Levillain local -r LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/${LINARO_VERSION} 99*eca53ba6SRoland Levillain 100*eca53ba6SRoland Levillain local -r GCC_VERSION=7.5.0-2019.12 101*eca53ba6SRoland Levillain local -r GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-${GCC_VERSION}-x86_64_${TARGET}.tar.xz 102*eca53ba6SRoland Levillain local -r GCC_RELATIVE_DIR="gcc-linaro-${GCC_VERSION}-x86_64_${TARGET}" 103*eca53ba6SRoland Levillain unpack "${GCC_URL}" "${GCC_RELATIVE_DIR}" 104*eca53ba6SRoland Levillain 105*eca53ba6SRoland Levillain local -r SYSROOT_VERSION=2.25-2019.12 106*eca53ba6SRoland Levillain local -r SYSROOT_URL=${LINARO_ROOT_URL}/${TARGET}/sysroot-glibc-linaro-${SYSROOT_VERSION}-${TARGET}.tar.xz 107*eca53ba6SRoland Levillain local -r SYSROOT_RELATIVE_DIR=sysroot-glibc-linaro-${SYSROOT_VERSION}-${TARGET} 108*eca53ba6SRoland Levillain unpack "${SYSROOT_URL}" "${SYSROOT_RELATIVE_DIR}" 109*eca53ba6SRoland Levillain 110*eca53ba6SRoland Levillain local -r SYSROOT_DIR=${ARCHIVE_DIR}/${SYSROOT_RELATIVE_DIR} 111*eca53ba6SRoland Levillain local -r STAGING_DIR=${ARCHIVE_DIR}/${SYSROOT_RELATIVE_DIR}-stage 112*eca53ba6SRoland Levillain local -r GCC_DIR=${ARCHIVE_DIR}/${GCC_RELATIVE_DIR} 113*eca53ba6SRoland Levillain 114*eca53ba6SRoland Levillain # Write a Toolchain file 115*eca53ba6SRoland Levillain # note: This is manadatory to use a file in order to have the CMake variable 116*eca53ba6SRoland Levillain # 'CMAKE_CROSSCOMPILING' set to TRUE. 117*eca53ba6SRoland Levillain # ref: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux 118*eca53ba6SRoland Levillain cat >"$TOOLCHAIN_FILE" <<EOL 119*eca53ba6SRoland Levillainset(CMAKE_SYSTEM_NAME Linux) 120*eca53ba6SRoland Levillainset(CMAKE_SYSTEM_PROCESSOR ${TARGET}) 121*eca53ba6SRoland Levillain 122*eca53ba6SRoland Levillainset(CMAKE_SYSROOT ${SYSROOT_DIR}) 123*eca53ba6SRoland Levillainset(CMAKE_STAGING_PREFIX ${STAGING_DIR}) 124*eca53ba6SRoland Levillain 125*eca53ba6SRoland Levillainset(tools ${GCC_DIR}) 126*eca53ba6SRoland Levillainset(CMAKE_C_COMPILER \${tools}/bin/${TARGET}-gcc) 127*eca53ba6SRoland Levillainset(CMAKE_CXX_COMPILER \${tools}/bin/${TARGET}-g++) 128*eca53ba6SRoland Levillain 129*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 130*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 131*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 132*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 133*eca53ba6SRoland LevillainEOL 134*eca53ba6SRoland LevillainCMAKE_ADDITIONAL_ARGS+=( -DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN_FILE}" ) 135*eca53ba6SRoland LevillainQEMU_ARGS+=( -L "${SYSROOT_DIR}" ) 136*eca53ba6SRoland LevillainQEMU_ARGS+=( -E LD_LIBRARY_PATH=/lib ) 137*eca53ba6SRoland Levillain} 138*eca53ba6SRoland Levillain 139*eca53ba6SRoland Levillainfunction expand_bootlin_config() { 140*eca53ba6SRoland Levillain # ref: https://toolchains.bootlin.com/ 141*eca53ba6SRoland Levillain local -r GCC_DIR=${ARCHIVE_DIR}/${GCC_RELATIVE_DIR} 142*eca53ba6SRoland Levillain 143*eca53ba6SRoland Levillain case "${TARGET}" in 144*eca53ba6SRoland Levillain "aarch64") 145*eca53ba6SRoland Levillain local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--glibc--stable-2021.11-1.tar.bz2" 146*eca53ba6SRoland Levillain local -r GCC_PREFIX="aarch64" 147*eca53ba6SRoland Levillain ;; 148*eca53ba6SRoland Levillain "aarch64be") 149*eca53ba6SRoland Levillain local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64be/tarballs/aarch64be--glibc--stable-2021.11-1.tar.bz2" 150*eca53ba6SRoland Levillain local -r GCC_PREFIX="aarch64_be" 151*eca53ba6SRoland Levillain ;; 152*eca53ba6SRoland Levillain "ppc64le") 153*eca53ba6SRoland Levillain local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/powerpc64le-power8/tarballs/powerpc64le-power8--glibc--stable-2021.11-1.tar.bz2" 154*eca53ba6SRoland Levillain local -r GCC_PREFIX="powerpc64le" 155*eca53ba6SRoland Levillain ;; 156*eca53ba6SRoland Levillain "ppc64") 157*eca53ba6SRoland Levillain local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/powerpc64-power8/tarballs/powerpc64-power8--glibc--stable-2021.11-1.tar.bz2" 158*eca53ba6SRoland Levillain local -r GCC_PREFIX="powerpc64" 159*eca53ba6SRoland Levillain ;; 160*eca53ba6SRoland Levillain "ppc") 161*eca53ba6SRoland Levillain #local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/powerpc-e500mc/tarballs/powerpc-e500mc--glibc--stable-2021.11-1.tar.bz2" 162*eca53ba6SRoland Levillain local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/powerpc-440fp/tarballs/powerpc-440fp--glibc--stable-2021.11-1.tar.bz2" 163*eca53ba6SRoland Levillain local -r GCC_PREFIX="powerpc" 164*eca53ba6SRoland Levillain ;; 165*eca53ba6SRoland Levillain "riscv32") 166*eca53ba6SRoland Levillain local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/riscv32-ilp32d/tarballs/riscv32-ilp32d--glibc--bleeding-edge-2022.08-1.tar.bz2" 167*eca53ba6SRoland Levillain local -r GCC_PREFIX="riscv32" 168*eca53ba6SRoland Levillain ;; 169*eca53ba6SRoland Levillain "riscv64") 170*eca53ba6SRoland Levillain local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/riscv64-lp64d/tarballs/riscv64-lp64d--glibc--stable-2022.08-1.tar.bz2" 171*eca53ba6SRoland Levillain local -r GCC_PREFIX="riscv64" 172*eca53ba6SRoland Levillain ;; 173*eca53ba6SRoland Levillain "s390x") 174*eca53ba6SRoland Levillain local -r TOOLCHAIN_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/s390x-z13/tarballs/s390x-z13--glibc--stable-2022.08-1.tar.bz2" 175*eca53ba6SRoland Levillain local -r GCC_PREFIX="s390x" 176*eca53ba6SRoland Levillain ;; 177*eca53ba6SRoland Levillain *) 178*eca53ba6SRoland Levillain >&2 echo 'unknown power platform' 179*eca53ba6SRoland Levillain exit 1 ;; 180*eca53ba6SRoland Levillain esac 181*eca53ba6SRoland Levillain 182*eca53ba6SRoland Levillain local -r TOOLCHAIN_RELATIVE_DIR="${TARGET}" 183*eca53ba6SRoland Levillain unpack "${TOOLCHAIN_URL}" "${TOOLCHAIN_RELATIVE_DIR}" 184*eca53ba6SRoland Levillain local -r EXTRACT_DIR="${ARCHIVE_DIR}/$(basename ${TOOLCHAIN_URL%.tar.bz2})" 185*eca53ba6SRoland Levillain 186*eca53ba6SRoland Levillain local -r TOOLCHAIN_DIR=${ARCHIVE_DIR}/${TOOLCHAIN_RELATIVE_DIR} 187*eca53ba6SRoland Levillain if [[ -d "${EXTRACT_DIR}" ]]; then 188*eca53ba6SRoland Levillain mv "${EXTRACT_DIR}" "${TOOLCHAIN_DIR}" 189*eca53ba6SRoland Levillain fi 190*eca53ba6SRoland Levillain 191*eca53ba6SRoland Levillain local -r SYSROOT_DIR="${TOOLCHAIN_DIR}/${GCC_PREFIX}-buildroot-linux-gnu/sysroot" 192*eca53ba6SRoland Levillain #local -r STAGING_DIR=${SYSROOT_DIR}-stage 193*eca53ba6SRoland Levillain 194*eca53ba6SRoland Levillain # Write a Toolchain file 195*eca53ba6SRoland Levillain # note: This is manadatory to use a file in order to have the CMake variable 196*eca53ba6SRoland Levillain # 'CMAKE_CROSSCOMPILING' set to TRUE. 197*eca53ba6SRoland Levillain # ref: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux 198*eca53ba6SRoland Levillain cat >"${TOOLCHAIN_FILE}" <<EOL 199*eca53ba6SRoland Levillainset(CMAKE_SYSTEM_NAME Linux) 200*eca53ba6SRoland Levillainset(CMAKE_SYSTEM_PROCESSOR ${GCC_PREFIX}) 201*eca53ba6SRoland Levillain 202*eca53ba6SRoland Levillainset(CMAKE_SYSROOT ${SYSROOT_DIR}) 203*eca53ba6SRoland Levillain#set(CMAKE_STAGING_PREFIX ${STAGING_DIR}) 204*eca53ba6SRoland Levillain 205*eca53ba6SRoland Levillainset(tools ${TOOLCHAIN_DIR}) 206*eca53ba6SRoland Levillain 207*eca53ba6SRoland Levillainset(CMAKE_C_COMPILER \${tools}/bin/${GCC_PREFIX}-linux-gcc) 208*eca53ba6SRoland Levillainset(CMAKE_C_FLAGS "${POWER_FLAGS}") 209*eca53ba6SRoland Levillainset(CMAKE_CXX_COMPILER \${tools}/bin/${GCC_PREFIX}-linux-g++) 210*eca53ba6SRoland Levillainset(CMAKE_CXX_FLAGS "${POWER_FLAGS} -L${SYSROOT_DIR}/lib") 211*eca53ba6SRoland Levillain 212*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}) 213*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 214*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 215*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 216*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 217*eca53ba6SRoland LevillainEOL 218*eca53ba6SRoland Levillain 219*eca53ba6SRoland LevillainCMAKE_ADDITIONAL_ARGS+=( -DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN_FILE}" ) 220*eca53ba6SRoland LevillainQEMU_ARGS+=( -L "${SYSROOT_DIR}" ) 221*eca53ba6SRoland LevillainQEMU_ARGS+=( -E LD_PRELOAD="${SYSROOT_DIR}/usr/lib/libstdc++.so.6:${SYSROOT_DIR}/lib/libgcc_s.so.1" ) 222*eca53ba6SRoland Levillain} 223*eca53ba6SRoland Levillain 224*eca53ba6SRoland Levillainfunction expand_codescape_config() { 225*eca53ba6SRoland Levillain # https://www.mips.com/develop/tools/codescape-mips-sdk/mips-toolchain-configurations/ 226*eca53ba6SRoland Levillain # mips-mti: MIPS32R6 and MIPS64R6 227*eca53ba6SRoland Levillain # mips-img: MIPS32R2 and MIPS64R2 228*eca53ba6SRoland Levillain 229*eca53ba6SRoland Levillain # ref: https://codescape.mips.com/components/toolchain/2020.06-01/downloads.html 230*eca53ba6SRoland Levillain local -r DATE=2020.06-01 231*eca53ba6SRoland Levillain 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 232*eca53ba6SRoland Levillain local -r GCC_RELATIVE_DIR="mips-mti-linux-gnu/${DATE}" 233*eca53ba6SRoland Levillain 234*eca53ba6SRoland Levillain # ref: https://codescape.mips.com/components/toolchain/2019.02-04/downloads.html 235*eca53ba6SRoland Levillain #local -r DATE=2019.02-04 236*eca53ba6SRoland Levillain #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 237*eca53ba6SRoland Levillain #local -r GCC_RELATIVE_DIR="mips-img-linux-gnu/${DATE}" 238*eca53ba6SRoland Levillain 239*eca53ba6SRoland Levillain local -r GCC_URL=${CODESCAPE_URL} 240*eca53ba6SRoland Levillain unpack "${GCC_URL}" "${GCC_RELATIVE_DIR}" 241*eca53ba6SRoland Levillain 242*eca53ba6SRoland Levillain local -r GCC_DIR=${ARCHIVE_DIR}/${GCC_RELATIVE_DIR} 243*eca53ba6SRoland Levillain local MIPS_FLAGS="" 244*eca53ba6SRoland Levillain local LIBC_DIR_SUFFIX="" 245*eca53ba6SRoland Levillain local FLAVOUR="" 246*eca53ba6SRoland Levillain case "${TARGET}" in 247*eca53ba6SRoland Levillain "mips32") 248*eca53ba6SRoland Levillain MIPS_FLAGS="-EB -mips32r6 -mabi=32" 249*eca53ba6SRoland Levillain FLAVOUR="mips-r6-hard" 250*eca53ba6SRoland Levillain #MIPS_FLAGS="-EB -mips32r2 -mabi=32" 251*eca53ba6SRoland Levillain #FLAVOUR="mips-r2-hard" 252*eca53ba6SRoland Levillain LIBC_DIR_SUFFIX="lib" 253*eca53ba6SRoland Levillain ;; 254*eca53ba6SRoland Levillain "mips32el") 255*eca53ba6SRoland Levillain MIPS_FLAGS="-EL -mips32r6 -mabi=32" 256*eca53ba6SRoland Levillain FLAVOUR="mipsel-r6-hard" 257*eca53ba6SRoland Levillain #MIPS_FLAGS="-EL -mips32r2 -mabi=32" 258*eca53ba6SRoland Levillain #FLAVOUR="mipsel-r2-hard" 259*eca53ba6SRoland Levillain LIBC_DIR_SUFFIX="lib" 260*eca53ba6SRoland Levillain ;; 261*eca53ba6SRoland Levillain "mips64") 262*eca53ba6SRoland Levillain MIPS_FLAGS="-EB -mips64r6 -mabi=64" 263*eca53ba6SRoland Levillain FLAVOUR="mips-r6-hard" 264*eca53ba6SRoland Levillain #MIPS_FLAGS="-EB -mips64r2 -mabi=64" 265*eca53ba6SRoland Levillain #FLAVOUR="mips-r2-hard" 266*eca53ba6SRoland Levillain LIBC_DIR_SUFFIX="lib64" 267*eca53ba6SRoland Levillain ;; 268*eca53ba6SRoland Levillain "mips64el") 269*eca53ba6SRoland Levillain MIPS_FLAGS="-EL -mips64r6 -mabi=64" 270*eca53ba6SRoland Levillain FLAVOUR="mipsel-r6-hard" 271*eca53ba6SRoland Levillain #MIPS_FLAGS="-EL -mips64r2 -mabi=64" 272*eca53ba6SRoland Levillain #FLAVOUR="mipsel-r2-hard" 273*eca53ba6SRoland Levillain LIBC_DIR_SUFFIX="lib64" 274*eca53ba6SRoland Levillain ;; 275*eca53ba6SRoland Levillain *) 276*eca53ba6SRoland Levillain >&2 echo 'unknown mips platform' 277*eca53ba6SRoland Levillain exit 1 ;; 278*eca53ba6SRoland Levillain esac 279*eca53ba6SRoland Levillain local -r SYSROOT_DIR=${GCC_DIR}/sysroot 280*eca53ba6SRoland Levillain local -r STAGING_DIR=${SYSROOT_DIR}-stage 281*eca53ba6SRoland Levillain 282*eca53ba6SRoland Levillain # Write a Toolchain file 283*eca53ba6SRoland Levillain # note: This is manadatory to use a file in order to have the CMake variable 284*eca53ba6SRoland Levillain # 'CMAKE_CROSSCOMPILING' set to TRUE. 285*eca53ba6SRoland Levillain # ref: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux 286*eca53ba6SRoland Levillain cat >"${TOOLCHAIN_FILE}" <<EOL 287*eca53ba6SRoland Levillainset(CMAKE_SYSTEM_NAME Linux) 288*eca53ba6SRoland Levillainset(CMAKE_SYSTEM_PROCESSOR ${TARGET}) 289*eca53ba6SRoland Levillain 290*eca53ba6SRoland Levillainset(CMAKE_SYSROOT ${SYSROOT_DIR}) 291*eca53ba6SRoland Levillainset(CMAKE_STAGING_PREFIX ${STAGING_DIR}) 292*eca53ba6SRoland Levillain 293*eca53ba6SRoland Levillainset(tools ${GCC_DIR}) 294*eca53ba6SRoland Levillain 295*eca53ba6SRoland Levillain# R6 296*eca53ba6SRoland Levillainset(CMAKE_C_COMPILER \${tools}/bin/mips-mti-linux-gnu-gcc) 297*eca53ba6SRoland Levillainset(CMAKE_C_FLAGS "${MIPS_FLAGS}") 298*eca53ba6SRoland Levillainset(CMAKE_CXX_COMPILER \${tools}/bin/mips-mti-linux-gnu-g++) 299*eca53ba6SRoland Levillainset(CMAKE_CXX_FLAGS "${MIPS_FLAGS} -L${SYSROOT_DIR}/usr/lib64") 300*eca53ba6SRoland Levillain 301*eca53ba6SRoland Levillain# R2 302*eca53ba6SRoland Levillain#set(CMAKE_C_COMPILER \${tools}/bin/mips-img-linux-gnu-gcc) 303*eca53ba6SRoland Levillain#set(CMAKE_C_FLAGS "${MIPS_FLAGS}") 304*eca53ba6SRoland Levillain#set(CMAKE_CXX_COMPILER \${tools}/bin/mips-img-linux-gnu-g++) 305*eca53ba6SRoland Levillain#set(CMAKE_CXX_FLAGS "${MIPS_FLAGS}") 306*eca53ba6SRoland Levillain 307*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH ${GCC_DIR}) 308*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 309*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 310*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 311*eca53ba6SRoland Levillainset(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 312*eca53ba6SRoland LevillainEOL 313*eca53ba6SRoland Levillain 314*eca53ba6SRoland LevillainCMAKE_ADDITIONAL_ARGS+=( -DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN_FILE}" ) 315*eca53ba6SRoland LevillainQEMU_ARGS+=( -L "${SYSROOT_DIR}/${FLAVOUR}" ) 316*eca53ba6SRoland Levillainlocal -r LIBC_DIR=${GCC_DIR}/mips-mti-linux-gnu/lib/${FLAVOUR}/${LIBC_DIR_SUFFIX} 317*eca53ba6SRoland Levillain#local -r LIBC_DIR=${GCC_DIR}/mips-img-linux-gnu/lib/${FLAVOUR}/${LIBC_DIR_SUFFIX} 318*eca53ba6SRoland LevillainQEMU_ARGS+=( -E LD_PRELOAD="${LIBC_DIR}/libstdc++.so.6:${LIBC_DIR}/libgcc_s.so.1" ) 319*eca53ba6SRoland Levillain} 320*eca53ba6SRoland Levillain 321*eca53ba6SRoland Levillainfunction build() { 322*eca53ba6SRoland Levillain cd "${PROJECT_DIR}" || exit 2 323*eca53ba6SRoland Levillain set -x 324*eca53ba6SRoland Levillain clean_build 325*eca53ba6SRoland Levillain cmake -S. -B"${BUILD_DIR}" "${CMAKE_DEFAULT_ARGS[@]}" "${CMAKE_ADDITIONAL_ARGS[@]}" 326*eca53ba6SRoland Levillain cmake --build "${BUILD_DIR}" --target all -j8 -v 327*eca53ba6SRoland Levillain set +x 328*eca53ba6SRoland Levillain} 329*eca53ba6SRoland Levillain 330*eca53ba6SRoland Levillainfunction run_test() { 331*eca53ba6SRoland Levillain assert_defined QEMU_ARCH 332*eca53ba6SRoland Levillain if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then 333*eca53ba6SRoland Levillain >&2 echo "QEMU is disabled for ${TARGET}" 334*eca53ba6SRoland Levillain return 335*eca53ba6SRoland Levillain fi 336*eca53ba6SRoland Levillain install_qemu 337*eca53ba6SRoland Levillain RUN_CMD="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} ${QEMU_ARGS[*]}" 338*eca53ba6SRoland Levillain 339*eca53ba6SRoland Levillain cd "${BUILD_DIR}" || exit 2 340*eca53ba6SRoland Levillain declare -a TEST_BINARIES=() 341*eca53ba6SRoland Levillain TEST_BINARIES+=($(find "${BUILD_DIR}"/test -executable -type f)) 342*eca53ba6SRoland Levillain TEST_BINARIES+=($(find "${BUILD_DIR}" -maxdepth 1 -executable -type f)) 343*eca53ba6SRoland Levillain set -x 344*eca53ba6SRoland Levillain set -e 345*eca53ba6SRoland Levillain for test_binary in ${TEST_BINARIES[*]} ; do 346*eca53ba6SRoland Levillain ${RUN_CMD} "${test_binary}" 347*eca53ba6SRoland Levillain done 348*eca53ba6SRoland Levillain set +e 349*eca53ba6SRoland Levillain set +x 350*eca53ba6SRoland Levillain} 351*eca53ba6SRoland Levillain 352*eca53ba6SRoland Levillainfunction usage() { 353*eca53ba6SRoland Levillain local -r NAME=$(basename "$0") 354*eca53ba6SRoland Levillain echo -e "$NAME - Build using a cross toolchain. 355*eca53ba6SRoland Levillain 356*eca53ba6SRoland LevillainSYNOPSIS 357*eca53ba6SRoland Levillain\t$NAME [-h|--help] [toolchain|build|qemu|test|all] 358*eca53ba6SRoland Levillain 359*eca53ba6SRoland LevillainDESCRIPTION 360*eca53ba6SRoland Levillain\tCross compile using a cross toolchain. 361*eca53ba6SRoland Levillain 362*eca53ba6SRoland Levillain\tYou MUST define the following variables before running this script: 363*eca53ba6SRoland Levillain\t* TARGET: 364*eca53ba6SRoland Levillain\t\tx86_64 365*eca53ba6SRoland Levillain\t\taarch64 aarch64be (bootlin) 366*eca53ba6SRoland Levillain\t\taarch64-linux-gnu aarch64_be-linux-gnu (linaro) 367*eca53ba6SRoland Levillain\t\tarm-linux-gnueabihf armv8l-linux-gnueabihf arm-linux-gnueabi (linaro) 368*eca53ba6SRoland Levillain\t\tarmeb-linux-gnueabihf armeb-linux-gnueabi (linaro) 369*eca53ba6SRoland Levillain\t\tmips32 mips32el (codespace) 370*eca53ba6SRoland Levillain\t\tmips64 mips64el (codespace) 371*eca53ba6SRoland Levillain\t\tppc (bootlin) 372*eca53ba6SRoland Levillain\t\tppc64 ppc64le (bootlin) 373*eca53ba6SRoland Levillain\t\triscv32 riscv64 (bootlin) 374*eca53ba6SRoland Levillain\t\ts390x (bootlin) 375*eca53ba6SRoland Levillain 376*eca53ba6SRoland LevillainOPTIONS 377*eca53ba6SRoland Levillain\t-h --help: show this help text 378*eca53ba6SRoland Levillain\ttoolchain: download, unpack toolchain and generate CMake toolchain file 379*eca53ba6SRoland Levillain\tbuild: toolchain + build the project using the toolchain file (note: remove previous build dir) 380*eca53ba6SRoland Levillain\tqemu: download, unpack and build qemu 381*eca53ba6SRoland Levillain\ttest: qemu + run all executable using qemu (note: don't build !) 382*eca53ba6SRoland Levillain\tall: build + test (default) 383*eca53ba6SRoland Levillain 384*eca53ba6SRoland LevillainEXAMPLES 385*eca53ba6SRoland Levillain* Using export: 386*eca53ba6SRoland Levillainexport TARGET=aarch64-linux-gnu 387*eca53ba6SRoland Levillain$0 388*eca53ba6SRoland Levillain 389*eca53ba6SRoland Levillain* One-liner: 390*eca53ba6SRoland LevillainTARGET=aarch64-linux-gnu $0" 391*eca53ba6SRoland Levillain} 392*eca53ba6SRoland Levillain 393*eca53ba6SRoland Levillain# Main 394*eca53ba6SRoland Levillainfunction main() { 395*eca53ba6SRoland Levillain case ${1} in 396*eca53ba6SRoland Levillain -h | --help) 397*eca53ba6SRoland Levillain usage; exit ;; 398*eca53ba6SRoland Levillain esac 399*eca53ba6SRoland Levillain 400*eca53ba6SRoland Levillain assert_defined TARGET 401*eca53ba6SRoland Levillain 402*eca53ba6SRoland Levillain declare -r PROJECT_DIR="$(cd -P -- "$(dirname -- "$0")/.." && pwd -P)" 403*eca53ba6SRoland Levillain declare -r ARCHIVE_DIR="${PROJECT_DIR}/build_cross/archives" 404*eca53ba6SRoland Levillain declare -r BUILD_DIR="${PROJECT_DIR}/build_cross/${TARGET}" 405*eca53ba6SRoland Levillain declare -r TOOLCHAIN_FILE=${ARCHIVE_DIR}/toolchain_${TARGET}.cmake 406*eca53ba6SRoland Levillain 407*eca53ba6SRoland Levillain echo "Target: '${TARGET}'" 408*eca53ba6SRoland Levillain 409*eca53ba6SRoland Levillain echo "Project dir: '${PROJECT_DIR}'" 410*eca53ba6SRoland Levillain echo "Archive dir: '${ARCHIVE_DIR}'" 411*eca53ba6SRoland Levillain echo "Build dir: '${BUILD_DIR}'" 412*eca53ba6SRoland Levillain echo "toolchain file: '${TOOLCHAIN_FILE}'" 413*eca53ba6SRoland Levillain 414*eca53ba6SRoland Levillain declare -a CMAKE_DEFAULT_ARGS=( -G ${CMAKE_GENERATOR:-"Ninja"} ) 415*eca53ba6SRoland Levillain declare -a CMAKE_ADDITIONAL_ARGS=() 416*eca53ba6SRoland Levillain 417*eca53ba6SRoland Levillain declare -a QEMU_ARGS=() 418*eca53ba6SRoland Levillain case ${TARGET} in 419*eca53ba6SRoland Levillain x86_64) 420*eca53ba6SRoland Levillain declare -r QEMU_ARCH=x86_64 ;; 421*eca53ba6SRoland Levillain arm-linux-gnueabihf | armv8l-linux-gnueabihf | arm-linux-gnueabi) 422*eca53ba6SRoland Levillain expand_linaro_config 423*eca53ba6SRoland Levillain declare -r QEMU_ARCH=arm ;; 424*eca53ba6SRoland Levillain armeb-linux-gnueabihf | armeb-linux-gnueabi) 425*eca53ba6SRoland Levillain expand_linaro_config 426*eca53ba6SRoland Levillain declare -r QEMU_ARCH=DISABLED ;; 427*eca53ba6SRoland Levillain aarch64-linux-gnu) 428*eca53ba6SRoland Levillain expand_linaro_config 429*eca53ba6SRoland Levillain declare -r QEMU_ARCH=aarch64 ;; 430*eca53ba6SRoland Levillain aarch64_be-linux-gnu) 431*eca53ba6SRoland Levillain expand_linaro_config 432*eca53ba6SRoland Levillain declare -r QEMU_ARCH=aarch64_be ;; 433*eca53ba6SRoland Levillain aarch64) 434*eca53ba6SRoland Levillain expand_bootlin_config 435*eca53ba6SRoland Levillain declare -r QEMU_ARCH=aarch64 ;; 436*eca53ba6SRoland Levillain aarch64be) 437*eca53ba6SRoland Levillain expand_bootlin_config 438*eca53ba6SRoland Levillain declare -r QEMU_ARCH=aarch64_be ;; 439*eca53ba6SRoland Levillain mips32) 440*eca53ba6SRoland Levillain expand_codescape_config 441*eca53ba6SRoland Levillain declare -r QEMU_ARCH=mips ;; 442*eca53ba6SRoland Levillain mips32el) 443*eca53ba6SRoland Levillain expand_codescape_config 444*eca53ba6SRoland Levillain declare -r QEMU_ARCH=mipsel ;; 445*eca53ba6SRoland Levillain mips64) 446*eca53ba6SRoland Levillain expand_codescape_config 447*eca53ba6SRoland Levillain declare -r QEMU_ARCH=mips64 ;; 448*eca53ba6SRoland Levillain mips64el) 449*eca53ba6SRoland Levillain expand_codescape_config 450*eca53ba6SRoland Levillain declare -r QEMU_ARCH=mips64el ;; 451*eca53ba6SRoland Levillain ppc64le) 452*eca53ba6SRoland Levillain expand_bootlin_config 453*eca53ba6SRoland Levillain declare -r QEMU_ARCH=ppc64le ;; 454*eca53ba6SRoland Levillain ppc64) 455*eca53ba6SRoland Levillain expand_bootlin_config 456*eca53ba6SRoland Levillain declare -r QEMU_ARCH=ppc64 ;; 457*eca53ba6SRoland Levillain ppc) 458*eca53ba6SRoland Levillain expand_bootlin_config 459*eca53ba6SRoland Levillain declare -r QEMU_ARCH=ppc ;; 460*eca53ba6SRoland Levillain riscv32) 461*eca53ba6SRoland Levillain expand_bootlin_config 462*eca53ba6SRoland Levillain declare -r QEMU_ARCH=riscv32 ;; 463*eca53ba6SRoland Levillain riscv64) 464*eca53ba6SRoland Levillain expand_bootlin_config 465*eca53ba6SRoland Levillain declare -r QEMU_ARCH=riscv64 ;; 466*eca53ba6SRoland Levillain s390x) 467*eca53ba6SRoland Levillain expand_bootlin_config 468*eca53ba6SRoland Levillain declare -r QEMU_ARCH=s390x ;; 469*eca53ba6SRoland Levillain *) 470*eca53ba6SRoland Levillain >&2 echo "Unknown TARGET '${TARGET}'..." 471*eca53ba6SRoland Levillain exit 1 ;; 472*eca53ba6SRoland Levillain esac 473*eca53ba6SRoland Levillain declare -r QEMU_INSTALL=${ARCHIVE_DIR}/qemu-${QEMU_ARCH} 474*eca53ba6SRoland Levillain 475*eca53ba6SRoland Levillain case ${1} in 476*eca53ba6SRoland Levillain toolchain) 477*eca53ba6SRoland Levillain exit ;; 478*eca53ba6SRoland Levillain build) 479*eca53ba6SRoland Levillain build ;; 480*eca53ba6SRoland Levillain qemu) 481*eca53ba6SRoland Levillain install_qemu ;; 482*eca53ba6SRoland Levillain test) 483*eca53ba6SRoland Levillain run_test ;; 484*eca53ba6SRoland Levillain *) 485*eca53ba6SRoland Levillain build 486*eca53ba6SRoland Levillain run_test ;; 487*eca53ba6SRoland Levillain esac 488*eca53ba6SRoland Levillain} 489*eca53ba6SRoland Levillain 490*eca53ba6SRoland Levillainmain "${1:-all}" 491