scan-build.inc.mk 2.53 KB
SCANBUILD_ENV_VARS := \
  APPDIR \
  AR \
  ARFLAGS \
  AS \
  ASFLAGS \
  BINDIR \
  BINDIRBASE \
  BOARD \
  BUILDRELPATH \
  CC \
  CFLAGS \
  CPPMIX \
  CXX \
  CXXEXFLAGS \
  CXXUWFLAGS \
  ELFFILE \
  HEXFILE \
  HOME \
  LINK \
  LINKFLAGPREFIX \
  LINKFLAGS \
  OBJCOPY \
  OFLAGS \
  PATH \
  PREFIX \
  QUIET \
  WERROR \
  RIOT_VERSION \
  SIZE \
  TOOLCHAIN \
  UNDEF \
  USER \
  #

SCANBUILD_ARGS ?= \
  -analyze-headers \
  --use-cc=$(CC) \
  --use-c++=$(CXX) \
  -analyzer-config stable-report-filename=true \
  #

export SCANBUILD_OUTPUTDIR = $(CURDIR)/scan-build/

# 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 scan-build-view
scan-build: scan-build-view scan-build-analyze
scan-build-view: scan-build-analyze
ifeq ($(BUILD_IN_DOCKER),1)
scan-build-analyze: ..in-docker-container
else # 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;
endif # BUILD_IN_DOCKER

ifeq (1,$(INSIDE_DOCKER))
scan-build-view:
	@
else
	@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
endif

# Reset the default goal.
.DEFAULT_GOAL :=