From 493366749ac2e5e7ed856dc0c1cea4471bfdea83 Mon Sep 17 00:00:00 2001 From: Dominik Holland Date: Wed, 30 Nov 2016 16:04:50 +0100 Subject: Fixed and simplified the "make check-coverage" build target Instead of collecting all coverage information manually by navigating thru all sub-trees, we now let lcov recursive scan all folders. This has the advantage that the code coverage always contains the complete code base without the need for manually updating the pro files. Also the check-branch-coverage got removed and branch-coverage is now automatically part of the check-coverage target Change-Id: I027d1285121b7584ba48ad5b9435fcf7757d4f2a Reviewed-by: Robert Griebl --- .qmake.conf | 5 +++++ application-manager.pro | 49 +++++++++++++++++++++--------------------- doc/installation.qdoc | 8 ++----- qmake-features/am-coverage.prf | 24 ++++----------------- 4 files changed, 35 insertions(+), 51 deletions(-) diff --git a/.qmake.conf b/.qmake.conf index 6e80bc40..5b85deb4 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -5,3 +5,8 @@ MODULE_VERSION = 1.9.9 SOURCE_DIR=$$PWD BUILD_DIR=$$shadowed($$PWD) QMAKEFEATURES=$$SOURCE_DIR/qmake-features + +# Load the am-coverage feature in every pro file +# This makes sure we compile everything with coverage data +# when the coverage target gets executed +CONFIG += am-coverage diff --git a/application-manager.pro b/application-manager.pro index 8b04ae3a..2284162b 100644 --- a/application-manager.pro +++ b/application-manager.pro @@ -98,34 +98,33 @@ OTHER_FILES += \ qmake-features/*.prf \ sync.profile +GCOV_EXCLUDE = /usr/* \ + $$[QT_INSTALL_PREFIX]/* \ + $$[QT_INSTALL_PREFIX/src]/* \ + tests/* \ + moc_* \ + examples/* \ + $$OUT_PWD/* \ + + +!prefix_build: GCOV_EXCLUDE += $$clean_path($$[QT_INSTALL_PREFIX]/../*) $$clean_path($$[QT_INSTALL_PREFIX/src]/../*) + +for (f, GCOV_EXCLUDE) { + GCOV_EXCLUDE_STR += $$shell_quote($$f) +} + global-check-coverage.target = check-coverage global-check-coverage.depends = coverage global-check-coverage.commands = ( \ find . -name \"*.gcov-info\" -print0 | xargs -0 rm -f && \ - cd tests && make check-coverage && cd .. && \ - cd src/common-lib && make check-coverage && cd ../.. && \ - cd src/crypto-lib && make check-coverage && cd ../.. && \ - cd src/installer-lib && make check-coverage && cd ../.. && \ - cd src/manager-lib && make check-coverage && cd ../.. && \ - lcov -o temp.gcov-info `find . -name "*.gcov-info" | xargs -n1 echo -a` && \ - lcov -o application-manager.gcov-info -r temp.gcov-info \"/usr/*\" \"$$[QT_INSTALL_PREFIX]/*\" \"$$[QT_INSTALL_PREFIX/src]/*\" \"tests/*\" \"moc_*\" && \ - rm -f temp.gcov-info && \ - genhtml -o coverage -s -f --legend --no-branch-coverage --demangle-cpp application-manager.gcov-info && echo \"\\n\\nCoverage info is available at file://`pwd`/coverage/index.html\" \ -) -global-check-branch-coverage.target = check-branch-coverage -global-check-branch-coverage.depends = coverage -global-check-branch-coverage.commands = ( \ - find . -name \"*.gcov-info\" -print0 | xargs -0 rm -f && \ - cd tests && make check-branch-coverage && cd .. && \ - cd src/common-lib && make check-branch-coverage && cd ../.. && \ - cd src/crypto-lib && make check-branch-coverage && cd ../.. && \ - cd src/installer-lib && make check-branch-coverage && cd ../.. && \ - cd src/manager-lib && make check-branch-coverage && cd ../.. && \ - lcov --rc lcov_branch_coverage=1 -o temp.gcov-info `find . -name "*.gcov-info" | xargs -n1 echo -a` && \ - lcov --rc lcov_branch_coverage=1 -o application-manager.gcov-info -r temp.gcov-info \"/usr/*\" \"$$[QT_INSTALL_PREFIX]/*\" \"$$[QT_INSTALL_PREFIX/src]/*\" \"tests/*\" \"moc_*\" && \ - rm -f temp.gcov-info && \ - genhtml -o branch-coverage -s -f --legend --branch-coverage --rc lcov_branch_coverage=1 --demangle-cpp application-manager.gcov-info && echo \"\\n\\nBranch-Coverage info is available at file://`pwd`/branch-coverage/index.html\" \ + lcov -c -i -d . --rc lcov_branch_coverage=1 --rc geninfo_auto_base=1 -o base.gcov-info && \ + cd tests && make check && cd .. && \ + lcov -c -d . --rc lcov_branch_coverage=1 --rc geninfo_auto_base=1 -o test.gcov-info && \ + lcov --rc lcov_branch_coverage=1 -o temp.gcov-info `find . -name \"*.gcov-info\" | xargs -n1 echo -a` && \ + lcov --rc lcov_branch_coverage=1 -o application-manager.gcov-info -r temp.gcov-info $$GCOV_EXCLUDE_STR && \ + rm -f base.gcov-info test.gcov-info temp.gcov-info && \ + genhtml -o branch-coverage -s -f --legend --branch-coverage --rc lcov_branch_coverage=1 --demangle-cpp application-manager.gcov-info && echo \"\\n\\nCoverage info is available at file://`pwd`/branch-coverage/index.html\" \ ) -QMAKE_EXTRA_TARGETS -= sub-check-coverage sub-check-branch-coverage -QMAKE_EXTRA_TARGETS *= global-check-coverage global-check-branch-coverage +QMAKE_EXTRA_TARGETS -= sub-check-coverage +QMAKE_EXTRA_TARGETS *= global-check-coverage diff --git a/doc/installation.qdoc b/doc/installation.qdoc index d55633c5..0f4a899e 100644 --- a/doc/installation.qdoc +++ b/doc/installation.qdoc @@ -198,18 +198,14 @@ compiling. \chapter Generating Code-Coverage Data Instead of doing a normal build, you can also create a coverage build by running \c{make coverage}. +As every compile step needs to be instrumented with special compiler flags, you need to make sure +to run \c{make clean} before. Using a build like this enables you to generate HTML coverage reports simply by executing: \badcode make check-coverage \endcode -or - -\badcode -make check-branch-coverage -\endcode - in the build directory. The command-line output will tell you the url to the generated report. \chapter System Setup diff --git a/qmake-features/am-coverage.prf b/qmake-features/am-coverage.prf index 4ca3f4ce..b642b4a9 100644 --- a/qmake-features/am-coverage.prf +++ b/qmake-features/am-coverage.prf @@ -1,14 +1,9 @@ # generate code coverage information using gcov/lcov/genhtml - CONFIG(debug,debug|release) { equals(TEMPLATE, "subdirs") { sub-coverage.target = coverage sub-coverage.CONFIG = recursive - sub-check-coverage.target = check-coverage - sub-check-coverage.CONFIG = recursive - sub-check-branch-coverage.target = check-branch-coverage - sub-check-branch-coverage.CONFIG = recursive - QMAKE_EXTRA_TARGETS += sub-coverage sub-check-coverage sub-check-branch-coverage + QMAKE_EXTRA_TARGETS += sub-coverage } else { coverage_pre.commands += @echo && echo "Building with coverage support..." && echo $(eval CXXFLAGS += -O0 -fprofile-arcs -ftest-coverage)$(eval LFLAGS += -O0 -fprofile-arcs -ftest-coverage) @@ -16,19 +11,8 @@ CONFIG(debug,debug|release) { coverage.commands = @echo && echo "Finished building with coverage support." && echo build_pass|!debug_and_release:coverage.depends = coverage_pre all - equals(TEMPLATE, "lib") { - CLEAR_AND_RUN="true" - } else { - CLEAR_AND_RUN="lcov -z -d . -b . && $$COVERAGE_RUNTIME ./$(TARGET)" - } - - check-coverage.commands = @echo && echo "Checking coverage..." && $$CLEAR_AND_RUN && lcov -c -d . -b . -o $(TARGET).gcov-info - check-coverage.depends = coverage - - check-branch-coverage.commands = @echo && echo "Checking branch coverage..." && $$CLEAR_AND_RUN && lcov -c -d . -b . -o $(TARGET).gcov-info --rc lcov_branch_coverage=1 - check-branch-coverage.depends = coverage - - QMAKE_CLEAN += $(OBJECTS_DIR)/*.gcda $(OBJECTS_DIR)/*.gcno $(TARGET).gcov-info - QMAKE_EXTRA_TARGETS *= coverage_pre coverage check-coverage check-branch-coverage + QMAKE_EXTRA_TARGETS *= coverage_pre coverage } } + +QMAKE_CLEAN += $(OBJECTS_DIR)/*.gcda $(OBJECTS_DIR)/*.gcno $(TARGET).gcov-info -- cgit v1.2.1