xref: /aosp_15_r20/external/cpu_features/scripts/run_integration.sh (revision eca53ba6d2e951e174b64682eaf56a36b8204c89)
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