Files
spark/tools/py/build_data_stream_query_analyzer.py
T
John Colvin dfa47bd88e Fix build scripts so they propagate the exit code back to the shell
I noticed this was broken because launch.json configurations would still start the debugger
even when the preLaunchTask (build) failed!
2024-10-14 17:21:45 +00:00

120 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 DataStreamQueryAnalyzer.sln")
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):
sln = SparkPaths.root().joinpath(
"src", "DataStreamSuite", "DataStreamQueryAnalyzer.sln"
)
cfg = args.configuration.title()
verbosity = _dotnet_verbosity(args.verbosity)
return f"dotnet {action} {sln} --configuration {cfg} --verbosity {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_query_analyzer.py failed: {e}")
exit(1)