blob: fd88d605e29e20949bc5fb504508f1dbc66dc228 [file] [log] [blame]
Guillaume Chateleta897bf82019-01-15 10:36:17 +01001#!/usr/bin/env bash
Guillaume Chateleta25b5cb2018-02-14 09:41:51 +01002
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 Chatelet89ec4b02019-01-18 11:48:06 +010030 rm -f "${ARCHIVE_NAME}"
Guillaume Chatelet245c8122018-02-15 13:51:08 +010031 fi
32}
33
Guillaume Chatelet245c8122018-02-15 13:51:08 +010034function installqemuifneeded() {
35 local VERSION=${QEMU_VERSION:=2.11.1}
Guillaume Chatelet53ea2432019-01-21 22:40:16 +010036 local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mips mipsel mips64 mips64el}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010037 local TARGETS=${QEMU_TARGETS:=$(echo "$ARCHES" | sed 's#$# #;s#\([^ ]*\) #\1-linux-user #g')}
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010038
Guillaume Chatelet245c8122018-02-15 13:51:08 +010039 if echo "${VERSION} ${TARGETS}" | cmp --silent ${QEMU_INSTALL}/.build -; then
40 echo "qemu ${VERSION} up to date!"
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010041 return 0
42 fi
43
Guillaume Chatelet245c8122018-02-15 13:51:08 +010044 echo "VERSION: ${VERSION}"
45 echo "TARGETS: ${TARGETS}"
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010046
Guillaume Chatelet245c8122018-02-15 13:51:08 +010047 rm -rf ${QEMU_INSTALL}
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010048
49 # Checking for a tarball before downloading makes testing easier :-)
Guillaume Chatelet245c8122018-02-15 13:51:08 +010050 local QEMU_URL="http://wiki.qemu-project.org/download/qemu-${VERSION}.tar.xz"
51 local QEMU_FOLDER="qemu-${VERSION}"
52 unpackifnotexists ${QEMU_URL} ${QEMU_FOLDER}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010053 cd ${QEMU_FOLDER} || exit
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010054
55 ./configure \
Guillaume Chatelet245c8122018-02-15 13:51:08 +010056 --prefix="${QEMU_INSTALL}" \
57 --target-list="${TARGETS}" \
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010058 --disable-docs \
59 --disable-sdl \
60 --disable-gtk \
61 --disable-gnutls \
62 --disable-gcrypt \
63 --disable-nettle \
64 --disable-curses \
65 --static
66
67 make -j4
68 make install
69
Guillaume Chatelet245c8122018-02-15 13:51:08 +010070 echo "$VERSION $TARGETS" > ${QEMU_INSTALL}/.build
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010071}
72
Guillaume Chatelet245c8122018-02-15 13:51:08 +010073function assert_defined(){
Guillaume Chatelet6446b422018-02-16 14:17:10 +010074 local VALUE=${1}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +010075 : "${VALUE?"${1} needs to be defined"}"
Guillaume Chatelet5a9819c2018-02-14 14:34:46 +010076}
77
Guillaume Chatelet6446b422018-02-16 14:17:10 +010078function integrate() {
Guillaume Chatelet1da4bf22019-01-15 17:39:44 +010079 cd "${PROJECT_FOLDER}"
80 case "${OS}" in
81 "Windows_NT") CMAKE_BUILD_ARGS="--config Debug --target ALL_BUILD"
Guillaume Chatelet53ea2432019-01-21 22:40:16 +010082 CMAKE_TEST_FILES="${BUILD_DIR}/test/Debug/*_test.exe"
Guillaume Chatelet1da4bf22019-01-15 17:39:44 +010083 DEMO=${BUILD_DIR}/Debug/list_cpu_features.exe
84 ;;
85 *) CMAKE_BUILD_ARGS="--target all"
Guillaume Chatelet53ea2432019-01-21 22:40:16 +010086 CMAKE_TEST_FILES="${BUILD_DIR}/test/*_test"
Guillaume Chatelet1da4bf22019-01-15 17:39:44 +010087 DEMO=${BUILD_DIR}/list_cpu_features
88 ;;
89 esac
Guillaume Chatelet245c8122018-02-15 13:51:08 +010090
Guillaume Chatelet1da4bf22019-01-15 17:39:44 +010091 # Generating CMake configuration
Guillaume Chatelet53ea2432019-01-21 22:40:16 +010092 cmake -H. -B"${BUILD_DIR}" ${DEFAULT_CMAKE_ARGS} "${CMAKE_ADDITIONAL_ARGS[@]}" -G"${CMAKE_GENERATOR:-Unix Makefiles}"
Guillaume Chatelet1da4bf22019-01-15 17:39:44 +010093
94 # Building
95 cmake --build "${BUILD_DIR}" ${CMAKE_BUILD_ARGS}
96
97 # Running tests if needed
98 if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then
99 return
Guillaume Chateleta25b5cb2018-02-14 09:41:51 +0100100 fi
Guillaume Chatelet1ee19cd2019-01-17 15:04:14 +0100101 RUN_CMD=""
Guillaume Chatelet1da4bf22019-01-15 17:39:44 +0100102 if [[ -n "${QEMU_ARCH}" ]]; then
103 installqemuifneeded
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100104 RUN_CMD="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} ${QEMU_ARGS[@]}"
Guillaume Chatelet1da4bf22019-01-15 17:39:44 +0100105 fi
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100106 for test_binary in ${CMAKE_TEST_FILES}; do
107 ${RUN_CMD} ${test_binary}
Guillaume Chatelet1ee19cd2019-01-17 15:04:14 +0100108 done
Guillaume Chatelet718647a2019-01-17 15:12:01 +0100109 ${RUN_CMD} ${DEMO}
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100110}
111
112function expand_linaro_config() {
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100113 assert_defined TARGET
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100114 local LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100115
116 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 +0100117 local GCC_RELATIVE_FOLDER="gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}"
118 unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}"
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100119
120 local SYSROOT_URL=${LINARO_ROOT_URL}/${TARGET}/sysroot-glibc-linaro-2.25-2017.11-${TARGET}.tar.xz
121 local SYSROOT_RELATIVE_FOLDER=sysroot-glibc-linaro-2.25-2017.11-${TARGET}
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +0100122 unpackifnotexists "${SYSROOT_URL}" "${SYSROOT_RELATIVE_FOLDER}"
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100123
124 local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${SYSROOT_RELATIVE_FOLDER}
125 local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}
126
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100127 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_SYSTEM_NAME=Linux)
128 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_SYSTEM_PROCESSOR=${TARGET})
Guillaume Chatelet5177c692019-01-15 10:19:06 +0100129
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100130 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_SYSROOT=${SYSROOT_FOLDER})
131 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_C_COMPILER=${GCC_FOLDER}/bin/${TARGET}-gcc)
132 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_CXX_COMPILER=${GCC_FOLDER}/bin/${TARGET}-g++)
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100133
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100134 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER)
135 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY)
136 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY)
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100137
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100138 QEMU_ARGS+=(-L ${SYSROOT_FOLDER})
139 QEMU_ARGS+=(-E LD_LIBRARY_PATH=/lib)
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100140}
141
Guillaume Chateletc1de7c92018-02-15 14:16:25 +0100142function expand_codescape_config() {
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100143 assert_defined TARGET
Guillaume Chatelet8ba03e92018-09-07 15:54:51 +0200144 local DATE=2017.10-08
145 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 +0100146 local GCC_URL=${CODESCAPE_URL}
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100147 local GCC_RELATIVE_FOLDER="mips-mti-linux-gnu/${DATE}"
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +0100148 unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}"
Guillaume Chateletc1de7c92018-02-15 14:16:25 +0100149
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100150 local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100151 local MIPS_FLAGS=""
152 local LIBC_FOLDER_SUFFIX=""
153 local FLAVOUR=""
154 case "${TARGET}" in
155 "mips32") MIPS_FLAGS="-EB -mabi=32"; FLAVOUR="mips-r2-hard"; LIBC_FOLDER_SUFFIX="lib" ;;
156 "mips32el") MIPS_FLAGS="-EL -mabi=32"; FLAVOUR="mipsel-r2-hard"; LIBC_FOLDER_SUFFIX="lib" ;;
157 "mips64") MIPS_FLAGS="-EB -mabi=64"; FLAVOUR="mips-r2-hard"; LIBC_FOLDER_SUFFIX="lib64" ;;
158 "mips64el") MIPS_FLAGS="-EL -mabi=64"; FLAVOUR="mipsel-r2-hard"; LIBC_FOLDER_SUFFIX="lib64" ;;
159 *) echo 'unknown mips platform'; exit 1;;
160 esac
161
Guillaume Chatelet96133902019-01-25 15:25:19 +0100162 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_FIND_ROOT_PATH=${GCC_FOLDER})
163 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_SYSTEM_NAME=Linux)
164 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_SYSTEM_PROCESSOR=${TARGET})
165 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_C_COMPILER=mips-mti-linux-gnu-gcc)
166 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_CXX_COMPILER=mips-mti-linux-gnu-g++)
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100167 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_C_COMPILER_ARG1="${MIPS_FLAGS}")
168 CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_CXX_COMPILER_ARG1="${MIPS_FLAGS}")
169
170 local SYSROOT_FOLDER=${GCC_FOLDER}/sysroot/${FLAVOUR}
Guillaume Chatelet96133902019-01-25 15:25:19 +0100171
172 # Keeping only the sysroot of interest to save on travis cache.
173 if [[ "${CONTINUOUS_INTEGRATION}" = "true" ]]; then
174 for folder in ${GCC_FOLDER}/sysroot/*; do
175 if [[ "${folder}" != "${SYSROOT_FOLDER}" ]]; then
176 rm -rf ${folder}
177 fi
178 done
179 fi
180
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100181 local LIBC_FOLDER=${GCC_FOLDER}/mips-mti-linux-gnu/lib/${FLAVOUR}/${LIBC_FOLDER_SUFFIX}
182 QEMU_ARGS+=(-L ${SYSROOT_FOLDER})
183 QEMU_ARGS+=(-E LD_PRELOAD=${LIBC_FOLDER}/libstdc++.so.6:${LIBC_FOLDER}/libgcc_s.so.1)
Guillaume Chateletc1de7c92018-02-15 14:16:25 +0100184}
185
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100186function expand_environment_and_integrate() {
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100187 assert_defined PROJECT_FOLDER
188 assert_defined TARGET
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100189
190 BUILD_DIR="${PROJECT_FOLDER}/cmake_build/${TARGET}"
Guillaume Chatelet894c2dc2018-02-16 16:45:33 +0100191 mkdir -p "${BUILD_DIR}"
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100192
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100193 declare -a CONFIG_NAMES=()
194 declare -a QEMU_ARGS=()
Guillaume Chatelet51693b82019-01-22 09:06:14 +0100195 declare -a CMAKE_ADDITIONAL_ARGS=()
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100196
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100197 case ${TOOLCHAIN} in
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100198 LINARO) expand_linaro_config ;;
199 CODESCAPE) expand_codescape_config ;;
200 NATIVE) QEMU_ARCH="" ;;
Guillaume Chatelet53ea2432019-01-21 22:40:16 +0100201 *) echo "Unknown toolchain '${TOOLCHAIN}'..."; exit 1;;
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100202 esac
Guillaume Chatelet6446b422018-02-16 14:17:10 +0100203 integrate
Guillaume Chatelet245c8122018-02-15 13:51:08 +0100204}
Guillaume Chatelet59cb1042018-02-15 13:57:06 +0100205
206if [ "${CONTINUOUS_INTEGRATION}" = "true" ]; then
Guillaume Chateletc1de7c92018-02-15 14:16:25 +0100207 QEMU_ARCHES=${QEMU_ARCH}
Guillaume Chatelet59cb1042018-02-15 13:57:06 +0100208 expand_environment_and_integrate
209fi