Guillaume Chatelet | a25b5cb | 2018-02-14 09:41:51 +0100 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | |
Guillaume Chatelet | 9233afb | 2018-02-16 14:38:05 +0100 | [diff] [blame] | 3 | readonly SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P) |
| 4 | readonly PROJECT_FOLDER="${SCRIPT_FOLDER}/.." |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 5 | readonly ARCHIVE_FOLDER=~/cpu_features_archives |
Guillaume Chatelet | 9233afb | 2018-02-16 14:38:05 +0100 | [diff] [blame] | 6 | readonly QEMU_INSTALL=${ARCHIVE_FOLDER}/qemu |
| 7 | readonly DEFAULT_CMAKE_ARGS=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON" |
Guillaume Chatelet | 5a9819c | 2018-02-14 14:34:46 +0100 | [diff] [blame] | 8 | |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 9 | function extract() { |
| 10 | case $1 in |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 11 | *.tar.bz2) tar xjf "$1" ;; |
| 12 | *.tar.xz) tar xJf "$1" ;; |
| 13 | *.tar.gz) tar xzf "$1" ;; |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 14 | *) |
| 15 | echo "don't know how to extract '$1'..." |
| 16 | exit 1 |
| 17 | esac |
| 18 | } |
| 19 | |
| 20 | function unpackifnotexists() { |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 21 | mkdir -p "${ARCHIVE_FOLDER}" |
| 22 | cd "${ARCHIVE_FOLDER}" || exit |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 23 | local URL=$1 |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 24 | local RELATIVE_FOLDER=$2 |
| 25 | local DESTINATION="${ARCHIVE_FOLDER}/${RELATIVE_FOLDER}" |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 26 | if [[ ! -d "${DESTINATION}" ]] ; then |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 27 | local ARCHIVE_NAME=$(echo ${URL} | sed 's/.*\///') |
| 28 | test -f "${ARCHIVE_NAME}" || wget -q "${URL}" |
| 29 | extract "${ARCHIVE_NAME}" |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 30 | fi |
| 31 | } |
| 32 | |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 33 | function installqemuifneeded() { |
| 34 | local VERSION=${QEMU_VERSION:=2.11.1} |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 35 | local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mips mipsel} |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 36 | local TARGETS=${QEMU_TARGETS:=$(echo "$ARCHES" | sed 's#$# #;s#\([^ ]*\) #\1-linux-user #g')} |
Guillaume Chatelet | 5a9819c | 2018-02-14 14:34:46 +0100 | [diff] [blame] | 37 | |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 38 | if echo "${VERSION} ${TARGETS}" | cmp --silent ${QEMU_INSTALL}/.build -; then |
| 39 | echo "qemu ${VERSION} up to date!" |
Guillaume Chatelet | 5a9819c | 2018-02-14 14:34:46 +0100 | [diff] [blame] | 40 | return 0 |
| 41 | fi |
| 42 | |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 43 | echo "VERSION: ${VERSION}" |
| 44 | echo "TARGETS: ${TARGETS}" |
Guillaume Chatelet | 5a9819c | 2018-02-14 14:34:46 +0100 | [diff] [blame] | 45 | |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 46 | rm -rf ${QEMU_INSTALL} |
Guillaume Chatelet | 5a9819c | 2018-02-14 14:34:46 +0100 | [diff] [blame] | 47 | |
| 48 | # Checking for a tarball before downloading makes testing easier :-) |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 49 | 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 Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 52 | cd ${QEMU_FOLDER} || exit |
Guillaume Chatelet | 5a9819c | 2018-02-14 14:34:46 +0100 | [diff] [blame] | 53 | |
| 54 | ./configure \ |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 55 | --prefix="${QEMU_INSTALL}" \ |
| 56 | --target-list="${TARGETS}" \ |
Guillaume Chatelet | 5a9819c | 2018-02-14 14:34:46 +0100 | [diff] [blame] | 57 | --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 Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 69 | echo "$VERSION $TARGETS" > ${QEMU_INSTALL}/.build |
Guillaume Chatelet | 5a9819c | 2018-02-14 14:34:46 +0100 | [diff] [blame] | 70 | } |
| 71 | |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 72 | function assert_defined(){ |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 73 | local VALUE=${1} |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 74 | : "${VALUE?"${1} needs to be defined"}" |
Guillaume Chatelet | 5a9819c | 2018-02-14 14:34:46 +0100 | [diff] [blame] | 75 | } |
| 76 | |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 77 | function integrate() { |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 78 | cd "${PROJECT_FOLDER}" || exit |
| 79 | cmake -H. -B"${BUILD_DIR}" ${DEFAULT_CMAKE_ARGS} ${CMAKE_ADDITIONAL_ARGS} |
| 80 | cmake --build "${BUILD_DIR}" --target all |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 81 | |
| 82 | if [[ -n "${QEMU_ARCH}" ]]; then |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 83 | 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 Chatelet | a25b5cb | 2018-02-14 09:41:51 +0100 | [diff] [blame] | 91 | fi |
Guillaume Chatelet | a25b5cb | 2018-02-14 09:41:51 +0100 | [diff] [blame] | 92 | # Run tests |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 93 | for test_binary in ${BUILD_DIR}/test/*_test; do ${QEMU} ${test_binary}; done |
Guillaume Chatelet | a25b5cb | 2018-02-14 09:41:51 +0100 | [diff] [blame] | 94 | # Run demo program |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 95 | ${QEMU} "${BUILD_DIR}/list_cpu_features" |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 96 | } |
| 97 | |
| 98 | function expand_linaro_config() { |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 99 | assert_defined TARGET |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 100 | local LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11 |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 101 | |
| 102 | local GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}.tar.xz |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 103 | local GCC_RELATIVE_FOLDER="gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}" |
| 104 | unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}" |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 105 | |
| 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 Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 108 | unpackifnotexists "${SYSROOT_URL}" "${SYSROOT_RELATIVE_FOLDER}" |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 109 | |
| 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 Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 123 | } |
| 124 | |
Guillaume Chatelet | c1de7c9 | 2018-02-15 14:16:25 +0100 | [diff] [blame] | 125 | function expand_codescape_config() { |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 126 | assert_defined TARGET |
| 127 | local FLAVOUR=${QEMU_ARCH}-r2-hard |
Guillaume Chatelet | 8ba03e9 | 2018-09-07 15:54:51 +0200 | [diff] [blame^] | 128 | 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 Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 130 | local GCC_URL=${CODESCAPE_URL} |
Guillaume Chatelet | 6da37f5 | 2018-02-16 15:09:51 +0100 | [diff] [blame] | 131 | local GCC_RELATIVE_FOLDER=${TARGET}/${DATE} |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 132 | unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}" |
Guillaume Chatelet | c1de7c9 | 2018-02-15 14:16:25 +0100 | [diff] [blame] | 133 | |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 134 | local SYSROOT_URL=${CODESCAPE_URL} |
| 135 | local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}/sysroot/${FLAVOUR} |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 136 | unpackifnotexists "${SYSROOT_URL}" "${SYSROOT_RELATIVE_FOLDER}" |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 137 | |
| 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 Chatelet | 6da37f5 | 2018-02-16 15:09:51 +0100 | [diff] [blame] | 141 | CMAKE_ADDITIONAL_ARGS+=" -DCROSS=${TARGET}-" |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 142 | 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 Chatelet | c1de7c9 | 2018-02-15 14:16:25 +0100 | [diff] [blame] | 147 | } |
| 148 | |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 149 | function expand_environment_and_integrate() { |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 150 | assert_defined PROJECT_FOLDER |
| 151 | assert_defined TARGET |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 152 | |
| 153 | BUILD_DIR="${PROJECT_FOLDER}/cmake_build/${TARGET}" |
Guillaume Chatelet | 894c2dc | 2018-02-16 16:45:33 +0100 | [diff] [blame] | 154 | mkdir -p "${BUILD_DIR}" |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 155 | |
| 156 | CMAKE_ADDITIONAL_ARGS="" |
| 157 | QEMU_ARGS="" |
| 158 | |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 159 | case ${TOOLCHAIN} in |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 160 | LINARO) expand_linaro_config ;; |
| 161 | CODESCAPE) expand_codescape_config ;; |
| 162 | NATIVE) QEMU_ARCH="" ;; |
| 163 | *) |
| 164 | echo "Unknown toolchain '${TOOLCHAIN}'..." |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 165 | exit 1 |
| 166 | esac |
Guillaume Chatelet | 6446b42 | 2018-02-16 14:17:10 +0100 | [diff] [blame] | 167 | integrate |
Guillaume Chatelet | 245c812 | 2018-02-15 13:51:08 +0100 | [diff] [blame] | 168 | } |
Guillaume Chatelet | 59cb104 | 2018-02-15 13:57:06 +0100 | [diff] [blame] | 169 | |
| 170 | if [ "${CONTINUOUS_INTEGRATION}" = "true" ]; then |
Guillaume Chatelet | c1de7c9 | 2018-02-15 14:16:25 +0100 | [diff] [blame] | 171 | QEMU_ARCHES=${QEMU_ARCH} |
Guillaume Chatelet | 59cb104 | 2018-02-15 13:57:06 +0100 | [diff] [blame] | 172 | expand_environment_and_integrate |
| 173 | fi |