341610b8a1
* fbt: added firmware_pvscheck & firmware_pvs targets for *nix * fbt: pvs support on Windows * fbt: additional fixes & docs for PVS support * fbt: fixes for updater env configuration * github: reworked pvs workflow * vscode: added PVS shortcut * pvs: added --ignore-ccache flag * fbt: pvs: opening web browser if there are warnings * fbt: pvs: added browser handler for mac * github: fixed report path for PVS * fbt: pvs: fixed report upload path * removed intentional PVS warning * fixed more PVS warnings * fixed secplus_v1 PVS warning * fbt: added PVSNOBROWSER flag * github: setting PVSNOBROWSER for pvs runs * fbt: less debug output Co-authored-by: あく <alleteam@gmail.com>
107 lines
2.9 KiB
Python
107 lines
2.9 KiB
Python
from SCons.Builder import Builder
|
|
from SCons.Action import Action
|
|
from SCons.Script import Delete, Mkdir, GetBuildFailures
|
|
import multiprocessing
|
|
import webbrowser
|
|
import atexit
|
|
import sys
|
|
import subprocess
|
|
|
|
__no_browser = False
|
|
|
|
|
|
def _set_browser_action(target, source, env):
|
|
if env["PVSNOBROWSER"]:
|
|
global __no_browser
|
|
__no_browser = True
|
|
|
|
|
|
def emit_pvsreport(target, source, env):
|
|
target_dir = env["REPORT_DIR"]
|
|
if env["PLATFORM"] == "win32":
|
|
# Report generator on Windows emits to a subfolder of given output folder
|
|
target_dir = target_dir.Dir("fullhtml")
|
|
return [target_dir.File("index.html")], source
|
|
|
|
|
|
def atexist_handler():
|
|
global __no_browser
|
|
if __no_browser:
|
|
return
|
|
|
|
for bf in GetBuildFailures():
|
|
if bf.node.exists and bf.node.name.endswith(".html"):
|
|
# macOS
|
|
if sys.platform == "darwin":
|
|
subprocess.run(["open", bf.node.abspath])
|
|
else:
|
|
webbrowser.open(bf.node.abspath)
|
|
break
|
|
|
|
|
|
def generate(env):
|
|
env.SetDefault(
|
|
PVSNCORES=multiprocessing.cpu_count(),
|
|
PVSOPTIONS=[
|
|
"@.pvsoptions",
|
|
"-j${PVSNCORES}",
|
|
# "--incremental", # kinda broken on PVS side
|
|
],
|
|
PVSCONVOPTIONS=[
|
|
"-a",
|
|
"GA:1,2,3",
|
|
"-t",
|
|
"fullhtml",
|
|
"--indicate-warnings",
|
|
],
|
|
)
|
|
|
|
if env["PLATFORM"] == "win32":
|
|
env.SetDefault(
|
|
PVSCHECKBIN="CompilerCommandsAnalyzer.exe",
|
|
PVSCONVBIN="PlogConverter.exe",
|
|
)
|
|
else:
|
|
env.SetDefault(
|
|
PVSCHECKBIN="pvs-studio-analyzer",
|
|
PVSCONVBIN="plog-converter",
|
|
)
|
|
|
|
if not env["VERBOSE"]:
|
|
env.SetDefault(
|
|
PVSCHECKCOMSTR="\tPVS\t${TARGET}",
|
|
PVSCONVCOMSTR="\tPVSREP\t${TARGET}",
|
|
)
|
|
|
|
env.Append(
|
|
BUILDERS={
|
|
"PVSCheck": Builder(
|
|
action=Action(
|
|
'${PVSCHECKBIN} analyze ${PVSOPTIONS} -f "${SOURCE}" -o "${TARGET}"',
|
|
"${PVSCHECKCOMSTR}",
|
|
),
|
|
suffix=".log",
|
|
src_suffix=".json",
|
|
),
|
|
"PVSReport": Builder(
|
|
action=Action(
|
|
[
|
|
Delete("${TARGET.dir}"),
|
|
# PlogConverter.exe and plog-converter have different behavior
|
|
Mkdir("${TARGET.dir}") if env["PLATFORM"] == "win32" else None,
|
|
Action(_set_browser_action, None),
|
|
'${PVSCONVBIN} ${PVSCONVOPTIONS} "${SOURCE}" -o "${REPORT_DIR}"',
|
|
],
|
|
"${PVSCONVCOMSTR}",
|
|
),
|
|
emitter=emit_pvsreport,
|
|
src_suffix=".log",
|
|
),
|
|
}
|
|
)
|
|
atexit.register(atexist_handler)
|
|
|
|
|
|
def exists(env):
|
|
return True
|