blob: 546871f8eed8214d8196b4f46b603e07e1edf416 [file] [log] [blame]
Guillaume Chateleta25b5cb2018-02-14 09:41:51 +01001#!/bin/bash
2
Guillaume Chatelet9233afb2018-02-16 14:38:05 +01003readonly SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
4readonly PROJECT_FOLDER="${SCRIPT_FOLDER}/.."
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +01005readonly ARCHIVE_FOLDER=~/cpu_features_archives
Guillaume Chatelet9233afb2018-02-16 14:38:05 +01006readonly QEMU_INSTALL=${ARCHIVE_FOLDER}/qemu
7readonly DEFAULT_CMAKE_ARGS=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON"
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +01008
Guillaume Chatelet245c8122018-02-15 13:51:08 +01009function extract() {
10 case $1 in
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010011 *.tar.bz2) tar xjf "$1" ;;
12 *.tar.xz) tar xJf "$1" ;;
13 *.tar.gz) tar xzf "$1" ;;
Guillaume Chatelet245c8122018-02-15 13:51:08 +010014 *)
15 echo "don't know how to extract '$1'..."
16 exit 1
17 esac
18}
19
20function unpackifnotexists() {
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010021 mkdir -p "${ARCHIVE_FOLDER}"
22 cd "${ARCHIVE_FOLDER}" || exit
Guillaume Chatelet245c8122018-02-15 13:51:08 +010023 local URL=$1
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010024 local RELATIVE_FOLDER=$2
25 local DESTINATION="${ARCHIVE_FOLDER}/${RELATIVE_FOLDER}"
Guillaume Chatelet245c8122018-02-15 13:51:08 +010026 if [[ ! -d "${DESTINATION}" ]] ; then
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010027 local ARCHIVE_NAME=$(echo ${URL} | sed 's/.*\///')
28 test -f "${ARCHIVE_NAME}" || wget -q "${URL}"
29 extract "${ARCHIVE_NAME}"
Guillaume Chatelet245c8122018-02-15 13:51:08 +010030 fi
31}
32
Guillaume Chatelet245c8122018-02-15 13:51:08 +010033function installqemuifneeded() {
34 local VERSION=${QEMU_VERSION:=2.11.1}
Guillaume Chatelet6446b422018-02-16 14:17:10 +010035 local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mips mipsel}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010036 local TARGETS=${QEMU_TARGETS:=$(echo "$ARCHES" | sed 's#$# #;s#\([^ ]*\) #\1-linux-user #g')}
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010037
Guillaume Chatelet245c8122018-02-15 13:51:08 +010038 if echo "${VERSION} ${TARGETS}" | cmp --silent ${QEMU_INSTALL}/.build -; then
39 echo "qemu ${VERSION} up to date!"
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010040 return 0
41 fi
42
Guillaume Chatelet245c8122018-02-15 13:51:08 +010043 echo "VERSION: ${VERSION}"
44 echo "TARGETS: ${TARGETS}"
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010045
Guillaume Chatelet245c8122018-02-15 13:51:08 +010046 rm -rf ${QEMU_INSTALL}
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010047
48 # Checking for a tarball before downloading makes testing easier :-)
Guillaume Chatelet245c8122018-02-15 13:51:08 +010049 local QEMU_URL="http://wiki.qemu-project.org/download/qemu-${VERSION}.tar.xz"
50 local QEMU_FOLDER="qemu-${VERSION}"
51 unpackifnotexists ${QEMU_URL} ${QEMU_FOLDER}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010052 cd ${QEMU_FOLDER} || exit
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010053
54 ./configure \
Guillaume Chatelet245c8122018-02-15 13:51:08 +010055 --prefix="${QEMU_INSTALL}" \
56 --target-list="${TARGETS}" \
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010057 --disable-docs \
58 --disable-sdl \
59 --disable-gtk \
60 --disable-gnutls \
61 --disable-gcrypt \
62 --disable-nettle \
63 --disable-curses \
64 --static
65
66 make -j4
67 make install
68
Guillaume Chatelet245c8122018-02-15 13:51:08 +010069 echo "$VERSION $TARGETS" > ${QEMU_INSTALL}/.build
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010070}
71
Guillaume Chatelet245c8122018-02-15 13:51:08 +010072function assert_defined(){
Guillaume Chatelet6446b422018-02-16 14:17:10 +010073 local VALUE=${1}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010074 : "${VALUE?"${1} needs to be defined"}"
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010075}
76
Guillaume Chatelet6446b422018-02-16 14:17:10 +010077function integrate() {
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010078 cd "${PROJECT_FOLDER}" || exit
79 cmake -H. -B"${BUILD_DIR}" ${DEFAULT_CMAKE_ARGS} ${CMAKE_ADDITIONAL_ARGS}
80 cmake --build "${BUILD_DIR}" --target all
Guillaume Chatelet245c8122018-02-15 13:51:08 +010081
82 if [[ -n "${QEMU_ARCH}" ]]; then
Guillaume Chatelet6446b422018-02-16 14:17:10 +010083 if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then
84 QEMU="true || "
85 else
86 installqemuifneeded
87 QEMU="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} ${QEMU_ARGS}"
88 fi
89 else
90 QEMU=""
Guillaume Chateleta25b5cb2018-02-14 09:41:51 +010091 fi
Guillaume Chateleta25b5cb2018-02-14 09:41:51 +010092 # Run tests
Guillaume Chatelet6446b422018-02-16 14:17:10 +010093 for test_binary in ${BUILD_DIR}/test/*_test; do ${QEMU} ${test_binary}; done
Guillaume Chateleta25b5cb2018-02-14 09:41:51 +010094 # Run demo program
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010095 ${QEMU} "${BUILD_DIR}/list_cpu_features"
Guillaume Chatelet245c8122018-02-15 13:51:08 +010096}
97
98function expand_linaro_config() {
Guillaume Chatelet6446b422018-02-16 14:17:10 +010099 assert_defined TARGET
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100100 local LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100101
102 local GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}.tar.xz
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +0100103 local GCC_RELATIVE_FOLDER="gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}"
104 unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}"
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100105
106 local SYSROOT_URL=${LINARO_ROOT_URL}/${TARGET}/sysroot-glibc-linaro-2.25-2017.11-${TARGET}.tar.xz
107 local SYSROOT_RELATIVE_FOLDER=sysroot-glibc-linaro-2.25-2017.11-${TARGET}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +0100108 unpackifnotexists "${SYSROOT_URL}" "${SYSROOT_RELATIVE_FOLDER}"
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100109
110 local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${SYSROOT_RELATIVE_FOLDER}
111 local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}
112
113 CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_SYSROOT=${SYSROOT_FOLDER}"
114 CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_C_COMPILER=${GCC_FOLDER}/bin/${TARGET}-gcc"
115 CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_CXX_COMPILER=${GCC_FOLDER}/bin/${TARGET}-g++"
116
117 CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER"
118 CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY"
119 CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY"
120
121 QEMU_ARGS+=" -L ${SYSROOT_FOLDER}"
122 QEMU_ARGS+=" -E LD_LIBRARY_PATH=/lib"
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100123}
124
Guillaume Chateletc1de7c92018-02-15 14:16:25 +0100125function expand_codescape_config() {
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100126 assert_defined TARGET
127 local FLAVOUR=${QEMU_ARCH}-r2-hard
Guillaume Chatelet8ba03e92018-09-07 15:54:51 +0200128 local DATE=2017.10-08
129 local CODESCAPE_URL=https://codescape.mips.com/components/toolchain/${DATE}/Codescape.GNU.Tools.Package.${DATE}.for.MIPS.MTI.Linux.CentOS-5.x86_64.tar.gz
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100130 local GCC_URL=${CODESCAPE_URL}
Guillaume Chatelet6da37f52018-02-16 15:09:51 +0100131 local GCC_RELATIVE_FOLDER=${TARGET}/${DATE}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +0100132 unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}"
Guillaume Chateletc1de7c92018-02-15 14:16:25 +0100133
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100134 local SYSROOT_URL=${CODESCAPE_URL}
135 local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}/sysroot/${FLAVOUR}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +0100136 unpackifnotexists "${SYSROOT_URL}" "${SYSROOT_RELATIVE_FOLDER}"
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100137
138 CMAKE_ADDITIONAL_ARGS+=" -DENABLE_MSA=1"
139 CMAKE_ADDITIONAL_ARGS+=" -DMIPS_CPU=p5600"
140 CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_TOOLCHAIN_FILE=cmake/mips32-linux-gcc.cmake"
Guillaume Chatelet6da37f52018-02-16 15:09:51 +0100141 CMAKE_ADDITIONAL_ARGS+=" -DCROSS=${TARGET}-"
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100142 CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}"
143
144 QEMU_ARGS+=" -L ${SYSROOT_FOLDER}"
145 QEMU_ARGS+=" -E LD_LIBRARY_PATH=/lib"
146 QEMU_ARGS+=" -cpu P5600"
Guillaume Chateletc1de7c92018-02-15 14:16:25 +0100147}
148
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100149function expand_environment_and_integrate() {
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100150 assert_defined PROJECT_FOLDER
151 assert_defined TARGET
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100152
153 BUILD_DIR="${PROJECT_FOLDER}/cmake_build/${TARGET}"
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +0100154 mkdir -p "${BUILD_DIR}"
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100155
156 CMAKE_ADDITIONAL_ARGS=""
157 QEMU_ARGS=""
158
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100159 case ${TOOLCHAIN} in
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100160 LINARO) expand_linaro_config ;;
161 CODESCAPE) expand_codescape_config ;;
162 NATIVE) QEMU_ARCH="" ;;
163 *)
164 echo "Unknown toolchain '${TOOLCHAIN}'..."
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100165 exit 1
166 esac
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100167 integrate
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100168}
Guillaume Chatelet59cb1042018-02-15 13:57:06 +0100169
170if [ "${CONTINUOUS_INTEGRATION}" = "true" ]; then
Guillaume Chateletc1de7c92018-02-15 14:16:25 +0100171 QEMU_ARCHES=${QEMU_ARCH}
Guillaume Chatelet59cb1042018-02-15 13:57:06 +0100172 expand_environment_and_integrate
173fi