#
# Copyright (c) 2019 Nutanix Inc. All rights reserved.
#
# Authors: Thanos Makatos <thanos@nutanix.com>
#          Swapnil Ingle <swapnil.ingle@nutanix.com>
#          Felipe Franciosi <felipe@nutanix.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of Nutanix nor the names of its contributors may be
#       used to endorse or promote products derived from this software without
#       specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

BUILD_TYPE ?= dbg

ifeq ($(BUILD_TYPE), dbg)
	CMAKE_BUILD_TYPE = Debug
    CFLAGS += -DDEBUG
else
	CMAKE_BUILD_TYPE = Release
endif

ifdef WITH_ASAN
	CC = clang
	CFLAGS += -fsanitize=address
	LDFLAGS += -fsanitize=address
endif

ifeq ($(MAKECMDGOALS), gcov)
	CFLAGS += --coverage
	LDFLAGS += --coverage
endif

ifeq ($(VERBOSE),)
    MAKEFLAGS += -s
endif

GIT_SHA = $(shell git rev-parse --short HEAD)
CMAKE = $(shell bash -c "command -v cmake3 cmake" | head -1)
RSTLINT = $(shell bash -c "command -v restructuredtext-lint /bin/true" | head -1)
FLAKE8 = $(shell bash -c "command -v flake8 /bin/true" | head -1)

BUILD_DIR_BASE = $(CURDIR)/build
BUILD_DIR = $(BUILD_DIR_BASE)/$(BUILD_TYPE)

INSTALL_PREFIX ?= /usr/local

.PHONY: all install test pytest pytest-valgrind
.PHONY: pre-push clean realclean tags gcov

all install: $(BUILD_DIR)/Makefile
	+$(MAKE) -C $(BUILD_DIR) $@

#
# NB: add --capture=no to get a C-level assert failure output.
#
PYTESTCMD = \
    $(shell bash -c "command -v pytest-3 /bin/true" | head -1) \
    -rP --quiet

PYTEST = \
    BUILD_TYPE=$(BUILD_TYPE) $(PYTESTCMD)

#
# In our tests, we make sure to destroy the ctx at the end of each test; this is
# enough for these settings to detect (most?) library leaks as "definite",
# without all the noise from the rest of the Python runtime.
#
# As running under valgrind is very slow, we don't run this unless requested.
#
PYTESTVALGRIND = \
	BUILD_TYPE=$(BUILD_TYPE) \
	PYTHONMALLOC=malloc \
	valgrind \
	--suppressions=$(CURDIR)/test/py/valgrind.supp \
	--quiet \
	--track-origins=yes \
	--errors-for-leak-kinds=definite \
	--show-leak-kinds=definite \
	--leak-check=full \
	--exit-on-first-error=yes \
	--error-exitcode=1 \
	$(PYTESTCMD)

ifdef WITH_ASAN

pytest pytest-valgrind:

else

pytest: all
	@echo "=== Running python tests ==="
ifeq ($(PYTESTCMD), /bin/true -rP --quiet)
	@echo "No pytest-3 found in system. Try 'apt-get install python3-pytest' or 'which pytest-3'"
	@echo "0 Python tests run"
endif
	$(PYTEST)

pytest-valgrind: all
	@echo "=== Running python tests with valgrind ==="
	$(PYTESTVALGRIND)

endif

ifdef WITH_GCOV
test: all pytest
else
test: all pytest
endif
	cd $(BUILD_DIR)/test; ctest --verbose

pre-push: realclean
	$(RSTLINT) docs/vfio-user.rst
	$(FLAKE8) --extend-ignore=F405,F403,E128,E131,E127 $$(find . -name '*.py')
	make test WITH_ASAN=1 WITH_TRAN_PIPE=1
	make realclean
	make test CC=clang BUILD_TYPE=rel WITH_TRAN_PIPE=1
	make test CC=clang WITH_TRAN_PIPE=1
	make realclean
	make test CC=gcc BUILD_TYPE=rel WITH_TRAN_PIPE=1
	make test CC=gcc WITH_TRAN_PIPE=1
	make pytest-valgrind
	make install DESTDIR=tmp.install

coverity: realclean
	curl -sS -L -o coverity.tar.gz -d "token=$$COVERITY_TOKEN&project=nutanix%2Flibvfio-user" https://scan.coverity.com/download/cxx/linux64
	tar xf coverity.tar.gz
	./cov-analysis-linux64-*/bin/cov-build --dir cov-int make -j4 all
	tar czf coverity-results.tar.gz cov-int
	curl --form token=$$COVERITY_TOKEN --form email=$$COVERITY_EMAIL --form file=@coverity-results.tar.gz --form version="$(GIT_SHA)"  https://scan.coverity.com/builds?project=nutanix%2Flibvfio-user

GCOVS=$(patsubst %.c,%.c.gcov, $(wildcard lib/*.c))

gcov: realclean test $(GCOVS)

clean:
	rm -rf $(BUILD_DIR)

realclean:
	rm -rf $(BUILD_DIR_BASE)
	rm -rf $(GCOVS)

$(BUILD_DIR)/Makefile:
ifneq (,$(filter -DNDEBUG,$(CFLAGS)))
	$(error -DNDEBUG flag is not supported)
endif
	mkdir -p $(BUILD_DIR)
	cd $(BUILD_DIR); $(CMAKE) \
		-D "CMAKE_C_COMPILER:STRING=$(CC)" \
		-D "CMAKE_C_FLAGS:STRING=$(CFLAGS)" \
		-D "CMAKE_BUILD_TYPE:STRING=$(CMAKE_BUILD_TYPE)" \
		-D "CMAKE_INSTALL_PREFIX=$(INSTALL_PREFIX)" \
		-D "WITH_ASAN=$(WITH_ASAN)" \
		-D "WITH_TRAN_PIPE=$(WITH_TRAN_PIPE)" \
		$(CURDIR)

tags:
	ctags -R --exclude=$(BUILD_DIR)

lib/%.c.gcov: lib/%.c
	cd lib && gcov -o ../build/$(BUILD_TYPE)/lib/CMakeFiles/$*.dir/$*.gcno $<
