Files
spark/tools/py/build_api_server.py
T
John Colvin 7d2e7e4665 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-07-12 18:28:46 -04:00

125 lines
3.3 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 the Spark Api Server (websockets)')
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 'spark-api-server-windows'
case 'linux':
return 'spark-api-server-linux'
case _:
raise ValueError(f'Unsupported platform {sys.platform}')
def _cmake_build_preset(configuration):
match sys.platform:
case 'win32':
return f'spark-api-server-windows-{configuration}'
case 'linux':
return f'spark-api-server-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'):
sln = SparkPaths.root().joinpath('Spark.Api.Server.sln')
return ' '.join([
f'dotnet {action} {sln}',
f'--configuration {args.configuration.title()}',
f'--verbosity {_dotnet_verbosity(args.verbosity)}',
])
os.chdir(SparkPaths.root())
cmake_configure_cmd = ' '.join([
f'cmake',
f'--preset',
_cmake_preset(),
f'-DCMAKE_MESSAGE_LOG_LEVEL={_cmake_verbosity(args.verbosity)}',
])
cmake_build_cmd = ' '.join([
f'cmake',
f'--build',
f'--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_api_server.py failed: {e}')
exit(1)