|
1 | 1 | .PHONY: all clean realclean deps profile leak-check check-grammar \ |
2 | 2 | list-cores test indent indent-src indent-generated docs \ |
3 | 3 | install-sqlite3 coverage extracov view-coverage \ |
| 4 | +coverage-target \ |
| 5 | +help \ |
4 | 6 | establish-baseline test-refactoring update-baseline clean-baseline \ |
5 | 7 | scratch |
6 | 8 |
|
@@ -330,9 +332,81 @@ indent-generated: .typedefs .indent.pro |
330 | 332 | list-cores: |
331 | 333 | @ls -rt1 /var/lib/apport/coredump/* | tail -1 |
332 | 334 |
|
| 335 | +help: |
| 336 | + @echo "CEKF Make targets" |
| 337 | + @echo "" |
| 338 | + @echo "Coverage" |
| 339 | + @echo " make coverage" |
| 340 | + @echo " Run full coverage workflow (build + test suite + report generation)." |
| 341 | + @echo "" |
| 342 | + @echo " make coverage-target COVERAGE_TARGET=tests/test_minlam_freeVars [COVERAGE_FILE=src/minlam_freeVars.c]" |
| 343 | + @echo " Run focused coverage on one executable target." |
| 344 | + @echo " Uses gcov when compiler is GCC, llvm-cov gcov when compiler is Clang." |
| 345 | + @echo "" |
| 346 | + @echo " make view-coverage" |
| 347 | + @echo " Open HTML coverage report when generated." |
| 348 | + @echo "" |
| 349 | + @echo "Coverage variables" |
| 350 | + @echo " CCC=<compiler> e.g. clang (default) or gcc" |
| 351 | + @echo " COVERAGE_TARGET=<bin> e.g. tests/test_minlam_freeVars" |
| 352 | + @echo " COVERAGE_FILE=<src> e.g. src/minlam_freeVars.c" |
| 353 | + @echo " LLVM_COV=<path> Override llvm-cov binary" |
| 354 | + @echo " GCOV=<path> Override gcov binary" |
| 355 | + |
333 | 356 | coverage: |
334 | 357 | ./tools/coverage.sh |
335 | 358 |
|
| 359 | +coverage-target: |
| 360 | + @if [ -z "$(COVERAGE_TARGET)" ]; then \ |
| 361 | + echo "Usage: make coverage-target COVERAGE_TARGET=tests/test_minlam_freeVars [COVERAGE_FILE=src/minlam_freeVars.c]"; \ |
| 362 | + exit 1; \ |
| 363 | + fi |
| 364 | + find obj -name '*.gcda' -delete |
| 365 | + find obj -name '*.gcno' -delete |
| 366 | + $(MAKE) -B MODE=coverage $(COVERAGE_TARGET) |
| 367 | + ./$(COVERAGE_TARGET) |
| 368 | + mkdir -p gcov_output |
| 369 | + @COV_GCOV_CMD=""; \ |
| 370 | + COMPILER_BASENAME="$$(basename "$(CCC)")"; \ |
| 371 | + case "$$COMPILER_BASENAME" in \ |
| 372 | + gcc*|*-gcc|g++*|*-g++) \ |
| 373 | + if [ -n "$$GCOV" ]; then \ |
| 374 | + COV_GCOV_CMD="$$GCOV"; \ |
| 375 | + elif command -v gcov >/dev/null 2>&1; then \ |
| 376 | + COV_GCOV_CMD="gcov"; \ |
| 377 | + else \ |
| 378 | + echo "ERROR: gcov not found. Set GCOV=<path-to-gcov>."; \ |
| 379 | + exit 1; \ |
| 380 | + fi; \ |
| 381 | + ;; \ |
| 382 | + *) \ |
| 383 | + if [ -n "$$LLVM_COV" ]; then \ |
| 384 | + COV_GCOV_CMD="$$LLVM_COV gcov"; \ |
| 385 | + elif command -v llvm-cov-18 >/dev/null 2>&1; then \ |
| 386 | + COV_GCOV_CMD="llvm-cov-18 gcov"; \ |
| 387 | + elif command -v llvm-cov >/dev/null 2>&1; then \ |
| 388 | + COV_GCOV_CMD="llvm-cov gcov"; \ |
| 389 | + else \ |
| 390 | + echo "ERROR: llvm-cov not found. Set LLVM_COV=<path-to-llvm-cov>."; \ |
| 391 | + exit 1; \ |
| 392 | + fi; \ |
| 393 | + ;; \ |
| 394 | + esac; \ |
| 395 | + if [ -n "$(COVERAGE_FILE)" ]; then \ |
| 396 | + gcda="obj/$$(basename $(COVERAGE_FILE) .c).gcda"; \ |
| 397 | + if [ ! -f "$$gcda" ]; then \ |
| 398 | + echo "ERROR: $$gcda not found. Run target may not have touched $(COVERAGE_FILE)."; \ |
| 399 | + exit 1; \ |
| 400 | + fi; \ |
| 401 | + echo "Generating focused coverage for $(COVERAGE_FILE)"; \ |
| 402 | + eval "$$COV_GCOV_CMD -b \"$$gcda\""; \ |
| 403 | + else \ |
| 404 | + echo "Generating coverage for all touched gcda files"; \ |
| 405 | + for f in obj/*.gcda; do eval "$$COV_GCOV_CMD -b \"$$f\" >/dev/null"; done; \ |
| 406 | + echo "Done. Set COVERAGE_FILE=src/<file>.c for focused output."; \ |
| 407 | + fi; \ |
| 408 | + mv ./*.gcov gcov_output/ 2>/dev/null || true |
| 409 | + |
336 | 410 | extracov: $(TEST_TARGETS) $(TARGET) $(UNIDIR)/unicode.db |
337 | 411 | ./$(TARGET) --include=fn --dump-anf --dump-ast --dump-bytecode --dump-inline --dump-lambda --dump-tpmc=NOT tests/fn/test_macros.fn 2>&1 > /dev/null |
338 | 412 |
|
|
0 commit comments