platform_build/core/line_coverage.mk

94 lines
3.3 KiB
Makefile

# -----------------------------------------------------------------
# Make target for line coverage. This target generates a zip file
# called `line_coverage_profiles.zip` that contains a large set of
# zip files one for each fuzz target/critical component. Each zip
# file contains a set of profile files (*.gcno) that we will use
# to generate line coverage reports. Furthermore, target compiles
# all fuzz targets with line coverage instrumentation enabled and
# packs them into another zip file called `line_coverage_profiles.zip`.
#
# To run the make target set the coverage related envvars first:
# NATIVE_LINE_COVERAGE=true NATIVE_COVERAGE=true \
# COVERAGE_PATHS=* make haiku-line-coverage
# -----------------------------------------------------------------
# TODO(b/148306195): Due this issue some fuzz targets cannot be built with
# line coverage instrumentation. For now we just blacklist them.
blacklisted_fuzz_targets := libneuralnetworks_fuzzer
fuzz_targets := $(ALL_FUZZ_TARGETS)
fuzz_targets := $(filter-out $(blacklisted_fuzz_targets),$(fuzz_targets))
# Android components that considered critical.
# Please note that adding/Removing critical components is very rare.
critical_components_static := \
lib-bt-packets \
libbt-stack \
libffi \
libhevcdec \
libhevcenc \
libmpeg2dec \
libosi \
libpdx \
libselinux \
libvold \
libyuv
critical_components_shared := \
libaudioprocessing \
libbinder \
libbluetooth_gd \
libbrillo \
libcameraservice \
libcurl \
libhardware \
libinputflinger \
libopus \
libstagefright \
libunwind \
libvixl
# Use the intermediates directory to avoid installing libraries to the device.
intermediates := $(call intermediates-dir-for,PACKAGING,haiku-line-coverage)
# We want the profile files for all fuzz targets + critical components.
line_coverage_profiles := $(intermediates)/line_coverage_profiles.zip
critical_components_static_inputs := $(foreach lib,$(critical_components_static), \
$(call intermediates-dir-for,STATIC_LIBRARIES,$(lib))/$(lib).a)
critical_components_shared_inputs := $(foreach lib,$(critical_components_shared), \
$(call intermediates-dir-for,SHARED_LIBRARIES,$(lib))/$(lib).so)
fuzz_target_inputs := $(foreach fuzz,$(fuzz_targets), \
$(call intermediates-dir-for,EXECUTABLES,$(fuzz))/$(fuzz))
# When line coverage is enabled (NATIVE_LINE_COVERAGE is set), make creates
# a "coverage" directory and stores all profile (*.gcno) files in inside.
# We need everything that is stored inside this directory.
$(line_coverage_profiles): $(fuzz_target_inputs)
$(line_coverage_profiles): $(critical_components_static_inputs)
$(line_coverage_profiles): $(critical_components_shared_inputs)
$(line_coverage_profiles): $(SOONG_ZIP)
$(SOONG_ZIP) -o $@ -D $(PRODUCT_OUT)/coverage
# Zip all fuzz targets compiled with line coverage.
line_coverage_fuzz_targets := $(intermediates)/line_coverage_fuzz_targets.zip
$(line_coverage_fuzz_targets): $(fuzz_target_inputs)
$(line_coverage_fuzz_targets): $(SOONG_ZIP)
$(SOONG_ZIP) -o $@ -j $(addprefix -f ,$(fuzz_target_inputs))
.PHONY: haiku-line-coverage
haiku-line-coverage: $(line_coverage_profiles) $(line_coverage_fuzz_targets)
$(call dist-for-goals, haiku-line-coverage, \
$(line_coverage_profiles):line_coverage_profiles.zip \
$(line_coverage_fuzz_targets):line_coverage_fuzz_targets.zip)
line_coverage_profiles :=
line_coverage_fuzz_targets :=