I noticed this was broken because launch.json configurations would still start the debugger even when the preLaunchTask (build) failed!
118 lines
3.2 KiB
Python
118 lines
3.2 KiB
Python
import argparse
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
from core.file_utils import SparkPaths
|
|
from core.iter_utils import at_bounded
|
|
|
|
|
|
def _get_arg_parser():
|
|
parser = argparse.ArgumentParser(description="Build Data Stream Web App")
|
|
parser.add_argument(
|
|
"--configuration",
|
|
metavar="debug|release",
|
|
help="The build configuration",
|
|
)
|
|
parser.add_argument(
|
|
"--clean",
|
|
action="store_true",
|
|
help="Perform a clean build (remove artifacts from previous build)",
|
|
)
|
|
parser.add_argument(
|
|
"--verbosity",
|
|
metavar="{0-5}",
|
|
choices=range(0, 6),
|
|
type=int,
|
|
help="The output verbosity level",
|
|
)
|
|
parser.add_argument(
|
|
"--dry-run",
|
|
action="store_true",
|
|
help="Preview the build commands without running them",
|
|
)
|
|
parser.set_defaults(
|
|
configuration="debug",
|
|
clean=False,
|
|
verbosity=1,
|
|
)
|
|
return parser
|
|
|
|
|
|
def _dotnet_verbosity(level):
|
|
names = ["quiet", "minimal", "normal", "detailed", "diagnostic"]
|
|
return at_bounded(names, level)
|
|
|
|
|
|
def _cmake_verbosity(level):
|
|
# Skip 'WARNING' and 'NOTICE' levels, since the default CMake verbosity,
|
|
# 'STATUS', doesn't produce that much output. This also better normalizes
|
|
# numeric representation of verbosity w/ dotnet, which only has 5 levels.
|
|
names = [
|
|
"ERROR",
|
|
# 'WARNING',
|
|
# 'NOTICE',
|
|
"STATUS",
|
|
"VERBOSE",
|
|
"DEBUG",
|
|
"TRACE",
|
|
]
|
|
return at_bounded(names, level)
|
|
|
|
|
|
def _cmake_preset():
|
|
match sys.platform:
|
|
case "win32":
|
|
return "data-stream-suite-windows"
|
|
case "linux":
|
|
return "data-stream-suite-linux"
|
|
case _:
|
|
raise ValueError(f"Unsupported platform {sys.platform}")
|
|
|
|
|
|
def _cmake_build_preset(configuration):
|
|
match sys.platform:
|
|
case "win32":
|
|
return f"data-stream-suite-windows-{configuration}"
|
|
case "linux":
|
|
return f"data-stream-suite-linux-{configuration}"
|
|
case _:
|
|
raise ValueError(f"Unsupported platform {sys.platform}")
|
|
|
|
|
|
def _main():
|
|
parser = _get_arg_parser()
|
|
args = parser.parse_args()
|
|
|
|
def run(cmd):
|
|
print(cmd)
|
|
if args.dry_run:
|
|
return
|
|
subprocess.run(cmd, shell=True).check_returncode()
|
|
|
|
def dotnet_cmd(action="build"):
|
|
csproj = SparkPaths.root().joinpath(
|
|
"src", "DataStreamSuite", "Bts.DataStreamWebApp.Server", "Bts.DataStreamWebApp.Server.csproj"
|
|
)
|
|
return f"dotnet {action} {csproj} --configuration {args.configuration.title()} --verbosity {_dotnet_verbosity(args.verbosity)}"
|
|
|
|
os.chdir(SparkPaths.root())
|
|
cmake_configure_cmd = f"cmake --preset {_cmake_preset()} -DCMAKE_MESSAGE_LOG_LEVEL={_cmake_verbosity(args.verbosity)}"
|
|
cmake_build_cmd = (
|
|
f"cmake --build --preset {_cmake_build_preset(args.configuration.lower())}"
|
|
)
|
|
if args.clean:
|
|
run(f"{cmake_build_cmd} --target clean")
|
|
run(dotnet_cmd("clean"))
|
|
run(cmake_configure_cmd)
|
|
run(cmake_build_cmd)
|
|
run(dotnet_cmd("build"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
_main()
|
|
except Exception as e:
|
|
print(f"build_data_stream_web_app.py failed: {e}")
|
|
exit(1)
|