1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/makefiles/scan-build.inc.mk
smlng 5b3d26453a make: introduce BUILDOUT_DIR
This introduces a new environment variable for a common directory
that holds all output of the build process, such as application or
package binaries. This would also allow to easily redirect output
to any other location, e.g. for out-of-source builds.
2019-01-07 21:16:36 +01:00

107 lines
3.1 KiB
Makefile

SCANBUILD_ENV_VARS := \
APPDIR \
AR \
ARFLAGS \
AS \
ASFLAGS \
BINDIR \
BINDIRBASE \
BOARD \
BUILD_DIR \
BUILDRELPATH \
CC \
CFLAGS \
CPPMIX \
CXX \
CXXEXFLAGS \
CXXUWFLAGS \
ELFFILE \
HEXFILE \
HOME \
LINK \
LINKFLAGPREFIX \
LINKFLAGS \
OBJCOPY \
OFLAGS \
PATH \
PREFIX \
QUIET \
WERROR \
RIOT_VERSION \
RIOT_CI_BUILD \
SIZE \
TOOLCHAIN \
UNDEF \
USER \
#
# Produce errors by default at the end of compilation when warning are found
SCANBUILD_ERROR ?= $(if $(filter 1,$(WERROR)),--status-bugs)
SCANBUILD_ARGS ?= \
-analyze-headers \
--use-cc=$(CC) \
--use-c++=$(CXX) \
-analyzer-config stable-report-filename=true \
$(SCANBUILD_ERROR) \
#
SCANBUILD_OUTPUTDIR = scan-build/$(BOARD)
# Find all variables given on the command line and recreate the command.
CMDVARS := $(strip $(foreach varname, $(SCANBUILD_ENV_VARS), \
$(if $(filter command, $(origin $(varname))), \
'$(varname)=$(subst ','\'',$($(varname)))', \
)))
ENVVARS := $(strip $(foreach varname, $(SCANBUILD_ENV_VARS), \
$(if $(filter environment, $(origin $(varname))), \
'$(varname)=$(subst ','\'',$($(varname)))', \
)))
.PHONY: scan-build scan-build-analyze
.PHONY: ..scan-build-view ..scan-build-analyze
ifeq (1,$(INSIDE_DOCKER))
# In the container just do the analysis, 'view' will be done by the host
scan-build: ..scan-build-analyze
else # INSIDE_DOCKER
scan-build: ..scan-build-view
endif # INSIDE_DOCKER
# Prevent 'analyze' from producing an error when doing 'scan-build' and
# still show the webpage for interractive checking.
scan-build: SCANBUILD_ERROR=
ifeq ($(BUILD_IN_DOCKER),1)
# It will trigger executing 'scan-build' or 'scan-build-analyze' with docker
scan-build-analyze: ..in-docker-container
else # BUILD_IN_DOCKER
scan-build-analyze: ..scan-build-analyze
endif # BUILD_IN_DOCKER
..scan-build-analyze: clean
@$(COLOR_ECHO) '$(COLOR_GREEN)Performing Clang static code analysis using toolchain "$(TOOLCHAIN)".$(COLOR_RESET)'
# ccc-analyzer needs to be told the proper -target setting for best results,
# otherwise false error reports about unknown register names etc will be produced.
# These kinds of errors can be safely ignored as long as they only come from LLVM
@if [ "$${TOOLCHAIN}" != "llvm" -a "$${BOARD}" != "native" ]; then \
$(COLOR_ECHO) '$(COLOR_YELLOW)Recommend using TOOLCHAIN=llvm for best results.$(COLOR_RESET)'; \
$(COLOR_ECHO) '$(COLOR_YELLOW)Ignore any "error: unknown register name '\''rX'\'' in asm" messages.$(COLOR_RESET)'; \
fi
$(Q)mkdir -p '$(SCANBUILD_OUTPUTDIR)'
$(Q)env -i $(ENVVARS) \
scan-build -o '$(SCANBUILD_OUTPUTDIR)' $(SCANBUILD_ARGS) \
make -C $(CURDIR) all $(strip $(CMDVARS)) FORCE_ASSERTS=1
..scan-build-view: scan-build-analyze
@echo "Showing most recent report in your web browser..."
@REPORT_FILE="$$(find '$(SCANBUILD_OUTPUTDIR)' -maxdepth 2 -mindepth 2 \
-type f -name 'index.html' 2>/dev/null | sort | tail -n 1)"; \
if [ -n "$${REPORT_FILE}" ]; then \
echo "$(OPEN) $${REPORT_FILE}"; \
$(OPEN) "$${REPORT_FILE}"; \
else \
echo "No report found"; \
fi