mirror of
https://github.com/qemu/qemu.git
synced 2025-01-25 06:53:29 +08:00
Code coverage and other build tweaks
- revert208ecb3e
(and drop filter for mingw, tweak for check-tcg) - some travis speed-ups - modernise code coverage support - docker image cleanups - clean-up binfmt_misc docker infrastructure - add debian-powerpc-user-cross image for ppc32 build -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEZoWumedRZ7yvyN81+9DbCVqeKkQFAls+QIIACgkQ+9DbCVqe KkT3nAf+JQIohMR4v+YPbuFGshzy89P2KrgTxWfA1EjVkfxCB2ida9vl5SzL4G3l jvINZhz6U2eUn/4Csx5Pempn3GUO/k7FKN0oG4s7Xu+KQQpCCRBIxdE/SchRKk+O Y9fYPTc8pvYEplAUzwwICFJtOBY0eFIYzA8oTZ+/lQ5YAsgC1ud31LdeN3/lh4J6 BPZ22WEydlC6r+ihh5HkL6+9HQN3+uPZuK3VqP1UrrZRvoL/LKcGip4WCh2iUxqE RdmNBwo6DPPsBUooBbkPZojGGAo3RTGV6kiekAbMcidd3xkNt+4WuBnChzn8xMyP j3W0pokX9gJ3gI4kxrzqk4ObQE/A5g== =N4gA -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stsquad/tags/pull-code-coverage-and-build-tweaks-050718-3' into staging Code coverage and other build tweaks - revert208ecb3e
(and drop filter for mingw, tweak for check-tcg) - some travis speed-ups - modernise code coverage support - docker image cleanups - clean-up binfmt_misc docker infrastructure - add debian-powerpc-user-cross image for ppc32 build # gpg: Signature made Thu 05 Jul 2018 17:00:02 BST # gpg: using RSA key FBD0DB095A9E2A44 # gpg: Good signature from "Alex Bennée (Master Work Key) <alex.bennee@linaro.org>" # Primary key fingerprint: 6685 AE99 E751 67BC AFC8 DF35 FBD0 DB09 5A9E 2A44 * remotes/stsquad/tags/pull-code-coverage-and-build-tweaks-050718-3: docker: add linux-user powered cross builder for QEMU docker: add special rule for deboostrapped images docker: add special handling for FROM:debian-%-user targets docker: debian-bootstrap.pre allow customising of variant/url docker: drop QEMU build-dep from bootstrap docker: Do not run tests in 'intermediate' images docker: Clean the MXE base image docker: ubuntu: Use SDL2 docker: ubuntu: Update the package list before installing new ones linux-user: add gcov support to preexit_cleanup linux-user: introduce preexit_cleanup build-system: add coverage-report target build-system: add clean-coverage target travis: add gcovr summary for GCOV build docker: add gcovr to travis image .gitignore: add .gcov files build-system: remove per-test GCOV reporting travis: test out-of-tree builds travis: do not waste time cloning unused submodules Revert "Makefile: Rename TARGET_DIRS to TARGET_LIST" Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
cee35138b5
1
.gitignore
vendored
1
.gitignore
vendored
@ -155,6 +155,7 @@
|
||||
.sdk
|
||||
*.gcda
|
||||
*.gcno
|
||||
*.gcov
|
||||
/pc-bios/bios-pq/status
|
||||
/pc-bios/vgabios-pq/status
|
||||
/pc-bios/optionrom/linuxboot.asm
|
||||
|
14
.travis.yml
14
.travis.yml
@ -38,6 +38,7 @@ addons:
|
||||
- libvte-2.90-dev
|
||||
- sparse
|
||||
- uuid-dev
|
||||
- gcovr
|
||||
|
||||
# The channel name "irc.oftc.net#qemu" is encrypted against qemu/qemu
|
||||
# to prevent IRC notifications from forks. This was created using:
|
||||
@ -50,6 +51,8 @@ notifications:
|
||||
on_failure: always
|
||||
env:
|
||||
global:
|
||||
- SRC_DIR="."
|
||||
- BUILD_DIR="."
|
||||
- TEST_CMD="make check"
|
||||
- MAKEFLAGS="-j3"
|
||||
matrix:
|
||||
@ -66,14 +69,17 @@ git:
|
||||
before_install:
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update ; fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install libffi gettext glib pixman ; fi
|
||||
- wget -O - http://people.linaro.org/~alex.bennee/qemu-submodule-git-seed.tar.xz | tar -xvJ
|
||||
- git submodule update --init --recursive
|
||||
- git submodule update --init --recursive capstone dtc ui/keycodemapdb
|
||||
before_script:
|
||||
- ./configure ${CONFIG} || { cat config.log && exit 1; }
|
||||
- mkdir -p ${BUILD_DIR} && cd ${BUILD_DIR}
|
||||
- ${SRC_DIR}/configure ${CONFIG} || { cat config.log && exit 1; }
|
||||
script:
|
||||
- make ${MAKEFLAGS} && ${TEST_CMD}
|
||||
matrix:
|
||||
include:
|
||||
# Test out-of-tree builds
|
||||
- env: CONFIG="--enable-debug --enable-debug-tcg"
|
||||
BUILD_DIR="out-of-tree/build/dir" SRC_DIR="../../.."
|
||||
# Test with Clang for compile portability (Travis uses clang-5.0)
|
||||
- env: CONFIG="--disable-system"
|
||||
compiler: clang
|
||||
@ -81,6 +87,8 @@ matrix:
|
||||
compiler: clang
|
||||
# gprof/gcov are GCC features
|
||||
- env: CONFIG="--enable-gprof --enable-gcov --disable-pie --target-list=aarch64-softmmu,arm-softmmu,i386-softmmu,mips-softmmu,mips64-softmmu,ppc64-softmmu,riscv64-softmmu,s390x-softmmu,x86_64-softmmu"
|
||||
after_success:
|
||||
- ${SRC_DIR}/scripts/travis/coverage-summary.sh
|
||||
compiler: gcc
|
||||
# We manually include builds which we disable "make check" for
|
||||
- env: CONFIG="--enable-debug --enable-tcg-interpreter"
|
||||
|
@ -2172,6 +2172,7 @@ R: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
L: qemu-devel@nongnu.org
|
||||
S: Maintained
|
||||
F: .travis.yml
|
||||
F: scripts/travis/
|
||||
F: .shippable.yml
|
||||
F: tests/docker/
|
||||
F: tests/vm/
|
||||
|
44
Makefile
44
Makefile
@ -60,8 +60,8 @@ seems to have been used for an in-tree build. You can fix this by running \
|
||||
endif
|
||||
endif
|
||||
|
||||
CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_LIST)),y)
|
||||
CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_LIST)),y)
|
||||
CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y)
|
||||
CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y)
|
||||
CONFIG_XEN := $(CONFIG_XEN_BACKEND)
|
||||
CONFIG_ALL=y
|
||||
-include config-all-devices.mak
|
||||
@ -365,8 +365,8 @@ DOCS=
|
||||
endif
|
||||
|
||||
SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet) BUILD_DIR=$(BUILD_DIR)
|
||||
SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(TARGET_LIST))
|
||||
SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %-config-devices.mak.d, $(TARGET_LIST))
|
||||
SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(TARGET_DIRS))
|
||||
SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %-config-devices.mak.d, $(TARGET_DIRS))
|
||||
|
||||
ifeq ($(SUBDIR_DEVICES_MAK),)
|
||||
config-all-devices.mak:
|
||||
@ -469,7 +469,7 @@ config-host.h-timestamp: config-host.mak
|
||||
qemu-options.def: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
|
||||
$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
|
||||
|
||||
SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_LIST))
|
||||
SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
|
||||
SOFTMMU_SUBDIR_RULES=$(filter %-softmmu,$(SUBDIR_RULES))
|
||||
|
||||
$(SOFTMMU_SUBDIR_RULES): $(block-obj-y)
|
||||
@ -513,7 +513,7 @@ ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))
|
||||
romsubdir-%:
|
||||
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/" CFLAGS="$(filter -O% -g%,$(CFLAGS))",)
|
||||
|
||||
ALL_SUBDIRS=$(TARGET_LIST) $(patsubst %,pc-bios/%, $(ROMS))
|
||||
ALL_SUBDIRS=$(TARGET_DIRS) $(patsubst %,pc-bios/%, $(ROMS))
|
||||
|
||||
recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES)
|
||||
|
||||
@ -723,6 +723,14 @@ module_block.h: $(SRC_PATH)/scripts/modules/module_block.py config-host.mak
|
||||
$(addprefix $(SRC_PATH)/,$(patsubst %.mo,%.c,$(block-obj-m))), \
|
||||
"GEN","$@")
|
||||
|
||||
ifdef CONFIG_GCOV
|
||||
.PHONY: clean-coverage
|
||||
clean-coverage:
|
||||
$(call quiet-command, \
|
||||
find . \( -name '*.gcda' -o -name '*.gcov' \) -type f -exec rm {} +, \
|
||||
"CLEAN", "coverage files")
|
||||
endif
|
||||
|
||||
clean:
|
||||
# avoid old build problems by removing potentially incorrect old files
|
||||
rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
|
||||
@ -770,7 +778,7 @@ distclean: clean
|
||||
rm -f docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf
|
||||
rm -f docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html
|
||||
rm -f docs/qemu-block-drivers.7
|
||||
for d in $(TARGET_LIST); do \
|
||||
for d in $(TARGET_DIRS); do \
|
||||
rm -rf $$d || exit 1 ; \
|
||||
done
|
||||
rm -Rf .sdk
|
||||
@ -871,7 +879,7 @@ endif
|
||||
$(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
|
||||
done
|
||||
$(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all"
|
||||
for d in $(TARGET_LIST); do \
|
||||
for d in $(TARGET_DIRS); do \
|
||||
$(MAKE) $(SUBDIR_MAKEFLAGS) TARGET_DIR=$$d/ -C $$d $@ || exit 1 ; \
|
||||
done
|
||||
|
||||
@ -978,6 +986,16 @@ docs/interop/qemu-qmp-ref.dvi docs/interop/qemu-qmp-ref.html \
|
||||
docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7: \
|
||||
docs/interop/qemu-qmp-ref.texi docs/interop/qemu-qmp-qapi.texi
|
||||
|
||||
# Reports/Analysis
|
||||
|
||||
%/coverage-report.html:
|
||||
@mkdir -p $*
|
||||
$(call quiet-command,\
|
||||
gcovr -p --html --html-details -o $@, \
|
||||
"GEN", "coverage-report.html")
|
||||
|
||||
.PHONY: coverage-report
|
||||
coverage-report: $(CURDIR)/reports/coverage/coverage-report.html
|
||||
|
||||
ifdef CONFIG_WIN32
|
||||
|
||||
@ -1066,13 +1084,16 @@ endif
|
||||
@echo ' ctags/TAGS - Generate tags file for editors'
|
||||
@echo ' cscope - Generate cscope index'
|
||||
@echo ''
|
||||
@$(if $(TARGET_LIST), \
|
||||
@$(if $(TARGET_DIRS), \
|
||||
echo 'Architecture specific targets:'; \
|
||||
$(foreach t, $(TARGET_LIST), \
|
||||
$(foreach t, $(TARGET_DIRS), \
|
||||
printf " %-30s - Build for %s\\n" $(patsubst %,subdir-%,$(t)) $(t);) \
|
||||
echo '')
|
||||
@echo 'Cleaning targets:'
|
||||
@echo ' clean - Remove most generated files but keep the config'
|
||||
ifdef CONFIG_GCOV
|
||||
@echo ' clean-coverage - Remove coverage files'
|
||||
endif
|
||||
@echo ' distclean - Remove all generated files'
|
||||
@echo ' dist - Build a distributable tarball'
|
||||
@echo ''
|
||||
@ -1084,6 +1105,9 @@ endif
|
||||
@echo 'Documentation targets:'
|
||||
@echo ' html info pdf txt'
|
||||
@echo ' - Build documentation in specified format'
|
||||
ifdef CONFIG_GCOV
|
||||
@echo ' coverage-report - Create code coverage report'
|
||||
endif
|
||||
@echo ''
|
||||
ifdef CONFIG_WIN32
|
||||
@echo 'Windows targets:'
|
||||
|
2
configure
vendored
2
configure
vendored
@ -6212,7 +6212,7 @@ qemu_version=$(head $source_path/VERSION)
|
||||
echo "VERSION=$qemu_version" >>$config_host_mak
|
||||
echo "PKGVERSION=$pkgversion" >>$config_host_mak
|
||||
echo "SRC_PATH=$source_path" >> $config_host_mak
|
||||
echo "TARGET_LIST=$target_list" >> $config_host_mak
|
||||
echo "TARGET_DIRS=$target_list" >> $config_host_mak
|
||||
if [ "$docs" = "yes" ] ; then
|
||||
echo "BUILD_DOCS=yes" >> $config_host_mak
|
||||
fi
|
||||
|
@ -158,12 +158,21 @@ rarely used. See "QEMU iotests" section below for more information.
|
||||
GCC gcov support
|
||||
----------------
|
||||
|
||||
``gcov`` is a GCC tool to analyze the testing coverage by instrumenting the
|
||||
tested code. To use it, configure QEMU with ``--enable-gcov`` option and build.
|
||||
Then run ``make check`` as usual. There will be additional ``gcov`` output as
|
||||
the testing goes on, showing the test coverage percentage numbers per analyzed
|
||||
source file. More detailed reports can be obtained by running ``gcov`` command
|
||||
on the output files under ``$build_dir/tests/``, please read the ``gcov``
|
||||
``gcov`` is a GCC tool to analyze the testing coverage by
|
||||
instrumenting the tested code. To use it, configure QEMU with
|
||||
``--enable-gcov`` option and build. Then run ``make check`` as usual.
|
||||
|
||||
If you want to gather coverage information on a single test the ``make
|
||||
clean-coverage`` target can be used to delete any existing coverage
|
||||
information before running a single test.
|
||||
|
||||
You can generate a HTML coverage report by executing ``make
|
||||
coverage-report`` which will create
|
||||
./reports/coverage/coverage-report.html. If you want to create it
|
||||
elsewhere simply execute ``make /foo/bar/baz/coverage-report.html``.
|
||||
|
||||
Further analysis can be conducted by running the ``gcov`` command
|
||||
directly on the various .gcda output files. Please read the ``gcov``
|
||||
documentation for more information.
|
||||
|
||||
QEMU iotests
|
||||
|
@ -1,7 +1,7 @@
|
||||
obj-y = main.o syscall.o strace.o mmap.o signal.o \
|
||||
elfload.o linuxload.o uaccess.o uname.o \
|
||||
safe-syscall.o $(TARGET_ABI_DIR)/signal.o \
|
||||
$(TARGET_ABI_DIR)/cpu_loop.o
|
||||
$(TARGET_ABI_DIR)/cpu_loop.o exit.o
|
||||
|
||||
obj-$(TARGET_HAS_BFLT) += flatload.o
|
||||
obj-$(TARGET_I386) += vm86.o
|
||||
|
35
linux-user/exit.c
Normal file
35
linux-user/exit.c
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* exit support for qemu
|
||||
*
|
||||
* Copyright (c) 2018 Alex Bennée <alex.bennee@linaro.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu.h"
|
||||
|
||||
#ifdef CONFIG_GCOV
|
||||
extern void __gcov_dump(void);
|
||||
#endif
|
||||
|
||||
void preexit_cleanup(CPUArchState *env, int code)
|
||||
{
|
||||
#ifdef TARGET_GPROF
|
||||
_mcleanup();
|
||||
#endif
|
||||
#ifdef CONFIG_GCOV
|
||||
__gcov_dump();
|
||||
#endif
|
||||
gdb_exit(env, code);
|
||||
}
|
@ -623,6 +623,14 @@ static inline int is_error(abi_long ret)
|
||||
return (abi_ulong)ret >= (abi_ulong)(-4096);
|
||||
}
|
||||
|
||||
/**
|
||||
* preexit_cleanup: housekeeping before the guest exits
|
||||
*
|
||||
* env: the CPU state
|
||||
* code: the exit code
|
||||
*/
|
||||
void preexit_cleanup(CPUArchState *env, int code);
|
||||
|
||||
/* Include target-specific struct and function definitions;
|
||||
* they may need access to the target-independent structures
|
||||
* above, so include them last.
|
||||
|
@ -8022,10 +8022,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
}
|
||||
|
||||
cpu_list_unlock();
|
||||
#ifdef TARGET_GPROF
|
||||
_mcleanup();
|
||||
#endif
|
||||
gdb_exit(cpu_env, arg1);
|
||||
preexit_cleanup(cpu_env, arg1);
|
||||
_exit(arg1);
|
||||
ret = 0; /* avoid warning */
|
||||
break;
|
||||
@ -10131,10 +10128,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
#ifdef __NR_exit_group
|
||||
/* new thread calls */
|
||||
case TARGET_NR_exit_group:
|
||||
#ifdef TARGET_GPROF
|
||||
_mcleanup();
|
||||
#endif
|
||||
gdb_exit(cpu_env, arg1);
|
||||
preexit_cleanup(cpu_env, arg1);
|
||||
ret = get_errno(exit_group(arg1));
|
||||
break;
|
||||
#endif
|
||||
|
@ -107,7 +107,7 @@ case $line in
|
||||
target_name=${line#*=}
|
||||
echo "#define TARGET_NAME \"$target_name\""
|
||||
;;
|
||||
TARGET_LIST=*)
|
||||
TARGET_DIRS=*)
|
||||
# do nothing
|
||||
;;
|
||||
TARGET_*=y) # configuration
|
||||
|
27
scripts/travis/coverage-summary.sh
Executable file
27
scripts/travis/coverage-summary.sh
Executable file
@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Author: Alex Bennée <alex.bennee@linaro.org>
|
||||
#
|
||||
# Summerise the state of code coverage with gcovr and tweak the output
|
||||
# to be more sane on Travis hosts. As we expect to be executed on a
|
||||
# throw away CI instance we do spam temp files all over the shop. You
|
||||
# most likely don't want to execute this script but just call gcovr
|
||||
# directly. See also "make coverage-report"
|
||||
#
|
||||
# This code is licensed under the GPL version 2 or later. See
|
||||
# the COPYING file in the top-level directory.
|
||||
|
||||
# first generate the coverage report
|
||||
gcovr -p -o raw-report.txt
|
||||
|
||||
# strip the full-path and line markers
|
||||
sed s@$PWD\/@@ raw-report.txt | sed s/[0-9]\*[,-]//g > simplified.txt
|
||||
|
||||
# reflow lines that got split
|
||||
awk '/.[ch]$/ { printf("%s", $0); next } 1' simplified.txt > rejoined.txt
|
||||
|
||||
# columnify
|
||||
column -t rejoined.txt > final.txt
|
||||
|
||||
# and dump, stripping out 0% coverage
|
||||
grep -v "0%" final.txt
|
@ -874,7 +874,7 @@ endif
|
||||
|
||||
# QTest rules
|
||||
|
||||
TARGETS=$(patsubst %-softmmu,%, $(filter %-softmmu,$(TARGET_LIST)))
|
||||
TARGETS=$(patsubst %-softmmu,%, $(filter %-softmmu,$(TARGET_DIRS)))
|
||||
ifeq ($(CONFIG_POSIX),y)
|
||||
QTEST_TARGETS = $(TARGETS)
|
||||
check-qtest-y=$(foreach TARGET,$(TARGETS), $(check-qtest-$(TARGET)-y))
|
||||
@ -897,26 +897,16 @@ GCOV_OPTIONS = -n $(if $(V),-f,)
|
||||
|
||||
.PHONY: $(patsubst %, check-qtest-%, $(QTEST_TARGETS))
|
||||
$(patsubst %, check-qtest-%, $(QTEST_TARGETS)): check-qtest-%: subdir-%-softmmu $(check-qtest-y)
|
||||
$(if $(CONFIG_GCOV),@rm -f *.gcda */*.gcda */*/*.gcda */*/*/*.gcda,)
|
||||
$(call quiet-command,QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \
|
||||
QTEST_QEMU_IMG=qemu-img$(EXESUF) \
|
||||
MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} \
|
||||
gtester $(GTESTER_OPTIONS) -m=$(SPEED) $(check-qtest-$*-y) $(check-qtest-generic-y),"GTESTER","$@")
|
||||
$(if $(CONFIG_GCOV),@for f in $(gcov-files-$*-y) $(gcov-files-generic-y); do \
|
||||
echo Gcov report for $$f:;\
|
||||
$(GCOV) $(GCOV_OPTIONS) $$f -o `dirname $$f`; \
|
||||
done,)
|
||||
|
||||
.PHONY: $(patsubst %, check-%, $(check-unit-y) $(check-speed-y))
|
||||
$(patsubst %, check-%, $(check-unit-y) $(check-speed-y)): check-%: %
|
||||
$(if $(CONFIG_GCOV),@rm -f *.gcda */*.gcda */*/*.gcda */*/*/*.gcda,)
|
||||
$(call quiet-command, \
|
||||
MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} \
|
||||
gtester $(GTESTER_OPTIONS) -m=$(SPEED) $*,"GTESTER","$*")
|
||||
$(if $(CONFIG_GCOV),@for f in $(gcov-files-$(subst tests/,,$*)-y) $(gcov-files-generic-y); do \
|
||||
echo Gcov report for $$f:;\
|
||||
$(GCOV) $(GCOV_OPTIONS) $$f -o `dirname $$f`; \
|
||||
done,)
|
||||
|
||||
# gtester tests with XML output
|
||||
|
||||
@ -938,14 +928,14 @@ check-report.html: check-report.xml
|
||||
|
||||
# Per guest TCG tests
|
||||
|
||||
LINUX_USER_TARGETS=$(filter %-linux-user,$(TARGET_LIST))
|
||||
LINUX_USER_TARGETS=$(filter %-linux-user,$(TARGET_DIRS))
|
||||
BUILD_TCG_TARGET_RULES=$(patsubst %,build-tcg-tests-%, $(LINUX_USER_TARGETS))
|
||||
CLEAN_TCG_TARGET_RULES=$(patsubst %,clean-tcg-tests-%, $(LINUX_USER_TARGETS))
|
||||
RUN_TCG_TARGET_RULES=$(patsubst %,run-tcg-tests-%, $(LINUX_USER_TARGETS))
|
||||
|
||||
ifeq ($(HAVE_USER_DOCKER),y)
|
||||
# Probe for the Docker Builds needed for each build
|
||||
$(foreach PROBE_TARGET,$(TARGET_LIST), \
|
||||
$(foreach PROBE_TARGET,$(TARGET_DIRS), \
|
||||
$(eval -include $(SRC_PATH)/tests/tcg/Makefile.probe) \
|
||||
$(if $(DOCKER_PREREQ), \
|
||||
$(eval build-tcg-tests-$(PROBE_TARGET): $(DOCKER_PREREQ))))
|
||||
|
@ -5,6 +5,8 @@
|
||||
DOCKER_SUFFIX := .docker
|
||||
DOCKER_FILES_DIR := $(SRC_PATH)/tests/docker/dockerfiles
|
||||
DOCKER_DEPRECATED_IMAGES := debian
|
||||
# we don't run tests on intermediate images (used as base by another image)
|
||||
DOCKER_INTERMEDIATE_IMAGES := debian8 debian9 debian8-mxe debian-ports debian-sid
|
||||
DOCKER_IMAGES := $(filter-out $(DOCKER_DEPRECATED_IMAGES),$(sort $(notdir $(basename $(wildcard $(DOCKER_FILES_DIR)/*.docker)))))
|
||||
DOCKER_TARGETS := $(patsubst %,docker-image-%,$(DOCKER_IMAGES))
|
||||
# Use a global constant ccache directory to speed up repetitive builds
|
||||
@ -44,9 +46,6 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
|
||||
"CHECK", "$*")
|
||||
else
|
||||
docker-image-%: $(DOCKER_FILES_DIR)/%.docker
|
||||
@if test "$@" = docker-image-debian-bootstrap -a -z "$(EXECUTABLE)"; then \
|
||||
echo WARNING: EXECUTABLE is not set, debootstrap may fail. 2>&1 ; \
|
||||
fi
|
||||
$(call quiet-command,\
|
||||
$(DOCKER_SCRIPT) build qemu:$* $< \
|
||||
$(if $V,,--quiet) $(if $(NOCACHE),--no-cache) \
|
||||
@ -54,6 +53,31 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
|
||||
$(if $(EXTRA_FILES),--extra-files $(EXTRA_FILES))\
|
||||
$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\
|
||||
"BUILD","$*")
|
||||
|
||||
# Special rule for debootstraped binfmt linux-user images
|
||||
docker-binfmt-image-debian-%: $(DOCKER_FILES_DIR)/debian-bootstrap.docker
|
||||
$(if $(EXECUTABLE),,\
|
||||
$(error EXECUTABLE not set, debootstrap of debian-$* would fail))
|
||||
$(if $(wildcard $(EXECUTABLE)),,\
|
||||
$(error Please build $(EXECUTABLE) first))
|
||||
$(if $(DEB_ARCH),,\
|
||||
$(error DEB_ARCH not set, debootstrap of debian-$* would fail))
|
||||
$(if $(DEB_TYPE),,\
|
||||
$(error DEB_TYPE not set, debootstrap of debian-$* would fail))
|
||||
$(if $(filter $(QEMU_TARGET),$(TARGET_DIRS)), \
|
||||
$(call quiet-command, \
|
||||
DEB_ARCH=$(DEB_ARCH) \
|
||||
DEB_TYPE=$(DEB_TYPE) \
|
||||
$(DOCKER_SCRIPT) build qemu:debian-$* $< \
|
||||
$(if $V,,--quiet) $(if $(NOCACHE),--no-cache) \
|
||||
$(if $(NOUSER),,--add-current-user) \
|
||||
$(if $(EXTRA_FILES),--extra-files $(EXTRA_FILES)) \
|
||||
$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)), \
|
||||
"BUILD","binfmt debian-$* (debootstrapped)"), \
|
||||
$(call quiet-command, \
|
||||
$(DOCKER_SCRIPT) check --quiet qemu:debian-$* $<, \
|
||||
"CHECK", "debian-$* exists"))
|
||||
|
||||
endif
|
||||
|
||||
# Enforce dependencies for composite images
|
||||
@ -97,8 +121,23 @@ docker-image-travis: NOUSER=1
|
||||
# Specialist build images, sometimes very limited tools
|
||||
docker-image-tricore-cross: docker-image-debian9
|
||||
|
||||
# Rules for building linux-user powered images
|
||||
#
|
||||
# These are slower than using native cross compiler setups but can
|
||||
# work around issues with poorly working multi-arch systems and broken
|
||||
# packages.
|
||||
|
||||
# Jessie is the last supported release for powerpc, but multi-arch is
|
||||
# broken so we need a qemu-linux-user for this target
|
||||
docker-binfmt-image-debian-powerpc-user: DEB_ARCH = powerpc
|
||||
docker-binfmt-image-debian-powerpc-user: DEB_TYPE = jessie
|
||||
docker-binfmt-image-debian-powerpc-user: QEMU_TARGET = ppc-linux-user
|
||||
docker-binfmt-image-debian-powerpc-user: EXECUTABLE = ${BUILD_DIR}/ppc-linux-user/qemu-ppc
|
||||
docker-image-debian-powerpc-user-cross: docker-binfmt-image-debian-powerpc-user
|
||||
DOCKER_USER_IMAGES += debian-powerpc-user
|
||||
|
||||
# Expand all the pre-requistes for each docker image and test combination
|
||||
$(foreach i,$(DOCKER_IMAGES) $(DOCKER_DEPRECATED_IMAGES), \
|
||||
$(foreach i,$(filter-out $(DOCKER_INTERMEDIATE_IMAGES),$(DOCKER_IMAGES) $(DOCKER_DEPRECATED_IMAGES)), \
|
||||
$(foreach t,$(DOCKER_TESTS) $(DOCKER_TOOLS), \
|
||||
$(eval .PHONY: docker-$t@$i) \
|
||||
$(eval docker-$t@$i: docker-image-$i docker-run-$t@$i) \
|
||||
@ -126,6 +165,11 @@ docker:
|
||||
@echo
|
||||
@echo 'Available container images:'
|
||||
@echo ' $(DOCKER_IMAGES)'
|
||||
ifneq ($(DOCKER_USER_IMAGES),)
|
||||
@echo
|
||||
@echo 'Available linux-user images (docker-binfmt-image-debian-%):'
|
||||
@echo ' $(DOCKER_USER_IMAGES)'
|
||||
endif
|
||||
@echo
|
||||
@echo 'Available tests:'
|
||||
@echo ' $(DOCKER_TESTS)'
|
||||
|
@ -113,6 +113,10 @@ def _copy_binary_with_libs(src, dest_dir):
|
||||
_copy_with_mkdir(l , dest_dir, so_path)
|
||||
|
||||
def _read_qemu_dockerfile(img_name):
|
||||
# special case for Debian linux-user images
|
||||
if img_name.startswith("debian") and img_name.endswith("user"):
|
||||
img_name = "debian-bootstrap"
|
||||
|
||||
df = os.path.join(os.path.dirname(__file__), "dockerfiles",
|
||||
img_name + ".docker")
|
||||
return open(df, "r").read()
|
||||
|
@ -17,5 +17,3 @@ RUN /debootstrap/debootstrap --second-stage
|
||||
# At this point we can install additional packages if we want
|
||||
# Duplicate deb line as deb-src
|
||||
RUN cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list
|
||||
RUN apt-get update
|
||||
RUN apt-get -y build-dep qemu
|
||||
|
@ -32,6 +32,15 @@ if [ -z "${DEB_TYPE}" ]; then
|
||||
|
||||
fi
|
||||
|
||||
# The following allow finer grain control over the defaults
|
||||
if [ -z "${DEB_VARIANT}" ]; then
|
||||
DEB_VARIANT=buildd
|
||||
fi
|
||||
|
||||
if [ -z "${DEB_URL}" ]; then
|
||||
DEB_URL="http://httpredir.debian.org/debian"
|
||||
fi
|
||||
|
||||
# We check in order for
|
||||
#
|
||||
# - DEBOOTSTRAP_DIR pointing at a development checkout
|
||||
@ -107,5 +116,5 @@ fi
|
||||
|
||||
echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP} ${DEB_ARCH}/${DEB_TYPE}"
|
||||
|
||||
${FAKEROOT} ${DEBOOTSTRAP} --variant=buildd --foreign --arch=$DEB_ARCH $DEB_TYPE . http://httpredir.debian.org/debian || exit 1
|
||||
${FAKEROOT} ${DEBOOTSTRAP} --variant=$DEB_VARIANT --foreign --arch=$DEB_ARCH $DEB_TYPE . $DEB_URL || exit 1
|
||||
exit 0
|
||||
|
15
tests/docker/dockerfiles/debian-powerpc-user-cross.docker
Normal file
15
tests/docker/dockerfiles/debian-powerpc-user-cross.docker
Normal file
@ -0,0 +1,15 @@
|
||||
#
|
||||
# Docker powerpc cross-compiler target for QEMU
|
||||
#
|
||||
# We can't use current Debian stable cross-compilers to build powerpc
|
||||
# as it has been dropped as a release architecture. Using Debian Sid
|
||||
# is just far too sketchy a build environment. This leaves us the
|
||||
# final option of using linux-user. This image is based of the
|
||||
# debootstrapped qemu:debian-powerpc-user but doesn't need any extra
|
||||
# magic once it is setup.
|
||||
#
|
||||
FROM qemu:debian-powerpc-user
|
||||
|
||||
RUN echo man-db man-db/auto-update boolean false | debconf-set-selections
|
||||
RUN apt-get update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get build-dep -yy qemu
|
@ -14,6 +14,6 @@ RUN apt-get update
|
||||
RUN DEBIAN_FRONTEND=noninteractive eatmydata \
|
||||
apt-get install -y --no-install-recommends \
|
||||
libpython2.7-stdlib \
|
||||
$(apt-get -s install -y --no-install-recommends gw32.shared-mingw-w64 gw32.shared-mingw-w64 | egrep "^Inst mxe-x86-64-unknown-" | cut -d\ -f2)
|
||||
$(apt-get -s install -y --no-install-recommends gw32.shared-mingw-w64 | egrep "^Inst mxe-x86-64-unknown-" | cut -d\ -f2)
|
||||
|
||||
ENV PATH $PATH:/usr/lib/mxe/usr/bin/
|
||||
|
@ -5,7 +5,7 @@ ENV LC_ALL en_US.UTF-8
|
||||
RUN cat /etc/apt/sources.list | sed "s/# deb-src/deb-src/" >> /etc/apt/sources.list
|
||||
RUN apt-get update
|
||||
RUN apt-get -y build-dep qemu
|
||||
RUN apt-get -y install device-tree-compiler python2.7 python-yaml dh-autoreconf gdb strace lsof net-tools
|
||||
RUN apt-get -y install device-tree-compiler python2.7 python-yaml dh-autoreconf gdb strace lsof net-tools gcovr
|
||||
# Travis tools require PhantomJS / Neo4j / Maven accessible
|
||||
# in their PATH (QEMU build won't access them).
|
||||
ENV PATH /usr/local/phantomjs/bin:/usr/local/phantomjs:/usr/local/neo4j-3.2.7/bin:/usr/local/maven-3.5.2/bin:/usr/local/cmake-3.9.2/bin:/usr/local/clang-5.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
@ -1,18 +1,18 @@
|
||||
FROM ubuntu:16.04
|
||||
RUN echo "deb http://archive.ubuntu.com/ubuntu/ trusty universe multiverse" >> \
|
||||
/etc/apt/sources.list
|
||||
RUN apt-get update
|
||||
ENV PACKAGES flex bison \
|
||||
libusb-1.0-0-dev libiscsi-dev librados-dev libncurses5-dev libncursesw5-dev \
|
||||
libseccomp-dev libgnutls-dev libssh2-1-dev libspice-server-dev \
|
||||
libspice-protocol-dev libnss3-dev libfdt-dev \
|
||||
libgtk-3-dev libvte-2.91-dev libsdl1.2-dev libpng12-dev libpixman-1-dev \
|
||||
libgtk-3-dev libvte-2.91-dev libsdl2-dev libpng12-dev libpixman-1-dev \
|
||||
libvdeplug-dev liblzo2-dev libsnappy-dev libbz2-dev libxen-dev librdmacm-dev libibverbs-dev \
|
||||
libsasl2-dev libjpeg-turbo8-dev xfslibs-dev libcap-ng-dev libbrlapi-dev libcurl4-gnutls-dev \
|
||||
libbluetooth-dev librbd-dev libaio-dev glusterfs-common libnuma-dev libepoxy-dev libdrm-dev libgbm-dev \
|
||||
libjemalloc-dev libcacard-dev libusbredirhost-dev libnfs-dev libcap-dev libattr1-dev \
|
||||
texinfo \
|
||||
gettext git make ccache python-yaml gcc clang sparse
|
||||
RUN apt-get -y install $PACKAGES
|
||||
RUN apt-get update && \
|
||||
apt-get -y install $PACKAGES
|
||||
RUN dpkg -l $PACKAGES | sort > /packages.txt
|
||||
ENV FEATURES clang pyyaml
|
||||
ENV FEATURES clang pyyaml sdl2
|
||||
|
Loading…
Reference in New Issue
Block a user