Files
gb-emu/Makefile
Max Regan d25d2d8549 test: add automatic unit test coverage generation
Using lcov, generate an HTML report via "make coverage-report"
describing the coverage of each file. Ideally, this will get added to
an automated testing pipeline.

Signed-off-by: Max Regan <mgregan2@gmail.com>
2017-05-10 22:40:12 -07:00

122 lines
2.4 KiB
Makefile
Executable File

OUT=build
COV_DIR=$(OUT)/coverage/
SRC_DIR=src
APP_DIR=src/apps/
CC=gcc
CCFLAGS = -Wall -Werror
CCFLAGS += -std=c99 -D_POSIX_C_SOURCE=200809L
CCFLAGS += -I$(SRC_DIR)
.PHONY: release debug
CONFIG = $(OUT)/.config.mk
-include $(CONFIG)
ifeq ($(DEBUG), 1)
CCFLAGS += -DLOG_LEVEL=5 -DDEBUG
CCFLAGS += -fprofile-arcs -ftest-coverage
CCFLAGS += -O0 -ggdb
LDFLAGS += -lgcov --coverage
endif
ifeq ($(RELEASE), 1)
CCFLAGS += -O3
endif
CCFLAGS += -I/usr/include/glib-2.0/ -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
LDFLAGS += -lglib-2.0
C_SOURCES = $(shell find $(SRC_DIR) -name "*.c")
ALL_OBJS = $(patsubst $(SRC_DIR)/%.c, $(OUT)/%.o, $(C_SOURCES))
APP_OBJS = $(filter $(OUT)/apps/%, $(ALL_OBJS))
OBJS = $(filter-out $(APP_OBJS), $(ALL_OBJS))
APPS = $(patsubst %.o, %, $(APP_OBJS))
.PHONY: all
all: gbdb gbasm tests
.PHONY: config-debug config-release config-default
$(CONFIG):
@mkdir -p $(OUT)
config-debug: $(CONFIG)
@echo "DEBUG=1" > $(CONFIG)
config-release: $(CONFIG)
@echo "RELEASE=1" > $(CONFIG)
config-default: $(CONFIG)
@echo "" > $(CONFIG)
.PHONY: gbdb gbasm
gbdb: $(OUT)/apps/gbdb
gbasm: $(OUT)/apps/gbasm
.PHONY: gbasm-test sample-test tests
TESTS=$(OUT)/apps/gbasm-test $(OUT)/apps/tri-test
tests: $(TESTS)
$(ALL_APPS) $(ALL_OBJS): $(CONFIG)
$(OUT)/%.o: $(SRC_DIR)/%.c
@echo " CC $@"
@$(shell mkdir -p $(@D))
@$(CC) -c $(CCFLAGS) -o $@ $<
.SECONDEXPANSION:
$(APPS): $(OBJS) $$@.o
@echo " LD $@"
@$(shell mkdir -p $(@D))
@$(CC) $^ $(LDFLAGS) -o $@
.PHONY: check cov-report
define run_tests =
@for i in $(TESTS); do \
$$i; \
if [ $$? -ne 0 ]; then \
exit 1; \
fi; \
done;
endef
.PHONY: check coverage coverage-report
check: $(TESTS)
$(run_tests)
COV_BASE=$(COV_DIR)/cov_base.info
.PHONY: $(COV_BASE)
$(COV_BASE):
@mkdir -p $(COV_DIR)
@lcov -c -i -d $(OUT) -o $(COV_BASE)
$(COV_DIR)/coverage.info coverage: $(TESTS) $(COV_BASE)
@for test in $(TESTS); do \
$$test; \
lcov -c -d $(OUT) -o $(COV_DIR)/$$(basename $$test).info -t $$(basename $$test); \
done
lcov $$(for i in $$(ls -1 $(COV_DIR)/*.info); do echo "-a $$i"; done) -o $(COV_DIR)/coverage.info
coverage-report: coverage
@mkdir -p $(COV_DIR)/html/
@genhtml --prefix $(PWD) --output-directory=$(COV_DIR)/html $(COV_DIR)/coverage.info
.PHONY: clean realclean cov-clean
cov-clean:
@find $(OUT)/ \( -iname *.gcno -o -iname *.gcda \) -delete
@rm
clean:
@rm -f $(ALL_OBJS) $(APPS)
realclean: clean
@rm -f $(CONFIG)