LCOV=lcov.$(PROG) CLEANFILES+= *.gcno *.gcda $(LCOV) # Right now we support obtaining coverage information for system services only, # and for their main program code (not including their libraries) only. # # Why not userland as well: because we do not care as much, and it should be # possible to produce coverage information for system services without # recompiling the entire system with coverage support. Moreover, as of writing # we do not have libprofile_rt, making it impossible to compile regular # programs with coverage support altogether. # # Why not system service libraries (eg libsys) as well: practical concerns.. # 1) As of writing, even for such libraries we make a regular and a PIC # version, both producing a .gcno file for each object. The PIC version is # compiled last, while the regular version is used for the library archive. # The result is a potential mismatch between the compile-time coverage # metadata and the run-time coverage counts. # 2) The kernel has no coverage support, and with its self-relocation it would # be tricky to add support for it. As a result, libraries used by the # kernel would have to be excluded from being compiled with coverage support # so as not to create problems. One could argue that that is a good thing # because eg libminc and libsys create too many small result units (see also # the current hardcoded limit in libsys/llvm_gcov.c). # 3) gcov-pull(8) strips paths, which results in lots of manual work to figure # out what file belongs to which library, even ignoring object name # conflicts, for example between libraries. # 4) In order to produce practically useful results ("how much of libsockevent # is covered by the combination of LWIP and UDS" etc), gcov-pull(8) would # have to be extended with support for merging .gcda files. The standard # LLVM libprofile_rt implementation supports this, but we do not. # All of these issues are solvable, but for now anyone interested in coverage # for a particular system service library will have to mess with individual # makefiles themselves. .if ${MKCOVERAGE:Uno} == "yes" .if ${ACTIVE_CC} == "gcc" # Leftovers for GCC. It is not clear whether these still work at all. COVCPPFLAGS?= -fno-builtin -fprofile-arcs -ftest-coverage COVLDADD?= -lgcov .else # ${ACTIVE_CC} != "gcc" # We assume LLVM/clang here. For other compilers this will likely break the # MKCOVERAGE compilation, which is a good indication that support for them # should be added here. COVCPPFLAGS?= --coverage -g -O0 COVLDADD?= .endif # ${ACTIVE_CC} != "gcc" .endif # ${MKCOVERAGE:Uno} == "yes" lcov: lcov -c -d . >$(LCOV)