xref: /OK3568_Linux_fs/yocto/meta-clang/classes/scan-build.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# Copyright (C) 2018 Khem Raj <raj.khem@gmail.com>
2*4882a593Smuzhiyun# Released under the MIT license (see COPYING.MIT for the terms)
3*4882a593Smuzhiyun
4*4882a593SmuzhiyunEXTRA_ANALYZER_OPTIONS += "-analyze-headers"
5*4882a593SmuzhiyunEXTRA_ANALYZER_OPTIONS += "--force-analyze-debug-code"
6*4882a593SmuzhiyunSCAN_BUILD ??= "1"
7*4882a593SmuzhiyunSCAN_BUILD:class-native = ""
8*4882a593SmuzhiyunSCAN_BUILD:class-nativesdk = ""
9*4882a593SmuzhiyunSCAN_BUILD:class-cross = ""
10*4882a593SmuzhiyunSCAN_BUILD:class-crosssdk = ""
11*4882a593SmuzhiyunSCAN_BUILD:class-cross-canadian = ""
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun#CLANG_SCAN_SERVER_IP ??= "127.0.0.1"
14*4882a593SmuzhiyunCLANG_SCAN_SERVER_IP ??= "10.0.0.10"
15*4882a593SmuzhiyunCLANG_SCAN_PORT ??= "8181"
16*4882a593SmuzhiyunSCAN_RESULTS_DIR ?= "${TMPDIR}/static-scan/${PN}"
17*4882a593Smuzhiyun
18*4882a593SmuzhiyunCCSCAN ?= "${HOST_PREFIX}${TOOLCHAIN}"
19*4882a593SmuzhiyunCXXSCAN:toolchain-clang ?= "${HOST_PREFIX}clang++"
20*4882a593SmuzhiyunCXXSCAN:toolchain-gcc ?= "${HOST_PREFIX}g++"
21*4882a593Smuzhiyun
22*4882a593Smuzhiyundo_scanbuild() {
23*4882a593Smuzhiyun        rm -rf ${SCAN_RESULTS_DIR}
24*4882a593Smuzhiyun        scan-build --use-cc ${CCSCAN} --use-c++ ${CXXSCAN} --analyzer-target ${HOST_SYS} --html-title ${BP} -o ${SCAN_RESULTS_DIR} ${EXTRA_ANALYZER_OPTIONS} ${MAKE} ${PARALLEL_MAKE} ${EXTRA_OEMAKE}
25*4882a593Smuzhiyun}
26*4882a593Smuzhiyun
27*4882a593Smuzhiyundo_scanview() {
28*4882a593Smuzhiyun        bbplain "================================================================"
29*4882a593Smuzhiyun        bbplain "Starting scan-view server at: http://${CLANG_SCAN_SERVER_IP}:${CLANG_SCAN_PORT}"
30*4882a593Smuzhiyun        bbplain "Use Ctrl-C to exit"
31*4882a593Smuzhiyun        bbplain "================================================================"
32*4882a593Smuzhiyun        scan-view --host ${CLANG_SCAN_SERVER_IP} --port ${CLANG_SCAN_PORT} --allow-all-hosts ${SCAN_RESULTS_DIR}/*/
33*4882a593Smuzhiyun}
34*4882a593Smuzhiyun
35*4882a593Smuzhiyundo_scanview[depends] += "${PN}:do_scanbuild"
36*4882a593Smuzhiyundo_scanbuild[depends] += "clang-native:do_populate_sysroot"
37*4882a593Smuzhiyun#do_scanbuild[cleandirs] += "${SCAN_RESULTS_DIR}"
38*4882a593Smuzhiyundo_scanbuild[dirs] += "${B}"
39*4882a593Smuzhiyundo_scanview[dirs] += "${SCAN_RESULTS_DIR}"
40*4882a593Smuzhiyun#do_build[recrdeptask] += "do_scanbuild"
41*4882a593Smuzhiyun
42*4882a593Smuzhiyundo_scanbuild[doc] = "Build and scan static analysis data using clang"
43*4882a593Smuzhiyundo_scanview[doc] = "Start a webserver to visualize static analysis data"
44*4882a593Smuzhiyun
45*4882a593Smuzhiyunaddtask scanbuild after do_configure before do_compile
46*4882a593Smuzhiyunaddtask scanview after do_scanbuild
47*4882a593Smuzhiyunpython () {
48*4882a593Smuzhiyun    # Remove scanbuild task when scanning is not enabled or recipe does not have do_configure
49*4882a593Smuzhiyun    if not(d.getVar('SCAN_BUILD') == "1") or not(d.getVar('TOOLCHAIN') == "clang") or oe.utils.inherits(d, 'allarch'):
50*4882a593Smuzhiyun        for i in ['do_scanbuild', 'do_scanview']:
51*4882a593Smuzhiyun            bb.build.deltask(i, d)
52*4882a593Smuzhiyun    else:
53*4882a593Smuzhiyun        cflags = d.getVar('CFLAGS', False) + d.getVar('TARGET_CC_ARCH', False) + d.getVar('TOOLCHAIN_OPTIONS', False)
54*4882a593Smuzhiyun        cxxflags = d.getVar('CXXFLAGS', False) + d.getVar('TARGET_CC_ARCH', False) + d.getVar('TOOLCHAIN_OPTIONS', False)
55*4882a593Smuzhiyun        d.setVar('CFLAGS', cflags)
56*4882a593Smuzhiyun        d.setVar('CXXFLAGS', cxxflags)
57*4882a593Smuzhiyun        if oe.utils.inherits(d, 'autotools'):
58*4882a593Smuzhiyun            cachedvar = d.getVar('CACHED_CONFIGUREVARS', False)
59*4882a593Smuzhiyun            cachedvar = cachedvar + " scan-build " + " --analyzer-target " + d.getVar('HOST_SYS', False) + " --use-cc " + d.getVar('CCSCAN', False) + " --use-c++ " + d.getVar('CXXSCAN', False)
60*4882a593Smuzhiyun            d.setVar('CACHED_CONFIGUREVARS', cachedvar)
61*4882a593Smuzhiyun}
62