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