From a25b5cbe7e8300f0da85473bc1099360d834dd9c Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Wed, 14 Feb 2018 09:41:51 +0100 Subject: [PATCH 01/14] Test travis cross compilation --- .travis.yml | 32 +++++++++++++++------- cmake/arm-linux-gnueabihf.cmake | 18 +++++++++++++ scripts/run_integration.sh | 47 +++++++++++++++++++++++++++++++++ scripts/setup_qemu.sh | 40 ++++++++++++++++++++++++++++ scripts/setup_toolchain.sh | 20 ++++++++++++++ 5 files changed, 147 insertions(+), 10 deletions(-) create mode 100644 cmake/arm-linux-gnueabihf.cmake create mode 100755 scripts/run_integration.sh create mode 100755 scripts/setup_qemu.sh create mode 100755 scripts/setup_toolchain.sh diff --git a/.travis.yml b/.travis.yml index 8edbf1e..cd0a357 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,28 @@ -sudo: required language: c -os: - - linux - - osx +sudo: false -compiler: - - clang - - gcc +cache: + directories: + - $HOME/qemu + +matrix: + include: + - os: linux + compiler: gcc + - os: linux + compiler: clang + - os: osx + compiler: gcc + - os: osx + compiler: clang + - os: linux + env: + CROSS_COMPILE=1 + TOOLCHAIN_NAME=gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf + TARGET=arm-linux-gnueabihf + QEMU_ARCH=arm script: - cmake --version - - cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -H. -Bcmake_build - - cmake --build cmake_build --target all - - CTEST_OUTPUT_ON_FAILURE=1 cmake --build cmake_build --target test + - bash -e -x ./scripts/run_integration.sh diff --git a/cmake/arm-linux-gnueabihf.cmake b/cmake/arm-linux-gnueabihf.cmake new file mode 100644 index 0000000..42e6d91 --- /dev/null +++ b/cmake/arm-linux-gnueabihf.cmake @@ -0,0 +1,18 @@ +SET(CMAKE_SYSTEM_NAME Linux) +SET(CMAKE_SYSTEM_VERSION 1) + +# specify the cross compiler +SET(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc -mfloat-abi=hard) +SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ -mfloat-abi=hard) +SET(CMAKE_AR arm-linux-gnueabihf-ar CACHE FILEPATH "Archiver") + +SET(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by CMakeLists.txt." FORCE) + +# where is the target environment +SET(CMAKE_FIND_ROOT_PATH $ENV{TOOLCHAIN}) + +# search for programs in the build host directories +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh new file mode 100755 index 0000000..0882d78 --- /dev/null +++ b/scripts/run_integration.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +export BUILD_DIR=cmake_build +export CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -H. -B${BUILD_DIR}" + +SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P) +PROJECT_FOLDER=${SCRIPT_FOLDER}/.. +cd ${PROJECT_FOLDER} + +if [[ -n "${CROSS_COMPILE}" ]]; then + # Cross compilation + : "${TOOLCHAIN_NAME:?Need to set TOOLCHAIN_NAME non-empty}" + : "${TARGET:?Need to set TARGET non-empty}" + : "${QEMU_ARCH:?Need to set QEMU_ARCH non-empty}" + ${SCRIPT_FOLDER}/setup_qemu.sh + ${SCRIPT_FOLDER}/setup_toolchain.sh + export TOOLCHAIN=${HOME}/${TOOLCHAIN_NAME} + export PATH=${TOOLCHAIN}/bin:${HOME}/qemu/bin:${PATH} + export CMAKE_TOOLCHAIN_FILE=cmake/${TARGET}.cmake + if [[ ! -f ${CMAKE_TOOLCHAIN_FILE} ]]; then + echo "Missing cmake toolchain file : $CMAKE_TOOLCHAIN_FILE" + exit 1 + fi + # Generate makefile + cmake ${CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + # Compile + cmake --build ${BUILD_DIR} --target all + # Run tests + export QEMU=qemu-${QEMU_ARCH} + export QEMU_LD_PREFIX=${TOOLCHAIN}/${TARGET}/libc + export LD_LIBRARY_PATH=${TOOLCHAIN}/${TARGET}/libc + for test_binary in ${BUILD_DIR}/test/*_test; do + ${QEMU} ${test_binary} + done + # Run demo program + ${QEMU} ${BUILD_DIR}/list_cpu_features +else + # Native compilation + # Generate makefile + cmake ${CMAKE_ARGS} + # Compile + cmake --build ${BUILD_DIR} --target all + # Run tests + CTEST_OUTPUT_ON_FAILURE=1 cmake --build ${BUILD_DIR} --target test + # Run demo program + ${BUILD_DIR}/list_cpu_features +fi diff --git a/scripts/setup_qemu.sh b/scripts/setup_qemu.sh new file mode 100755 index 0000000..8b850cc --- /dev/null +++ b/scripts/setup_qemu.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +set -e + +VERSION=${QEMU_VERSION:=2.11.0} +ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mipsel} +TARGETS=${QEMU_TARGETS:=$(echo $ARCHES | sed 's#$# #;s#\([^ ]*\) #\1-softmmu \1-linux-user #g')} + +if echo "$VERSION $TARGETS" | cmp --silent $HOME/qemu/.build -; then + echo "qemu $VERSION up to date!" + exit 0 +fi + +echo "VERSION: $VERSION" +echo "TARGETS: $TARGETS" + +cd $HOME +rm -rf qemu + +# Checking for a tarball before downloading makes testing easier :-) +test -f "qemu-$VERSION.tar.xz" || wget "http://wiki.qemu-project.org/download/qemu-$VERSION.tar.xz" +tar -xJf "qemu-$VERSION.tar.xz" +cd "qemu-$VERSION" + +./configure \ + --prefix="$HOME/qemu" \ + --target-list="$TARGETS" \ + --disable-docs \ + --disable-sdl \ + --disable-gtk \ + --disable-gnutls \ + --disable-gcrypt \ + --disable-nettle \ + --disable-curses \ + --static + +make -j4 +make install + +echo "$VERSION $TARGETS" > $HOME/qemu/.build diff --git a/scripts/setup_toolchain.sh b/scripts/setup_toolchain.sh new file mode 100755 index 0000000..908369e --- /dev/null +++ b/scripts/setup_toolchain.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -e + +: "${TOOLCHAIN_NAME:?Need to set TOOLCHAIN_NAME non-empty}" +: "${TARGET:?Need to set TARGET non-empty}" + +if [[ -d "$HOME/${TOOLCHAIN_NAME}/${TARGET}" ]] ; then + echo "toolchain ${TOOLCHAIN_NAME} ${TARGET} exists!" + exit 0 +fi + +export ARCHIVE_NAME=${TOOLCHAIN_NAME}.tar.xz + +echo "TOOLCHAIN: $TOOLCHAIN_NAME" +echo "TARGET : $TARGET" + +cd $HOME + +test -f "${ARCHIVE_NAME}" || wget https://releases.linaro.org/components/toolchain/binaries/latest/${TARGET}/${ARCHIVE_NAME} +tar -xJf ${ARCHIVE_NAME} From 5e016e4f1b81f8722dedd0e606840d20ca980c65 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Wed, 14 Feb 2018 09:59:29 +0100 Subject: [PATCH 02/14] Make toolchain persistent accross runs --- .travis.yml | 1 + scripts/run_integration.sh | 2 +- scripts/setup_toolchain.sh | 7 +++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index cd0a357..f703eca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ sudo: false cache: directories: - $HOME/qemu + - $HOME/toolchains matrix: include: diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index 0882d78..a1f5fa7 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -14,7 +14,7 @@ if [[ -n "${CROSS_COMPILE}" ]]; then : "${QEMU_ARCH:?Need to set QEMU_ARCH non-empty}" ${SCRIPT_FOLDER}/setup_qemu.sh ${SCRIPT_FOLDER}/setup_toolchain.sh - export TOOLCHAIN=${HOME}/${TOOLCHAIN_NAME} + export TOOLCHAIN=${HOME}/toolchains/${TOOLCHAIN_NAME} export PATH=${TOOLCHAIN}/bin:${HOME}/qemu/bin:${PATH} export CMAKE_TOOLCHAIN_FILE=cmake/${TARGET}.cmake if [[ ! -f ${CMAKE_TOOLCHAIN_FILE} ]]; then diff --git a/scripts/setup_toolchain.sh b/scripts/setup_toolchain.sh index 908369e..de20537 100755 --- a/scripts/setup_toolchain.sh +++ b/scripts/setup_toolchain.sh @@ -4,7 +4,8 @@ set -e : "${TOOLCHAIN_NAME:?Need to set TOOLCHAIN_NAME non-empty}" : "${TARGET:?Need to set TARGET non-empty}" -if [[ -d "$HOME/${TOOLCHAIN_NAME}/${TARGET}" ]] ; then + +if [[ -d "$HOME/toolchains/${TOOLCHAIN_NAME}/${TARGET}" ]] ; then echo "toolchain ${TOOLCHAIN_NAME} ${TARGET} exists!" exit 0 fi @@ -14,7 +15,9 @@ export ARCHIVE_NAME=${TOOLCHAIN_NAME}.tar.xz echo "TOOLCHAIN: $TOOLCHAIN_NAME" echo "TARGET : $TARGET" -cd $HOME +mkdir -p $HOME/toolchains +cd $HOME/toolchains test -f "${ARCHIVE_NAME}" || wget https://releases.linaro.org/components/toolchain/binaries/latest/${TARGET}/${ARCHIVE_NAME} tar -xJf ${ARCHIVE_NAME} +rm ${ARCHIVE_NAME} From bce8959aca554e63dc11efe38b3051c0f06aafde Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Wed, 14 Feb 2018 10:54:20 +0100 Subject: [PATCH 03/14] Add aarch64 cross compilation. --- cmake/aarch64-linux-gnu.cmake | 18 ++++++++++++++++++ cmake/arm-linux-gnueabihf.cmake | 2 +- scripts/run_integration.sh | 1 - 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 cmake/aarch64-linux-gnu.cmake diff --git a/cmake/aarch64-linux-gnu.cmake b/cmake/aarch64-linux-gnu.cmake new file mode 100644 index 0000000..e2a77e9 --- /dev/null +++ b/cmake/aarch64-linux-gnu.cmake @@ -0,0 +1,18 @@ +SET(CMAKE_SYSTEM_NAME Linux) +SET(CMAKE_SYSTEM_VERSION 1) + +# specify the cross compiler +SET(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) +SET(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) +SET(CMAKE_AR aarch64-linux-gnu-ar CACHE FILEPATH "Archiver") + +SET(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by CMakeLists.txt." FORCE) + +# where is the target environment +SET(CMAKE_FIND_ROOT_PATH $ENV{TOOLCHAIN}) + +# search for programs in the build host directories +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/cmake/arm-linux-gnueabihf.cmake b/cmake/arm-linux-gnueabihf.cmake index 42e6d91..5f9fd71 100644 --- a/cmake/arm-linux-gnueabihf.cmake +++ b/cmake/arm-linux-gnueabihf.cmake @@ -4,7 +4,7 @@ SET(CMAKE_SYSTEM_VERSION 1) # specify the cross compiler SET(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc -mfloat-abi=hard) SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ -mfloat-abi=hard) -SET(CMAKE_AR arm-linux-gnueabihf-ar CACHE FILEPATH "Archiver") +SET(CMAKE_AR arm-linux-gnueabihf-ar CACHE FILEPATH "Archiver") SET(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by CMakeLists.txt." FORCE) diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index a1f5fa7..7b16091 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -28,7 +28,6 @@ if [[ -n "${CROSS_COMPILE}" ]]; then # Run tests export QEMU=qemu-${QEMU_ARCH} export QEMU_LD_PREFIX=${TOOLCHAIN}/${TARGET}/libc - export LD_LIBRARY_PATH=${TOOLCHAIN}/${TARGET}/libc for test_binary in ${BUILD_DIR}/test/*_test; do ${QEMU} ${test_binary} done From 499786392e0e5cfa0d074582dc43060e8568b9ab Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Wed, 14 Feb 2018 10:57:34 +0100 Subject: [PATCH 04/14] update travis.yml.wq --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index f703eca..5e37fdc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,6 +23,12 @@ matrix: TOOLCHAIN_NAME=gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf TARGET=arm-linux-gnueabihf QEMU_ARCH=arm + - os: linux + env: + CROSS_COMPILE=1 + TOOLCHAIN_NAME=gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu + TARGET=aarch64-linux-gnu + QEMU_ARCH=aarch64 script: - cmake --version From 54e27126e6f33c07904931ecd30884b6cca8719b Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Wed, 14 Feb 2018 11:04:15 +0100 Subject: [PATCH 05/14] Cache is not shared between builds, prevent full qemu compilation --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5e37fdc..0830db5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,12 +22,14 @@ matrix: CROSS_COMPILE=1 TOOLCHAIN_NAME=gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf TARGET=arm-linux-gnueabihf + QEMU_ARCHES=arm QEMU_ARCH=arm - os: linux env: CROSS_COMPILE=1 TOOLCHAIN_NAME=gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu TARGET=aarch64-linux-gnu + QEMU_ARCHES=aarch64 QEMU_ARCH=aarch64 script: From 5a9819ce82dab2499a8aecfd77a1e95c9f21cb24 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Wed, 14 Feb 2018 14:34:46 +0100 Subject: [PATCH 06/14] Update cross compilation scripts. --- .travis.yml | 6 +- scripts/run_integration.sh | 123 +++++++++++++++++++++++++++++-------- scripts/setup_qemu.sh | 40 ------------ scripts/setup_toolchain.sh | 23 ------- 4 files changed, 101 insertions(+), 91 deletions(-) delete mode 100755 scripts/setup_qemu.sh delete mode 100755 scripts/setup_toolchain.sh diff --git a/.travis.yml b/.travis.yml index 0830db5..be15d71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,15 +19,13 @@ matrix: compiler: clang - os: linux env: - CROSS_COMPILE=1 - TOOLCHAIN_NAME=gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf + LINARO_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabihf/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz TARGET=arm-linux-gnueabihf QEMU_ARCHES=arm QEMU_ARCH=arm - os: linux env: - CROSS_COMPILE=1 - TOOLCHAIN_NAME=gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu + LINARO_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabihf/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz TARGET=aarch64-linux-gnu QEMU_ARCHES=aarch64 QEMU_ARCH=aarch64 diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index 7b16091..065f250 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -1,44 +1,119 @@ #!/bin/bash -export BUILD_DIR=cmake_build -export CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -H. -B${BUILD_DIR}" +set -e +set -x + +############################################################################### +# Ensures qemu is compiled in $HOME/qemu. +# Input: +# - QEMU_VERSION, the version of qemu to use. +# - QEMU_ARCHES, the list of architectures qemu should support. +function setup_qemu() { + local VERSION=${QEMU_VERSION:=2.11.0} + local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mipsel} + local TARGETS=${QEMU_TARGETS:=$(echo $ARCHES | sed 's#$# #;s#\([^ ]*\) #\1-softmmu \1-linux-user #g')} + + if echo "$VERSION $TARGETS" | cmp --silent $HOME/qemu/.build -; then + echo "qemu $VERSION up to date!" + return 0 + fi + + echo "VERSION: $VERSION" + echo "TARGETS: $TARGETS" + + cd $HOME + rm -rf qemu + + # Checking for a tarball before downloading makes testing easier :-) + test -f "qemu-$VERSION.tar.xz" || wget "http://wiki.qemu-project.org/download/qemu-$VERSION.tar.xz" + tar -xJf "qemu-$VERSION.tar.xz" + cd "qemu-$VERSION" + + ./configure \ + --prefix="$HOME/qemu" \ + --target-list="$TARGETS" \ + --disable-docs \ + --disable-sdl \ + --disable-gtk \ + --disable-gnutls \ + --disable-gcrypt \ + --disable-nettle \ + --disable-curses \ + --static + + make -j4 + make install + + echo "$VERSION $TARGETS" > $HOME/qemu/.build +} + +############################################################################### +# Ensures the linaro toolchain is available in $HOME/toolchains. +# Input: +# - LINARO_URL, the url of the of the x86_64 gcc tarball. +function get_linaro_toolchain_folder() { + local LINARO_URL_NO_HTTPS=${LINARO_URL#https:} + local ARCHIVE_NAME=${LINARO_URL_NO_HTTPS##/*/} + local TOOLCHAIN_NAME=${ARCHIVE_NAME%.tar.*} + local TOOLCHAIN_HOME=${HOME}/toolchains + local TOOLCHAIN_FOLDER="${TOOLCHAIN_HOME}/${TOOLCHAIN_NAME}" + if [[ ! -d "${TOOLCHAIN_FOLDER}" ]] ; then + mkdir -p "${TOOLCHAIN_HOME}" + cd "${TOOLCHAIN_HOME}" + wget ${LINARO_URL} + tar -xJf ${ARCHIVE_NAME} + rm ${ARCHIVE_NAME} + fi + echo ${TOOLCHAIN_FOLDER} +} + +############################################################################### SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P) -PROJECT_FOLDER=${SCRIPT_FOLDER}/.. +PROJECT_FOLDER="${SCRIPT_FOLDER}/.." cd ${PROJECT_FOLDER} -if [[ -n "${CROSS_COMPILE}" ]]; then +BUILD_DIR="${PROJECT_FOLDER}/cmake_build" +CMAKE_PATH="${PATH}" +CMAKE_ARGS="-H. -B${BUILD_DIR}" +CMAKE_ARGS+=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON" + +# +# Setup toolchain if necessary. +# +if [[ -n "${LINARO_URL}" ]]; then # Cross compilation - : "${TOOLCHAIN_NAME:?Need to set TOOLCHAIN_NAME non-empty}" : "${TARGET:?Need to set TARGET non-empty}" - : "${QEMU_ARCH:?Need to set QEMU_ARCH non-empty}" - ${SCRIPT_FOLDER}/setup_qemu.sh - ${SCRIPT_FOLDER}/setup_toolchain.sh - export TOOLCHAIN=${HOME}/toolchains/${TOOLCHAIN_NAME} - export PATH=${TOOLCHAIN}/bin:${HOME}/qemu/bin:${PATH} - export CMAKE_TOOLCHAIN_FILE=cmake/${TARGET}.cmake + TOOLCHAIN=`get_linaro_toolchain_folder` + CMAKE_TOOLCHAIN_FILE=cmake/${TARGET}.cmake if [[ ! -f ${CMAKE_TOOLCHAIN_FILE} ]]; then echo "Missing cmake toolchain file : $CMAKE_TOOLCHAIN_FILE" exit 1 fi - # Generate makefile - cmake ${CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - # Compile - cmake --build ${BUILD_DIR} --target all + CMAKE_ARGS+=" -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" + CMAKE_PATH="${TOOLCHAIN}/bin:${PATH}" +fi + +# Generate makefile +PATH=${CMAKE_PATH} cmake ${CMAKE_ARGS} +# Compile +PATH=${CMAKE_PATH} cmake --build ${BUILD_DIR} --target all + +# +# Tests +# +if [[ -n "${QEMU_ARCH}" ]]; then # Run tests - export QEMU=qemu-${QEMU_ARCH} - export QEMU_LD_PREFIX=${TOOLCHAIN}/${TARGET}/libc + QEMU_PATH="${HOME}/qemu/bin:${PATH}" + : "${QEMU_ARCH:?Need to set QEMU_ARCH non-empty}" + setup_qemu + QEMU="qemu-${QEMU_ARCH} -L ${TOOLCHAIN}/${TARGET}/libc" for test_binary in ${BUILD_DIR}/test/*_test; do - ${QEMU} ${test_binary} + PATH=${QEMU_PATH} ${QEMU} ${test_binary} done # Run demo program - ${QEMU} ${BUILD_DIR}/list_cpu_features + PATH=${QEMU_PATH} ${QEMU} ${BUILD_DIR}/list_cpu_features else - # Native compilation - # Generate makefile - cmake ${CMAKE_ARGS} - # Compile - cmake --build ${BUILD_DIR} --target all # Run tests CTEST_OUTPUT_ON_FAILURE=1 cmake --build ${BUILD_DIR} --target test # Run demo program diff --git a/scripts/setup_qemu.sh b/scripts/setup_qemu.sh deleted file mode 100755 index 8b850cc..0000000 --- a/scripts/setup_qemu.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -set -e - -VERSION=${QEMU_VERSION:=2.11.0} -ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mipsel} -TARGETS=${QEMU_TARGETS:=$(echo $ARCHES | sed 's#$# #;s#\([^ ]*\) #\1-softmmu \1-linux-user #g')} - -if echo "$VERSION $TARGETS" | cmp --silent $HOME/qemu/.build -; then - echo "qemu $VERSION up to date!" - exit 0 -fi - -echo "VERSION: $VERSION" -echo "TARGETS: $TARGETS" - -cd $HOME -rm -rf qemu - -# Checking for a tarball before downloading makes testing easier :-) -test -f "qemu-$VERSION.tar.xz" || wget "http://wiki.qemu-project.org/download/qemu-$VERSION.tar.xz" -tar -xJf "qemu-$VERSION.tar.xz" -cd "qemu-$VERSION" - -./configure \ - --prefix="$HOME/qemu" \ - --target-list="$TARGETS" \ - --disable-docs \ - --disable-sdl \ - --disable-gtk \ - --disable-gnutls \ - --disable-gcrypt \ - --disable-nettle \ - --disable-curses \ - --static - -make -j4 -make install - -echo "$VERSION $TARGETS" > $HOME/qemu/.build diff --git a/scripts/setup_toolchain.sh b/scripts/setup_toolchain.sh deleted file mode 100755 index de20537..0000000 --- a/scripts/setup_toolchain.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -e - -: "${TOOLCHAIN_NAME:?Need to set TOOLCHAIN_NAME non-empty}" -: "${TARGET:?Need to set TARGET non-empty}" - - -if [[ -d "$HOME/toolchains/${TOOLCHAIN_NAME}/${TARGET}" ]] ; then - echo "toolchain ${TOOLCHAIN_NAME} ${TARGET} exists!" - exit 0 -fi - -export ARCHIVE_NAME=${TOOLCHAIN_NAME}.tar.xz - -echo "TOOLCHAIN: $TOOLCHAIN_NAME" -echo "TARGET : $TARGET" - -mkdir -p $HOME/toolchains -cd $HOME/toolchains - -test -f "${ARCHIVE_NAME}" || wget https://releases.linaro.org/components/toolchain/binaries/latest/${TARGET}/${ARCHIVE_NAME} -tar -xJf ${ARCHIVE_NAME} -rm ${ARCHIVE_NAME} From 5ec8408da3661d149d4197f4c719aec989563717 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Wed, 14 Feb 2018 14:40:22 +0100 Subject: [PATCH 07/14] Fix invalid linaro url.wq --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index be15d71..9e387ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,7 @@ matrix: QEMU_ARCH=arm - os: linux env: - LINARO_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabihf/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz + LINARO_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/aarch64-linux-gnu/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz TARGET=aarch64-linux-gnu QEMU_ARCHES=aarch64 QEMU_ARCH=aarch64 From 245c812f108c5957f7e8172d03dc09ca688d8095 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Thu, 15 Feb 2018 13:51:08 +0100 Subject: [PATCH 08/14] Update cross compilation script --- .gitignore | 1 + .travis.yml | 61 ++++++++-- cmake/aarch64-linux-gnu.cmake | 18 --- cmake/arm-linux-gnueabihf.cmake | 18 --- scripts/run_integration.sh | 193 ++++++++++++++++++-------------- scripts/test_integration.sh | 72 ++++++++++++ 6 files changed, 234 insertions(+), 129 deletions(-) create mode 100644 .gitignore delete mode 100644 cmake/aarch64-linux-gnu.cmake delete mode 100644 cmake/arm-linux-gnueabihf.cmake create mode 100755 scripts/test_integration.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0690aa4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +cmake_build/ diff --git a/.travis.yml b/.travis.yml index 9e387ae..e98e80e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,31 +4,72 @@ sudo: false cache: directories: - - $HOME/qemu - - $HOME/toolchains + - $HOME/archives matrix: include: - os: linux compiler: gcc + env: + TOOLCHAIN=NATIVE + TARGET=native - os: linux compiler: clang + env: + TOOLCHAIN=NATIVE + TARGET=native - os: osx compiler: gcc + env: + TOOLCHAIN=NATIVE + TARGET=native - os: osx compiler: clang + env: + TOOLCHAIN=NATIVE + TARGET=native + # Toolchains for little-endian, 64-bit ARMv8 for GNU/Linux systems - os: linux env: - LINARO_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabihf/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz - TARGET=arm-linux-gnueabihf - QEMU_ARCHES=arm - QEMU_ARCH=arm - - os: linux - env: - LINARO_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/aarch64-linux-gnu/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz + TOOLCHAIN=LINARO TARGET=aarch64-linux-gnu - QEMU_ARCHES=aarch64 QEMU_ARCH=aarch64 + # Toolchains for little-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems + - os: linux + env: + TOOLCHAIN=LINARO + TARGET=arm-linux-gnueabihf + QEMU_ARCH=arm + # Toolchains for little-endian, 32-bit ARMv8 for GNU/Linux systems + - os: linux + env: + TOOLCHAIN=LINARO + TARGET=armv8l-linux-gnueabihf + QEMU_ARCH=arm + # Toolchains for little-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems + - os: linux + env: + TOOLCHAIN=LINARO + TARGET=arm-linux-gnueabi + QEMU_ARCH=arm + # Toolchains for big-endian, 64-bit ARMv8 for GNU/Linux systems + - os: linux + env: + TOOLCHAIN=LINARO + TARGET=aarch64_be-linux-gnu + QEMU_ARCH="" + # Toolchains for big-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems + - os: linux + env: + TOOLCHAIN=LINARO + TARGET=armeb-linux-gnueabihf + QEMU_ARCH="" + # Toolchains for big-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems + - os: linux + env: + TOOLCHAIN=LINARO + TARGET=armeb-linux-gnueabi + QEMU_ARCH="" script: - cmake --version diff --git a/cmake/aarch64-linux-gnu.cmake b/cmake/aarch64-linux-gnu.cmake deleted file mode 100644 index e2a77e9..0000000 --- a/cmake/aarch64-linux-gnu.cmake +++ /dev/null @@ -1,18 +0,0 @@ -SET(CMAKE_SYSTEM_NAME Linux) -SET(CMAKE_SYSTEM_VERSION 1) - -# specify the cross compiler -SET(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) -SET(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) -SET(CMAKE_AR aarch64-linux-gnu-ar CACHE FILEPATH "Archiver") - -SET(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by CMakeLists.txt." FORCE) - -# where is the target environment -SET(CMAKE_FIND_ROOT_PATH $ENV{TOOLCHAIN}) - -# search for programs in the build host directories -SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -# for libraries and headers in the target directories -SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/cmake/arm-linux-gnueabihf.cmake b/cmake/arm-linux-gnueabihf.cmake deleted file mode 100644 index 5f9fd71..0000000 --- a/cmake/arm-linux-gnueabihf.cmake +++ /dev/null @@ -1,18 +0,0 @@ -SET(CMAKE_SYSTEM_NAME Linux) -SET(CMAKE_SYSTEM_VERSION 1) - -# specify the cross compiler -SET(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc -mfloat-abi=hard) -SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ -mfloat-abi=hard) -SET(CMAKE_AR arm-linux-gnueabihf-ar CACHE FILEPATH "Archiver") - -SET(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by CMakeLists.txt." FORCE) - -# where is the target environment -SET(CMAKE_FIND_ROOT_PATH $ENV{TOOLCHAIN}) - -# search for programs in the build host directories -SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -# for libraries and headers in the target directories -SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index 065f250..4905ca6 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -1,37 +1,59 @@ #!/bin/bash -set -e -set -x +SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P) +PROJECT_FOLDER="${SCRIPT_FOLDER}/.." +ARCHIVE_FOLDER=~/archives +QEMU_INSTALL=${ARCHIVE_FOLDER}/qemu +DEFAULT_CMAKE_ARGS=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON" -############################################################################### -# Ensures qemu is compiled in $HOME/qemu. -# Input: -# - QEMU_VERSION, the version of qemu to use. -# - QEMU_ARCHES, the list of architectures qemu should support. -function setup_qemu() { - local VERSION=${QEMU_VERSION:=2.11.0} +function extract() { + case $1 in + *.tar.bz2) tar xjf $1 ;; + *.tar.xz) tar xJf $1 ;; + *.tar.gz) tar xzf $1 ;; + *) + echo "don't know how to extract '$1'..." + exit 1 + esac +} + +function unpackifnotexists() { + mkdir -p ${ARCHIVE_FOLDER} + cd ${ARCHIVE_FOLDER} + local URL=$1 + local DESTINATION=`pwd`/$2 + if [[ ! -d "${DESTINATION}" ]] ; then + local ARCHIVE_NAME=`echo ${URL} | sed 's/.*\///'` + test -f ${ARCHIVE_NAME} || wget ${URL} + extract ${ARCHIVE_NAME} + fi +} + + +function installqemuifneeded() { + local VERSION=${QEMU_VERSION:=2.11.1} local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mipsel} - local TARGETS=${QEMU_TARGETS:=$(echo $ARCHES | sed 's#$# #;s#\([^ ]*\) #\1-softmmu \1-linux-user #g')} + local TARGETS=${QEMU_TARGETS:=$(echo $ARCHES | sed 's#$# #;s#\([^ ]*\) #\1-linux-user #g')} - if echo "$VERSION $TARGETS" | cmp --silent $HOME/qemu/.build -; then - echo "qemu $VERSION up to date!" + if echo "${VERSION} ${TARGETS}" | cmp --silent ${QEMU_INSTALL}/.build -; then + echo "qemu ${VERSION} up to date!" return 0 fi - echo "VERSION: $VERSION" - echo "TARGETS: $TARGETS" + echo "VERSION: ${VERSION}" + echo "TARGETS: ${TARGETS}" - cd $HOME - rm -rf qemu + rm -rf ${QEMU_INSTALL} # Checking for a tarball before downloading makes testing easier :-) - test -f "qemu-$VERSION.tar.xz" || wget "http://wiki.qemu-project.org/download/qemu-$VERSION.tar.xz" - tar -xJf "qemu-$VERSION.tar.xz" - cd "qemu-$VERSION" + local QEMU_URL="http://wiki.qemu-project.org/download/qemu-${VERSION}.tar.xz" + local QEMU_FOLDER="qemu-${VERSION}" + unpackifnotexists ${QEMU_URL} ${QEMU_FOLDER} + cd ${QEMU_FOLDER} ./configure \ - --prefix="$HOME/qemu" \ - --target-list="$TARGETS" \ + --prefix="${QEMU_INSTALL}" \ + --target-list="${TARGETS}" \ --disable-docs \ --disable-sdl \ --disable-gtk \ @@ -44,78 +66,83 @@ function setup_qemu() { make -j4 make install - echo "$VERSION $TARGETS" > $HOME/qemu/.build + echo "$VERSION $TARGETS" > ${QEMU_INSTALL}/.build } -############################################################################### -# Ensures the linaro toolchain is available in $HOME/toolchains. -# Input: -# - LINARO_URL, the url of the of the x86_64 gcc tarball. -function get_linaro_toolchain_folder() { - local LINARO_URL_NO_HTTPS=${LINARO_URL#https:} - local ARCHIVE_NAME=${LINARO_URL_NO_HTTPS##/*/} - local TOOLCHAIN_NAME=${ARCHIVE_NAME%.tar.*} - local TOOLCHAIN_HOME=${HOME}/toolchains - local TOOLCHAIN_FOLDER="${TOOLCHAIN_HOME}/${TOOLCHAIN_NAME}" - if [[ ! -d "${TOOLCHAIN_FOLDER}" ]] ; then - mkdir -p "${TOOLCHAIN_HOME}" - cd "${TOOLCHAIN_HOME}" - wget ${LINARO_URL} - tar -xJf ${ARCHIVE_NAME} - rm ${ARCHIVE_NAME} - fi - echo ${TOOLCHAIN_FOLDER} +function assert_defined(){ + : ${1?Needs to be defined} } -############################################################################### +function integrate_cross() { + assert_defined ${GCC_URL} + assert_defined ${GCC_RELATIVE_FOLDER} + assert_defined ${SYSROOT_URL} + assert_defined ${SYSROOT_RELATIVE_FOLDER} -SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P) -PROJECT_FOLDER="${SCRIPT_FOLDER}/.." -cd ${PROJECT_FOLDER} + unpackifnotexists ${GCC_URL} ${GCC_RELATIVE_FOLDER} + unpackifnotexists ${SYSROOT_URL} ${SYSROOT_RELATIVE_FOLDER} -BUILD_DIR="${PROJECT_FOLDER}/cmake_build" -CMAKE_PATH="${PATH}" -CMAKE_ARGS="-H. -B${BUILD_DIR}" -CMAKE_ARGS+=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON" + local CMAKE_ARGS=${DEFAULT_CMAKE_ARGS} -# -# Setup toolchain if necessary. -# -if [[ -n "${LINARO_URL}" ]]; then - # Cross compilation - : "${TARGET:?Need to set TARGET non-empty}" - TOOLCHAIN=`get_linaro_toolchain_folder` - CMAKE_TOOLCHAIN_FILE=cmake/${TARGET}.cmake - if [[ ! -f ${CMAKE_TOOLCHAIN_FILE} ]]; then - echo "Missing cmake toolchain file : $CMAKE_TOOLCHAIN_FILE" - exit 1 + # Update cmake args for cross compilation. + local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${SYSROOT_RELATIVE_FOLDER} + local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER} + CMAKE_ARGS+=" -DCMAKE_SYSROOT=${SYSROOT_FOLDER}" + CMAKE_ARGS+=" -DCMAKE_C_COMPILER=${GCC_FOLDER}/bin/${TARGET}-gcc" + CMAKE_ARGS+=" -DCMAKE_CXX_COMPILER=${GCC_FOLDER}/bin/${TARGET}-g++" + + cd ${PROJECT_FOLDER} + cmake -H. -B${BUILD_DIR} ${CMAKE_ARGS} + cmake --build ${BUILD_DIR} --target all + + if [[ -n "${QEMU_ARCH}" ]]; then + installqemuifneeded + QEMU="qemu-${QEMU_ARCH} -L ${SYSROOT_FOLDER}" + # Run tests + for test_binary in ${BUILD_DIR}/test/*_test; do ${QEMU} ${test_binary}; done + # Run demo program + ${QEMU} ${BUILD_DIR}/list_cpu_features fi - CMAKE_ARGS+=" -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" - CMAKE_PATH="${TOOLCHAIN}/bin:${PATH}" -fi +} -# Generate makefile -PATH=${CMAKE_PATH} cmake ${CMAKE_ARGS} -# Compile -PATH=${CMAKE_PATH} cmake --build ${BUILD_DIR} --target all +function integrate_native() { + local CMAKE_ARGS=${DEFAULT_CMAKE_ARGS} -# -# Tests -# -if [[ -n "${QEMU_ARCH}" ]]; then + cd ${PROJECT_FOLDER} + cmake -H. -B${BUILD_DIR} ${CMAKE_ARGS} + cmake --build ${BUILD_DIR} --target all + # Run tests - QEMU_PATH="${HOME}/qemu/bin:${PATH}" - : "${QEMU_ARCH:?Need to set QEMU_ARCH non-empty}" - setup_qemu - QEMU="qemu-${QEMU_ARCH} -L ${TOOLCHAIN}/${TARGET}/libc" - for test_binary in ${BUILD_DIR}/test/*_test; do - PATH=${QEMU_PATH} ${QEMU} ${test_binary} - done - # Run demo program - PATH=${QEMU_PATH} ${QEMU} ${BUILD_DIR}/list_cpu_features -else - # Run tests - CTEST_OUTPUT_ON_FAILURE=1 cmake --build ${BUILD_DIR} --target test + for test_binary in ${BUILD_DIR}/test/*_test; do ${test_binary}; done # Run demo program ${BUILD_DIR}/list_cpu_features -fi +} + +function expand_linaro_config() { + assert_defined ${TARGET} + local LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11 + GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}.tar.xz + GCC_RELATIVE_FOLDER=gcc-linaro-7.2.1-2017.11-x86_64_${TARGET} + SYSROOT_URL=${LINARO_ROOT_URL}/${TARGET}/sysroot-glibc-linaro-2.25-2017.11-${TARGET}.tar.xz + SYSROOT_RELATIVE_FOLDER=sysroot-glibc-linaro-2.25-2017.11-${TARGET} +} + +function expand_environment_and_integrate() { + assert_defined ${PROJECT_FOLDER} + assert_defined ${TARGET} + + BUILD_DIR="${PROJECT_FOLDER}/cmake_build/${TARGET}" + mkdir -p ${BUILD_DIR} + + case ${TOOLCHAIN} in + LINARO) + expand_linaro_config + integrate_cross + ;; + NATIVE) + integrate_native + ;; + *) echo "Unknown toolchain '${TOOLCHAIN}'..." + exit 1 + esac +} diff --git a/scripts/test_integration.sh b/scripts/test_integration.sh new file mode 100755 index 0000000..1324dac --- /dev/null +++ b/scripts/test_integration.sh @@ -0,0 +1,72 @@ +source "$(dirname -- "$0")"/run_integration.sh + +# Toolchains for little-endian, 64-bit ARMv8 for GNU/Linux systems +function set_aarch64-linux-gnu() { + TOOLCHAIN=LINARO + TARGET=aarch64-linux-gnu + QEMU_ARCH=aarch64 +} + +# Toolchains for little-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems +function set_arm-linux-gnueabihf() { + TOOLCHAIN=LINARO + TARGET=arm-linux-gnueabihf + QEMU_ARCH=arm +} + +# Toolchains for little-endian, 32-bit ARMv8 for GNU/Linux systems +function set_armv8l-linux-gnueabihf() { + TOOLCHAIN=LINARO + TARGET=armv8l-linux-gnueabihf + QEMU_ARCH=arm +} + +# Toolchains for little-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems +function set_arm-linux-gnueabi() { + TOOLCHAIN=LINARO + TARGET=arm-linux-gnueabi + QEMU_ARCH=arm +} + +# Toolchains for big-endian, 64-bit ARMv8 for GNU/Linux systems +function set_aarch64_be-linux-gnu() { + TOOLCHAIN=LINARO + TARGET=aarch64_be-linux-gnu + QEMU_ARCH="" +} + +# Toolchains for big-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems +function set_armeb-linux-gnueabihf() { + TOOLCHAIN=LINARO + TARGET=armeb-linux-gnueabihf + QEMU_ARCH="" +} + +# Toolchains for big-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems +function set_armeb-linux-gnueabi() { + TOOLCHAIN=LINARO + TARGET=armeb-linux-gnueabi + QEMU_ARCH="" +} + +function set_native() { + TOOLCHAIN=NATIVE + TARGET=native + QEMU_ARCH="" +} + +ENVIRONMENTS=" + set_aarch64-linux-gnu + set_arm-linux-gnueabihf + set_armv8l-linux-gnueabihf + set_arm-linux-gnueabi + set_aarch64_be-linux-gnu + set_armeb-linux-gnueabihf + set_armeb-linux-gnueabi + set_native +" + +for SET_ENVIRONMENT in ${ENVIRONMENTS}; do + ${SET_ENVIRONMENT} + expand_environment_and_integrate +done From 59cb104692f221cf8fb2e596f91ff9ac1dba2682 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Thu, 15 Feb 2018 13:57:06 +0100 Subject: [PATCH 09/14] Trigger build when run within travis --- scripts/run_integration.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index 4905ca6..2c46e52 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -146,3 +146,7 @@ function expand_environment_and_integrate() { exit 1 esac } + +if [ "${CONTINUOUS_INTEGRATION}" = "true" ]; then + expand_environment_and_integrate +fi From c1de7c935ebe01fd9fe5cc3dc684922a900e3572 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Thu, 15 Feb 2018 14:16:25 +0100 Subject: [PATCH 10/14] Update QEMU config and path --- scripts/run_integration.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index 2c46e52..9b21578 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -97,7 +97,7 @@ function integrate_cross() { if [[ -n "${QEMU_ARCH}" ]]; then installqemuifneeded - QEMU="qemu-${QEMU_ARCH} -L ${SYSROOT_FOLDER}" + QEMU="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} -L ${SYSROOT_FOLDER}" # Run tests for test_binary in ${BUILD_DIR}/test/*_test; do ${QEMU} ${test_binary}; done # Run demo program @@ -127,6 +127,13 @@ function expand_linaro_config() { SYSROOT_RELATIVE_FOLDER=sysroot-glibc-linaro-2.25-2017.11-${TARGET} } +function expand_codescape_config() { +http://codescape-mips-sdk.imgtec.com/components/toolchain/2016.05-03/Codescape.GNU.Tools.Package.2016.05-03.for.MIPS.MTI.Linux.CentOS-5.x86_64.tar.gz + assert_defined ${TARGET} + local LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11 + +} + function expand_environment_and_integrate() { assert_defined ${PROJECT_FOLDER} assert_defined ${TARGET} @@ -148,5 +155,6 @@ function expand_environment_and_integrate() { } if [ "${CONTINUOUS_INTEGRATION}" = "true" ]; then + QEMU_ARCHES=${QEMU_ARCH} expand_environment_and_integrate fi From 6446b425679c529bd93415ea13e9b58a8ead1a15 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Fri, 16 Feb 2018 14:17:10 +0100 Subject: [PATCH 11/14] Add Mips compilation support --- .travis.yml | 11 ++- cmake/mips32-linux-gcc.cmake | 34 +++++++++ scripts/run_integration.sh | 133 +++++++++++++++++++---------------- scripts/test_integration.sh | 18 ++++- 4 files changed, 130 insertions(+), 66 deletions(-) create mode 100644 cmake/mips32-linux-gcc.cmake diff --git a/.travis.yml b/.travis.yml index e98e80e..e849466 100644 --- a/.travis.yml +++ b/.travis.yml @@ -57,19 +57,24 @@ matrix: env: TOOLCHAIN=LINARO TARGET=aarch64_be-linux-gnu - QEMU_ARCH="" + QEMU_ARCH=DISABLED # Toolchains for big-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems - os: linux env: TOOLCHAIN=LINARO TARGET=armeb-linux-gnueabihf - QEMU_ARCH="" + QEMU_ARCH=DISABLED # Toolchains for big-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems - os: linux env: TOOLCHAIN=LINARO TARGET=armeb-linux-gnueabi - QEMU_ARCH="" + QEMU_ARCH=DISABLED + - os: linux + env: + TOOLCHAIN=CODESCAPE + TARGET=mips-mti-linux-gnu + QEMU_ARCH=DISABLED script: - cmake --version diff --git a/cmake/mips32-linux-gcc.cmake b/cmake/mips32-linux-gcc.cmake new file mode 100644 index 0000000..dcfab7c --- /dev/null +++ b/cmake/mips32-linux-gcc.cmake @@ -0,0 +1,34 @@ +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_PROCESSOR "mips32") + +if (ENABLE_DSPR2 AND ENABLE_MSA) + message(FATAL_ERROR "ENABLE_DSPR2 and ENABLE_MSA cannot be combined.") +endif () + +if (ENABLE_DSPR2) + set(HAVE_DSPR2 1 CACHE BOOL "" FORCE) + set(MIPS_CFLAGS "-mdspr2") + set(MIPS_CXXFLAGS "-mdspr2") +elseif (ENABLE_MSA) + set(HAVE_MSA 1 CACHE BOOL "" FORCE) + set(MIPS_CFLAGS "-mmsa") + set(MIPS_CXXFLAGS "-mmsa") +endif () + +if ("${MIPS_CPU}" STREQUAL "") + set(MIPS_CFLAGS "${MIPS_CFLAGS} -mips32r2") + set(MIPS_CXXFLAGS "${MIPS_CXXFLAGS} -mips32r2") +elseif ("${MIPS_CPU}" STREQUAL "p5600") + set(P56_FLAGS "-mips32r5 -mload-store-pairs -msched-weight -mhard-float -mfp64") + set(MIPS_CFLAGS "${MIPS_CFLAGS} ${P56_FLAGS}") + set(MIPS_CXXFLAGS "${MIPS_CXXFLAGS} ${P56_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS "-mfp64 ${CMAKE_EXE_LINKER_FLAGS}") +endif () + +set(CMAKE_C_COMPILER ${CROSS}gcc) +set(CMAKE_CXX_COMPILER ${CROSS}g++) +set(AS_EXECUTABLE ${CROSS}as) +set(CMAKE_C_COMPILER_ARG1 "-EL ${MIPS_CFLAGS}") +set(CMAKE_CXX_COMPILER_ARG1 "-EL ${MIPS_CXXFLAGS}") + +set(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by CMakeLists.txt." FORCE) diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index 9b21578..c1bd6b9 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -1,7 +1,7 @@ #!/bin/bash SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P) -PROJECT_FOLDER="${SCRIPT_FOLDER}/.." +PROJECT_FOLDER=`realpath "${SCRIPT_FOLDER}/.."` ARCHIVE_FOLDER=~/archives QEMU_INSTALL=${ARCHIVE_FOLDER}/qemu DEFAULT_CMAKE_ARGS=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON" @@ -29,10 +29,9 @@ function unpackifnotexists() { fi } - function installqemuifneeded() { local VERSION=${QEMU_VERSION:=2.11.1} - local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mipsel} + local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mips mipsel} local TARGETS=${QEMU_TARGETS:=$(echo $ARCHES | sed 's#$# #;s#\([^ ]*\) #\1-linux-user #g')} if echo "${VERSION} ${TARGETS}" | cmp --silent ${QEMU_INSTALL}/.build -; then @@ -70,88 +69,102 @@ function installqemuifneeded() { } function assert_defined(){ - : ${1?Needs to be defined} + local VALUE=${1} + : ${VALUE?"${1} needs to be defined"} } -function integrate_cross() { - assert_defined ${GCC_URL} - assert_defined ${GCC_RELATIVE_FOLDER} - assert_defined ${SYSROOT_URL} - assert_defined ${SYSROOT_RELATIVE_FOLDER} - - unpackifnotexists ${GCC_URL} ${GCC_RELATIVE_FOLDER} - unpackifnotexists ${SYSROOT_URL} ${SYSROOT_RELATIVE_FOLDER} - - local CMAKE_ARGS=${DEFAULT_CMAKE_ARGS} - - # Update cmake args for cross compilation. - local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${SYSROOT_RELATIVE_FOLDER} - local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER} - CMAKE_ARGS+=" -DCMAKE_SYSROOT=${SYSROOT_FOLDER}" - CMAKE_ARGS+=" -DCMAKE_C_COMPILER=${GCC_FOLDER}/bin/${TARGET}-gcc" - CMAKE_ARGS+=" -DCMAKE_CXX_COMPILER=${GCC_FOLDER}/bin/${TARGET}-g++" - +function integrate() { cd ${PROJECT_FOLDER} - cmake -H. -B${BUILD_DIR} ${CMAKE_ARGS} - cmake --build ${BUILD_DIR} --target all + cmake -H. -B${BUILD_DIR} ${DEFAULT_CMAKE_ARGS} ${CMAKE_ADDITIONAL_ARGS} + cmake --build ${BUILD_DIR} --target all -- -j `nproc` if [[ -n "${QEMU_ARCH}" ]]; then - installqemuifneeded - QEMU="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} -L ${SYSROOT_FOLDER}" - # Run tests - for test_binary in ${BUILD_DIR}/test/*_test; do ${QEMU} ${test_binary}; done - # Run demo program - ${QEMU} ${BUILD_DIR}/list_cpu_features + if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then + QEMU="true || " + else + installqemuifneeded + QEMU="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} ${QEMU_ARGS}" + fi + else + QEMU="" fi -} - -function integrate_native() { - local CMAKE_ARGS=${DEFAULT_CMAKE_ARGS} - - cd ${PROJECT_FOLDER} - cmake -H. -B${BUILD_DIR} ${CMAKE_ARGS} - cmake --build ${BUILD_DIR} --target all - # Run tests - for test_binary in ${BUILD_DIR}/test/*_test; do ${test_binary}; done + for test_binary in ${BUILD_DIR}/test/*_test; do ${QEMU} ${test_binary}; done # Run demo program - ${BUILD_DIR}/list_cpu_features + ${QEMU} ${BUILD_DIR}/list_cpu_features } function expand_linaro_config() { - assert_defined ${TARGET} + assert_defined TARGET local LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11 - GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}.tar.xz - GCC_RELATIVE_FOLDER=gcc-linaro-7.2.1-2017.11-x86_64_${TARGET} - SYSROOT_URL=${LINARO_ROOT_URL}/${TARGET}/sysroot-glibc-linaro-2.25-2017.11-${TARGET}.tar.xz - SYSROOT_RELATIVE_FOLDER=sysroot-glibc-linaro-2.25-2017.11-${TARGET} + + local GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}.tar.xz + local GCC_RELATIVE_FOLDER=gcc-linaro-7.2.1-2017.11-x86_64_${TARGET} + unpackifnotexists ${GCC_URL} ${GCC_RELATIVE_FOLDER} + + local SYSROOT_URL=${LINARO_ROOT_URL}/${TARGET}/sysroot-glibc-linaro-2.25-2017.11-${TARGET}.tar.xz + local SYSROOT_RELATIVE_FOLDER=sysroot-glibc-linaro-2.25-2017.11-${TARGET} + unpackifnotexists ${SYSROOT_URL} ${SYSROOT_RELATIVE_FOLDER} + + local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${SYSROOT_RELATIVE_FOLDER} + local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER} + + CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_SYSROOT=${SYSROOT_FOLDER}" + CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_C_COMPILER=${GCC_FOLDER}/bin/${TARGET}-gcc" + CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_CXX_COMPILER=${GCC_FOLDER}/bin/${TARGET}-g++" + + CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER" + CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY" + CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY" + + QEMU_ARGS+=" -L ${SYSROOT_FOLDER}" + QEMU_ARGS+=" -E LD_LIBRARY_PATH=/lib" } function expand_codescape_config() { -http://codescape-mips-sdk.imgtec.com/components/toolchain/2016.05-03/Codescape.GNU.Tools.Package.2016.05-03.for.MIPS.MTI.Linux.CentOS-5.x86_64.tar.gz - assert_defined ${TARGET} - local LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11 + assert_defined TARGET + local FLAVOUR=${QEMU_ARCH}-r2-hard + local DATE=2016.05-03 + 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 + + local GCC_URL=${CODESCAPE_URL} + local GCC_RELATIVE_FOLDER=mips-mti-linux-gnu/${DATE} + unpackifnotexists ${GCC_URL} ${GCC_RELATIVE_FOLDER} + local SYSROOT_URL=${CODESCAPE_URL} + local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}/sysroot/${FLAVOUR} + unpackifnotexists ${SYSROOT_URL} ${SYSROOT_RELATIVE_FOLDER} + + CMAKE_ADDITIONAL_ARGS+=" -DENABLE_MSA=1" + CMAKE_ADDITIONAL_ARGS+=" -DMIPS_CPU=p5600" + CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_TOOLCHAIN_FILE=cmake/mips32-linux-gcc.cmake" + CMAKE_ADDITIONAL_ARGS+=" -DCROSS=mips-mti-linux-gnu-" + CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}" + + QEMU_ARGS+=" -L ${SYSROOT_FOLDER}" + QEMU_ARGS+=" -E LD_LIBRARY_PATH=/lib" + QEMU_ARGS+=" -cpu P5600" } function expand_environment_and_integrate() { - assert_defined ${PROJECT_FOLDER} - assert_defined ${TARGET} + assert_defined PROJECT_FOLDER + assert_defined TARGET BUILD_DIR="${PROJECT_FOLDER}/cmake_build/${TARGET}" mkdir -p ${BUILD_DIR} - + + CMAKE_ADDITIONAL_ARGS="" + QEMU_ARGS="" + case ${TOOLCHAIN} in - LINARO) - expand_linaro_config - integrate_cross - ;; - NATIVE) - integrate_native - ;; - *) echo "Unknown toolchain '${TOOLCHAIN}'..." + LINARO) expand_linaro_config ;; + CODESCAPE) expand_codescape_config ;; + NATIVE) QEMU_ARCH="" ;; + *) + echo "Unknown toolchain '${TOOLCHAIN}'..." exit 1 esac + integrate } if [ "${CONTINUOUS_INTEGRATION}" = "true" ]; then diff --git a/scripts/test_integration.sh b/scripts/test_integration.sh index 1324dac..c98ed06 100755 --- a/scripts/test_integration.sh +++ b/scripts/test_integration.sh @@ -32,21 +32,28 @@ function set_arm-linux-gnueabi() { function set_aarch64_be-linux-gnu() { TOOLCHAIN=LINARO TARGET=aarch64_be-linux-gnu - QEMU_ARCH="" + QEMU_ARCH="DISABLED" } # Toolchains for big-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems function set_armeb-linux-gnueabihf() { TOOLCHAIN=LINARO TARGET=armeb-linux-gnueabihf - QEMU_ARCH="" + QEMU_ARCH="DISABLED" } # Toolchains for big-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems function set_armeb-linux-gnueabi() { TOOLCHAIN=LINARO TARGET=armeb-linux-gnueabi - QEMU_ARCH="" + QEMU_ARCH="DISABLED" +} + + +function set_mips() { + TOOLCHAIN=CODESCAPE + TARGET=mips-mti-linux-gnu + QEMU_ARCH="DISABLED" } function set_native() { @@ -64,8 +71,13 @@ ENVIRONMENTS=" set_armeb-linux-gnueabihf set_armeb-linux-gnueabi set_native + set_mips " +# ENVIRONMENTS=" +# set_mips +# " + for SET_ENVIRONMENT in ${ENVIRONMENTS}; do ${SET_ENVIRONMENT} expand_environment_and_integrate From 9233afb83bc26ebfe7659b5d5fb4beb808a3a300 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Fri, 16 Feb 2018 14:38:05 +0100 Subject: [PATCH 12/14] Remove non standard tools --- scripts/run_integration.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index c1bd6b9..7225032 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -1,10 +1,10 @@ #!/bin/bash -SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P) -PROJECT_FOLDER=`realpath "${SCRIPT_FOLDER}/.."` -ARCHIVE_FOLDER=~/archives -QEMU_INSTALL=${ARCHIVE_FOLDER}/qemu -DEFAULT_CMAKE_ARGS=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON" +readonly SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P) +readonly PROJECT_FOLDER="${SCRIPT_FOLDER}/.." +readonly ARCHIVE_FOLDER=~/archives +readonly QEMU_INSTALL=${ARCHIVE_FOLDER}/qemu +readonly DEFAULT_CMAKE_ARGS=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON" function extract() { case $1 in @@ -76,7 +76,7 @@ function assert_defined(){ function integrate() { cd ${PROJECT_FOLDER} cmake -H. -B${BUILD_DIR} ${DEFAULT_CMAKE_ARGS} ${CMAKE_ADDITIONAL_ARGS} - cmake --build ${BUILD_DIR} --target all -- -j `nproc` + cmake --build ${BUILD_DIR} --target all if [[ -n "${QEMU_ARCH}" ]]; then if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then From 6da37f5dd07fe522d00ea281b1919c9cdecd8145 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Fri, 16 Feb 2018 15:09:51 +0100 Subject: [PATCH 13/14] Factor in mips-mti-linux-gnu for mips --- scripts/run_integration.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index 7225032..b66521b 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -128,7 +128,7 @@ function expand_codescape_config() { 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 local GCC_URL=${CODESCAPE_URL} - local GCC_RELATIVE_FOLDER=mips-mti-linux-gnu/${DATE} + local GCC_RELATIVE_FOLDER=${TARGET}/${DATE} unpackifnotexists ${GCC_URL} ${GCC_RELATIVE_FOLDER} local SYSROOT_URL=${CODESCAPE_URL} @@ -138,7 +138,7 @@ function expand_codescape_config() { CMAKE_ADDITIONAL_ARGS+=" -DENABLE_MSA=1" CMAKE_ADDITIONAL_ARGS+=" -DMIPS_CPU=p5600" CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_TOOLCHAIN_FILE=cmake/mips32-linux-gcc.cmake" - CMAKE_ADDITIONAL_ARGS+=" -DCROSS=mips-mti-linux-gnu-" + CMAKE_ADDITIONAL_ARGS+=" -DCROSS=${TARGET}-" CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}" QEMU_ARGS+=" -L ${SYSROOT_FOLDER}" From 894c2dc1a71ac2d4043518b597d831cf6b1e424c Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Fri, 16 Feb 2018 16:45:33 +0100 Subject: [PATCH 14/14] Fix shellcheck warnings. --- .travis.yml | 2 +- scripts/run_integration.sh | 47 +++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/.travis.yml b/.travis.yml index e849466..22b0d1e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ sudo: false cache: directories: - - $HOME/archives + - $HOME/cpu_features_archives matrix: include: diff --git a/scripts/run_integration.sh b/scripts/run_integration.sh index b66521b..23755ef 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -2,15 +2,15 @@ readonly SCRIPT_FOLDER=$(cd -P -- "$(dirname -- "$0")" && pwd -P) readonly PROJECT_FOLDER="${SCRIPT_FOLDER}/.." -readonly ARCHIVE_FOLDER=~/archives +readonly ARCHIVE_FOLDER=~/cpu_features_archives readonly QEMU_INSTALL=${ARCHIVE_FOLDER}/qemu readonly DEFAULT_CMAKE_ARGS=" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON" function extract() { case $1 in - *.tar.bz2) tar xjf $1 ;; - *.tar.xz) tar xJf $1 ;; - *.tar.gz) tar xzf $1 ;; + *.tar.bz2) tar xjf "$1" ;; + *.tar.xz) tar xJf "$1" ;; + *.tar.gz) tar xzf "$1" ;; *) echo "don't know how to extract '$1'..." exit 1 @@ -18,21 +18,22 @@ function extract() { } function unpackifnotexists() { - mkdir -p ${ARCHIVE_FOLDER} - cd ${ARCHIVE_FOLDER} + mkdir -p "${ARCHIVE_FOLDER}" + cd "${ARCHIVE_FOLDER}" || exit local URL=$1 - local DESTINATION=`pwd`/$2 + local RELATIVE_FOLDER=$2 + local DESTINATION="${ARCHIVE_FOLDER}/${RELATIVE_FOLDER}" if [[ ! -d "${DESTINATION}" ]] ; then - local ARCHIVE_NAME=`echo ${URL} | sed 's/.*\///'` - test -f ${ARCHIVE_NAME} || wget ${URL} - extract ${ARCHIVE_NAME} + local ARCHIVE_NAME=$(echo ${URL} | sed 's/.*\///') + test -f "${ARCHIVE_NAME}" || wget -q "${URL}" + extract "${ARCHIVE_NAME}" fi } function installqemuifneeded() { local VERSION=${QEMU_VERSION:=2.11.1} local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mips mipsel} - local TARGETS=${QEMU_TARGETS:=$(echo $ARCHES | sed 's#$# #;s#\([^ ]*\) #\1-linux-user #g')} + local TARGETS=${QEMU_TARGETS:=$(echo "$ARCHES" | sed 's#$# #;s#\([^ ]*\) #\1-linux-user #g')} if echo "${VERSION} ${TARGETS}" | cmp --silent ${QEMU_INSTALL}/.build -; then echo "qemu ${VERSION} up to date!" @@ -48,7 +49,7 @@ function installqemuifneeded() { local QEMU_URL="http://wiki.qemu-project.org/download/qemu-${VERSION}.tar.xz" local QEMU_FOLDER="qemu-${VERSION}" unpackifnotexists ${QEMU_URL} ${QEMU_FOLDER} - cd ${QEMU_FOLDER} + cd ${QEMU_FOLDER} || exit ./configure \ --prefix="${QEMU_INSTALL}" \ @@ -70,13 +71,13 @@ function installqemuifneeded() { function assert_defined(){ local VALUE=${1} - : ${VALUE?"${1} needs to be defined"} + : "${VALUE?"${1} needs to be defined"}" } function integrate() { - cd ${PROJECT_FOLDER} - cmake -H. -B${BUILD_DIR} ${DEFAULT_CMAKE_ARGS} ${CMAKE_ADDITIONAL_ARGS} - cmake --build ${BUILD_DIR} --target all + cd "${PROJECT_FOLDER}" || exit + cmake -H. -B"${BUILD_DIR}" ${DEFAULT_CMAKE_ARGS} ${CMAKE_ADDITIONAL_ARGS} + cmake --build "${BUILD_DIR}" --target all if [[ -n "${QEMU_ARCH}" ]]; then if [[ "${QEMU_ARCH}" == "DISABLED" ]]; then @@ -91,7 +92,7 @@ function integrate() { # Run tests for test_binary in ${BUILD_DIR}/test/*_test; do ${QEMU} ${test_binary}; done # Run demo program - ${QEMU} ${BUILD_DIR}/list_cpu_features + ${QEMU} "${BUILD_DIR}/list_cpu_features" } function expand_linaro_config() { @@ -99,12 +100,12 @@ function expand_linaro_config() { local LINARO_ROOT_URL=https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11 local GCC_URL=${LINARO_ROOT_URL}/${TARGET}/gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}.tar.xz - local GCC_RELATIVE_FOLDER=gcc-linaro-7.2.1-2017.11-x86_64_${TARGET} - unpackifnotexists ${GCC_URL} ${GCC_RELATIVE_FOLDER} + local GCC_RELATIVE_FOLDER="gcc-linaro-7.2.1-2017.11-x86_64_${TARGET}" + unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}" local SYSROOT_URL=${LINARO_ROOT_URL}/${TARGET}/sysroot-glibc-linaro-2.25-2017.11-${TARGET}.tar.xz local SYSROOT_RELATIVE_FOLDER=sysroot-glibc-linaro-2.25-2017.11-${TARGET} - unpackifnotexists ${SYSROOT_URL} ${SYSROOT_RELATIVE_FOLDER} + unpackifnotexists "${SYSROOT_URL}" "${SYSROOT_RELATIVE_FOLDER}" local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${SYSROOT_RELATIVE_FOLDER} local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER} @@ -129,11 +130,11 @@ function expand_codescape_config() { local GCC_URL=${CODESCAPE_URL} local GCC_RELATIVE_FOLDER=${TARGET}/${DATE} - unpackifnotexists ${GCC_URL} ${GCC_RELATIVE_FOLDER} + unpackifnotexists "${GCC_URL}" "${GCC_RELATIVE_FOLDER}" local SYSROOT_URL=${CODESCAPE_URL} local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}/sysroot/${FLAVOUR} - unpackifnotexists ${SYSROOT_URL} ${SYSROOT_RELATIVE_FOLDER} + unpackifnotexists "${SYSROOT_URL}" "${SYSROOT_RELATIVE_FOLDER}" CMAKE_ADDITIONAL_ARGS+=" -DENABLE_MSA=1" CMAKE_ADDITIONAL_ARGS+=" -DMIPS_CPU=p5600" @@ -151,7 +152,7 @@ function expand_environment_and_integrate() { assert_defined TARGET BUILD_DIR="${PROJECT_FOLDER}/cmake_build/${TARGET}" - mkdir -p ${BUILD_DIR} + mkdir -p "${BUILD_DIR}" CMAKE_ADDITIONAL_ARGS="" QEMU_ARGS=""