2 # Support Clang static analyzer on SRCS.
7 # CLANG_ANALYZE_CHECKERS Which checkers to run for all sources.
9 # CLANG_ANALYZE_CXX_CHECKERS Which checkers to run for C++ sources.
11 # CLANG_ANALYZE_OUTPUT Output format for generated files.
12 # text - don't generate extra files.
13 # html - generate html in obj.plist/ directories.
14 # plist - generate xml obj.plist files.
16 # contrib/llvm-project/clang/include/clang/StaticAnalyzer/Core/Analyses.def
18 # CLANG_ANALYZE_OUTPUT_DIR Sets which directory output set by
19 # CLANG_ANALYZE_OUTPUT is placed into.
24 # Run the Clang static analyzer against all sources and present
27 .if !target(__<bsd.clang-analyze.mk>__)
28 __<bsd.clang-analyze.mk>__:
30 .include <bsd.compiler.mk>
32 .if ${COMPILER_TYPE} != "clang" && (make(analyze) || make(*.clang-analyzer))
33 .error Clang static analyzer requires clang but found that compiler '${CC}' is ${COMPILER_TYPE}
36 CLANG_ANALYZE_OUTPUT?= text
37 CLANG_ANALYZE_OUTPUT_DIR?= clang-analyze
38 CLANG_ANALYZE_FLAGS+= --analyze \
39 -Xanalyzer -analyzer-output=${CLANG_ANALYZE_OUTPUT} \
40 -o ${CLANG_ANALYZE_OUTPUT_DIR}
42 CLANG_ANALYZE_CHECKERS+= core deadcode security unix
43 CLANG_ANALYZE_CXX_CHECKERS+= cplusplus
45 .for checker in ${CLANG_ANALYZE_CHECKERS}
46 CLANG_ANALYZE_FLAGS+= -Xanalyzer -analyzer-checker=${checker}
48 CLANG_ANALYZE_CXX_FLAGS+= ${CLANG_ANALYZE_FLAGS}
49 .for checker in ${CLANG_ANALYZE_CXX_CHECKERS}
50 CLANG_ANALYZE_CXX_FLAGS+= -Xanalyzer -analyzer-checker=${checker}
53 .SUFFIXES: .c .cc .cpp .cxx .C .clang-analyzer
55 CLANG_ANALYZE_CFLAGS= ${CFLAGS:N-Wa,--fatal-warnings}
56 CLANG_ANALYZE_CXXFLAGS= ${CXXFLAGS:N-Wa,--fatal-warnings}
59 ${CC:N${CCACHE_BIN}} ${CLANG_ANALYZE_FLAGS} \
60 ${CLANG_ANALYZE_CFLAGS} \
62 .cc.clang-analyzer .cpp.clang-analyzer .cxx.clang-analyzer .C.clang-analyzer:
63 ${CXX:N${CCACHE_BIN}} ${CLANG_ANALYZE_CXX_FLAGS} \
64 ${CLANG_ANALYZE_CXXFLAGS} \
68 ${SRCS:M*.[cC]} ${SRCS:M*.cc} \
69 ${SRCS:M*.cpp} ${SRCS:M*.cxx} \
70 ${DPSRCS:M*.[cC]} ${DPSRCS:M*.cc} \
71 ${DPSRCS:M*.cpp} ${DPSRCS:M*.cxx}
72 .if !empty(CLANG_ANALYZE_SRCS)
73 CLANG_ANALYZE_OBJS= ${CLANG_ANALYZE_SRCS:O:u:${OBJS_SRCS_FILTER:ts:}:S,$,.clang-analyzer,}
74 .NOPATH: ${CLANG_ANALYZE_OBJS}
77 # .depend files aren't relevant here since they reference obj.o rather than
78 # obj.clang-analyzer, so add in some guesses in case 'make depend' wasn't ran,
79 # for when directly building 'obj.clang-analyzer'.
80 .for __obj in ${CLANG_ANALYZE_OBJS}
81 ${__obj}: ${OBJS_DEPEND_GUESS}
82 ${__obj}: ${OBJS_DEPEND_GUESS.${__obj}}
85 beforeanalyze: depend .PHONY
86 .if !defined(_RECURSING_PROGS) && !empty(CLANG_ANALYZE_SRCS) && \
87 ${CLANG_ANALYZE_OUTPUT} != "text"
88 mkdir -p ${CLANG_ANALYZE_OUTPUT_DIR}
92 analyze: beforeanalyze .WAIT ${CLANG_ANALYZE_OBJS}
95 .if exists(${CLANG_ANALYZE_OUTPUT_DIR})
96 CLEANDIRS+= ${CLANG_ANALYZE_OUTPUT_DIR}
99 .endif # !target(__<bsd.clang-analyze.mk>__)