blob: afd9846025a21c23f1efca60e242704867494cbd [file] [log] [blame]
#
# 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 $<