From 53ea243a62d503281e5a93c414e238b7441a113c Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Mon, 21 Jan 2019 22:40:16 +0100 Subject: [PATCH] Fix mips qemu (#61) * Fix continuous integration for mips * Fix MSVC build * Fix MSVC build --- .travis.yml | 19 ++++++++- cmake/mips32-linux-gcc.cmake | 34 --------------- scripts/run_integration.sh | 80 +++++++++++++++++++++--------------- scripts/test_integration.sh | 29 +++++++++++-- 4 files changed, 89 insertions(+), 73 deletions(-) delete mode 100644 cmake/mips32-linux-gcc.cmake diff --git a/.travis.yml b/.travis.yml index 0af6c9d..e0b4f44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -94,8 +94,23 @@ matrix: - os: linux env: TOOLCHAIN=CODESCAPE - TARGET=mips-mti-linux-gnu - QEMU_ARCH=DISABLED + TARGET=mips32 + QEMU_ARCH=mips + - os: linux + env: + TOOLCHAIN=CODESCAPE + TARGET=mips32el + QEMU_ARCH=mipsel + - os: linux + env: + TOOLCHAIN=CODESCAPE + TARGET=mips64 + QEMU_ARCH=mips64 + - os: linux + env: + TOOLCHAIN=CODESCAPE + TARGET=mips64el + QEMU_ARCH=mips64el script: - cmake --version diff --git a/cmake/mips32-linux-gcc.cmake b/cmake/mips32-linux-gcc.cmake deleted file mode 100644 index dcfab7c..0000000 --- a/cmake/mips32-linux-gcc.cmake +++ /dev/null @@ -1,34 +0,0 @@ -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 f4d1534..8ecdb1d 100755 --- a/scripts/run_integration.sh +++ b/scripts/run_integration.sh @@ -33,7 +33,7 @@ function unpackifnotexists() { function installqemuifneeded() { local VERSION=${QEMU_VERSION:=2.11.1} - local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mips mipsel} + local ARCHES=${QEMU_ARCHES:=arm aarch64 i386 x86_64 mips mipsel mips64 mips64el} local TARGETS=${QEMU_TARGETS:=$(echo "$ARCHES" | sed 's#$# #;s#\([^ ]*\) #\1-linux-user #g')} if echo "${VERSION} ${TARGETS}" | cmp --silent ${QEMU_INSTALL}/.build -; then @@ -79,17 +79,17 @@ function integrate() { cd "${PROJECT_FOLDER}" case "${OS}" in "Windows_NT") CMAKE_BUILD_ARGS="--config Debug --target ALL_BUILD" - CMAKE_TEST_ARGS="--config Debug --target RUN_TESTS" + CMAKE_TEST_FILES="${BUILD_DIR}/test/Debug/*_test.exe" DEMO=${BUILD_DIR}/Debug/list_cpu_features.exe ;; *) CMAKE_BUILD_ARGS="--target all" - CMAKE_TEST_ARGS="--target test" + CMAKE_TEST_FILES="${BUILD_DIR}/test/*_test" DEMO=${BUILD_DIR}/list_cpu_features ;; esac # Generating CMake configuration - cmake -H. -B"${BUILD_DIR}" ${DEFAULT_CMAKE_ARGS} ${CMAKE_ADDITIONAL_ARGS} -G"${CMAKE_GENERATOR:-Unix Makefiles}" + cmake -H. -B"${BUILD_DIR}" ${DEFAULT_CMAKE_ARGS} "${CMAKE_ADDITIONAL_ARGS[@]}" -G"${CMAKE_GENERATOR:-Unix Makefiles}" # Building cmake --build "${BUILD_DIR}" ${CMAKE_BUILD_ARGS} @@ -101,10 +101,10 @@ function integrate() { RUN_CMD="" if [[ -n "${QEMU_ARCH}" ]]; then installqemuifneeded - RUN_CMD="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} ${QEMU_ARGS}" + RUN_CMD="${QEMU_INSTALL}/bin/qemu-${QEMU_ARCH} ${QEMU_ARGS[@]}" fi - for test_binary in ${BUILD_DIR}/test/*_test; do - ${RUN_CMD} ${test_binary} & + for test_binary in ${CMAKE_TEST_FILES}; do + ${RUN_CMD} ${test_binary} done ${RUN_CMD} ${DEMO} } @@ -124,19 +124,19 @@ function expand_linaro_config() { local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${SYSROOT_RELATIVE_FOLDER} local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER} - CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_SYSTEM_NAME=Linux" - CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_SYSTEM_PROCESSOR=${TARGET}" + CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_SYSTEM_NAME=Linux) + CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_SYSTEM_PROCESSOR=${TARGET}) - 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_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" + 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" + QEMU_ARGS+=(-L ${SYSROOT_FOLDER}) + QEMU_ARGS+=(-E LD_LIBRARY_PATH=/lib) } function expand_codescape_config() { @@ -144,20 +144,36 @@ function expand_codescape_config() { local DATE=2017.10-08 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 local GCC_URL=${CODESCAPE_URL} - local GCC_RELATIVE_FOLDER=${TARGET}/${DATE} + local GCC_RELATIVE_FOLDER="mips-mti-linux-gnu/${DATE}" unpackifnotexists "${GCC_URL}" "${GCC_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=${TARGET}-" - CMAKE_ADDITIONAL_ARGS+=" -DCMAKE_FIND_ROOT_PATH=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}" + local GCC_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER} + CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_FIND_ROOT_PATH=${GCC_FOLDER}) - local FLAVOUR=${QEMU_ARCH}-r2-hard - local SYSROOT_FOLDER=${ARCHIVE_FOLDER}/${GCC_RELATIVE_FOLDER}/sysroot/${FLAVOUR} - QEMU_ARGS+=" -L ${SYSROOT_FOLDER}" - QEMU_ARGS+=" -E LD_LIBRARY_PATH=/lib" - QEMU_ARGS+=" -cpu P5600" + CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_SYSTEM_NAME=Linux) + CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_SYSTEM_PROCESSOR=${TARGET}) + + CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_C_COMPILER=mips-mti-linux-gnu-gcc) + CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_CXX_COMPILER=mips-mti-linux-gnu-g++) + + local MIPS_FLAGS="" + local LIBC_FOLDER_SUFFIX="" + local FLAVOUR="" + case "${TARGET}" in + "mips32") MIPS_FLAGS="-EB -mabi=32"; FLAVOUR="mips-r2-hard"; LIBC_FOLDER_SUFFIX="lib" ;; + "mips32el") MIPS_FLAGS="-EL -mabi=32"; FLAVOUR="mipsel-r2-hard"; LIBC_FOLDER_SUFFIX="lib" ;; + "mips64") MIPS_FLAGS="-EB -mabi=64"; FLAVOUR="mips-r2-hard"; LIBC_FOLDER_SUFFIX="lib64" ;; + "mips64el") MIPS_FLAGS="-EL -mabi=64"; FLAVOUR="mipsel-r2-hard"; LIBC_FOLDER_SUFFIX="lib64" ;; + *) echo 'unknown mips platform'; exit 1;; + esac + + CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_C_COMPILER_ARG1="${MIPS_FLAGS}") + CMAKE_ADDITIONAL_ARGS+=(-DCMAKE_CXX_COMPILER_ARG1="${MIPS_FLAGS}") + + local SYSROOT_FOLDER=${GCC_FOLDER}/sysroot/${FLAVOUR} + local LIBC_FOLDER=${GCC_FOLDER}/mips-mti-linux-gnu/lib/${FLAVOUR}/${LIBC_FOLDER_SUFFIX} + QEMU_ARGS+=(-L ${SYSROOT_FOLDER}) + QEMU_ARGS+=(-E LD_PRELOAD=${LIBC_FOLDER}/libstdc++.so.6:${LIBC_FOLDER}/libgcc_s.so.1) } function expand_environment_and_integrate() { @@ -167,16 +183,14 @@ function expand_environment_and_integrate() { BUILD_DIR="${PROJECT_FOLDER}/cmake_build/${TARGET}" mkdir -p "${BUILD_DIR}" - CMAKE_ADDITIONAL_ARGS="" - QEMU_ARGS="" + declare -a CONFIG_NAMES=() + declare -a QEMU_ARGS=() case ${TOOLCHAIN} in LINARO) expand_linaro_config ;; CODESCAPE) expand_codescape_config ;; NATIVE) QEMU_ARCH="" ;; - *) - echo "Unknown toolchain '${TOOLCHAIN}'..." - exit 1 + *) echo "Unknown toolchain '${TOOLCHAIN}'..."; exit 1;; esac integrate } diff --git a/scripts/test_integration.sh b/scripts/test_integration.sh index 97c6a76..d1c61b0 100755 --- a/scripts/test_integration.sh +++ b/scripts/test_integration.sh @@ -51,10 +51,28 @@ function set_armeb-linux-gnueabi() { QEMU_ARCH=DISABLED } -function set_mips() { +function set_mips32() { TOOLCHAIN=CODESCAPE - TARGET=mips-mti-linux-gnu - QEMU_ARCH=DISABLED + TARGET=mips32 + QEMU_ARCH=mips +} + +function set_mips32el() { + TOOLCHAIN=CODESCAPE + TARGET=mips32el + QEMU_ARCH=mipsel +} + +function set_mips64() { + TOOLCHAIN=CODESCAPE + TARGET=mips64 + QEMU_ARCH=mips64 +} + +function set_mips64el() { + TOOLCHAIN=CODESCAPE + TARGET=mips64el + QEMU_ARCH=mips64el } function set_native() { @@ -71,8 +89,11 @@ ENVIRONMENTS=" set_aarch64_be-linux-gnu set_armeb-linux-gnueabihf set_armeb-linux-gnueabi + set_mips32 + set_mips32el + set_mips64 + set_mips64el set_native - set_mips " set -e