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