3 readonly SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
4 readonly PROJECT_FOLDER="${SCRIPT_FOLDER}/.."
5 readonly ARCHIVE_FOLDER=~/cpu_features_archives
6 readonly QEMU_INSTALL=${ARCHIVE_FOLDER}/qemu
7 readonly DEFAULT_CMAKE_ARGS=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON"
11 *.tar.bz2) tar xjf "$1" ;;
12 *.tar.xz) tar xJf "$1" ;;
13 *.tar.gz) tar xzf "$1" ;;
15 echo "don't know how to extract '$1'..."
20 function unpackifnotexists() {
21 mkdir -p "${ARCHIVE_FOLDER}"
22 cd "${ARCHIVE_FOLDER}" || exit
24 local RELATIVE_FOLDER=$2
25 local DESTINATION="${ARCHIVE_FOLDER}/${RELATIVE_FOLDER}"
26 if [[ ! -d "${DESTINATION}" ]] ; then
27 local ARCHIVE_NAME=$(echo ${URL} | sed 's/.*\///')
28 test -f "${ARCHIVE_NAME}" || wget -q "${URL}"
29 extract "${ARCHIVE_NAME}"
33 function installqemuifneeded() {
34 local VERSION=${QEMU_VERSION:=2.11.1}
35 local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mips mipsel}
36 local TARGETS=${QEMU_TARGETS:=$(echo "$ARCHES" | sed 's#$# #;s#\([^ ]*\) #\1-linux-user #g')}
38 if echo "${VERSION} ${TARGETS}" | cmp --silent ${QEMU_INSTALL}/.build -; then
39 echo "qemu ${VERSION} up to date!"
43 echo "VERSION: ${VERSION}"
44 echo "TARGETS: ${TARGETS}"
46 rm -rf ${QEMU_INSTALL}
48 # Checking for a tarball before downloading makes testing easier :-)
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}
52 cd ${QEMU_FOLDER} || exit
55 --prefix="${QEMU_INSTALL}" \
56 --target-list="${TARGETS}" \
69 echo "$VERSION $TARGETS" > ${QEMU_INSTALL}/.build
72 function assert_defined(){
74 : "${VALUE?"${1} needs to be defined"}"
77 function integrate() {
78 cd "${PROJECT_FOLDER}" || exit
79 cmake -H. -B"${BUILD_DIR}" ${DEFAULT_CMAKE_ARGS} ${CMAKE_ADDITIONAL_ARGS}
80 cmake --build "${BUILD_DIR}" --target all
82 if [[ -n "${QEMU_ARCH}" ]]; then
83 if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then
87 QEMU="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} ${QEMU_ARGS}"
93 for test_binary in ${BUILD_DIR}/test/*_test; do ${QEMU} ${test_binary}; done
95 ${QEMU} "${BUILD_DIR}/list_cpu_features"
98 function expand_linaro_config() {
100 local LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11
102 local GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}.tar.xz
103 local GCC_RELATIVE_FOLDER="gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}"
104 unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}"
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}
108 unpackifnotexists "${SYSROOT_URL}" "${SYSROOT_RELATIVE_FOLDER}"
110 local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${SYSROOT_RELATIVE_FOLDER}
111 local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}
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++"
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"
121 QEMU_ARGS+=" -L ${SYSROOT_FOLDER}"
122 QEMU_ARGS+=" -E LD_LIBRARY_PATH=/lib"
125 function expand_codescape_config() {
126 assert_defined TARGET
127 local FLAVOUR=${QEMU_ARCH}-r2-hard
128 local DATE=2016.05-03
129 local CODESCAPE_URL=http://codescape-mips-sdk.imgtec.com/components/toolchain/${DATE}/Codescape.GNU.Tools.Package.${DATE}.for.MIPS.MTI.Linux.CentOS-5.x86_64.tar.gz
130 local GCC_URL=${CODESCAPE_URL}
131 local GCC_RELATIVE_FOLDER=${TARGET}/${DATE}
132 unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}"
134 local SYSROOT_URL=${CODESCAPE_URL}
135 local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}/sysroot/${FLAVOUR}
136 unpackifnotexists "${SYSROOT_URL}" "${SYSROOT_RELATIVE_FOLDER}"
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"
141 CMAKE_ADDITIONAL_ARGS+=" -DCROSS=${TARGET}-"
142 CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}"
144 QEMU_ARGS+=" -L ${SYSROOT_FOLDER}"
145 QEMU_ARGS+=" -E LD_LIBRARY_PATH=/lib"
146 QEMU_ARGS+=" -cpu P5600"
149 function expand_environment_and_integrate() {
150 assert_defined PROJECT_FOLDER
151 assert_defined TARGET
153 BUILD_DIR="${PROJECT_FOLDER}/cmake_build/${TARGET}"
154 mkdir -p "${BUILD_DIR}"
156 CMAKE_ADDITIONAL_ARGS=""
160 LINARO) expand_linaro_config ;;
161 CODESCAPE) expand_codescape_config ;;
162 NATIVE) QEMU_ARCH="" ;;
164 echo "Unknown toolchain '${TOOLCHAIN}'..."
170 if [ "${CONTINUOUS_INTEGRATION}" = "true" ]; then
171 QEMU_ARCHES=${QEMU_ARCH}
172 expand_environment_and_integrate