mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-29 16:25:47 +03:00
98d5718ec9
* fbt: changed cdefines & lib handling for external apps; added extra checks for app manifest fields; moved around AppsC generator * fbt: commandline fixes for spaces in paths * fbt: fixed stringification for FAP_VERSION * fbt: Removed excessive quoting for gdb * docs: update for cdefines; fbt: typo fix * fbt: enforcing at least 2 components in app version= Co-authored-by: あく <alleteam@gmail.com>
129 lines
3.6 KiB
Python
129 lines
3.6 KiB
Python
import atexit
|
|
import multiprocessing
|
|
import subprocess
|
|
import sys
|
|
import webbrowser
|
|
|
|
from SCons.Action import Action
|
|
from SCons.Builder import Builder
|
|
from SCons.Script import Delete, Flatten, GetBuildFailures, Mkdir
|
|
|
|
__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():
|
|
for node in Flatten(bf.node):
|
|
if node.exists and node.name.endswith(".html"):
|
|
# macOS
|
|
if sys.platform == "darwin":
|
|
subprocess.run(["open", node.abspath])
|
|
else:
|
|
webbrowser.open(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),
|
|
Action(
|
|
[
|
|
[
|
|
"${PVSCONVBIN}",
|
|
"${PVSCONVOPTIONS}",
|
|
"${SOURCE}",
|
|
"-o",
|
|
"${REPORT_DIR}",
|
|
]
|
|
]
|
|
),
|
|
],
|
|
"${PVSCONVCOMSTR}",
|
|
),
|
|
emitter=_emit_pvsreport,
|
|
src_suffix=".log",
|
|
),
|
|
}
|
|
)
|
|
atexit.register(atexist_handler)
|
|
|
|
|
|
def exists(env):
|
|
return True
|