diff --git a/.efrocachemap b/.efrocachemap index 3eccef2c..34490194 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -3948,8 +3948,8 @@ "build/prefab/lib/linux_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/32/03/d4dd9c398eab7c7da62b2e7a4096", "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/11/f5/cb2b3a42e4384d6ac4dfe7a98213", "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/06/aa/fc55996ce9a1a3e898d1348873ff", - "build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/f7/16/01f6978b6262c3033aadfb4ad24f", - "build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d8/21/d65fb091c26cc7b683768ea19705", - "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/13/0c/a2f421ae193496383524772a1e76", - "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/c9/a7/f55ab74860ab4f6ef4983e144e76" + "build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/41/6b/19bf8c7fa531a27076d1c0babaff", + "build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fd/66/69bc3327543d711753013b9fc821", + "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/80/37/41e0842744af078a54e2477045e0", + "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/cf/f5/f2df776067491dbc09500c9c3966" } \ No newline at end of file diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml index 188136d2..642be9b5 100644 --- a/.idea/dictionaries/ericf.xml +++ b/.idea/dictionaries/ericf.xml @@ -541,6 +541,7 @@ dstattr dstbase dstdata + dstdirname dstfile dstfin dstjson @@ -1098,6 +1099,7 @@ levelname lfull lfval + libballisticacore libcrypto libdir libegl @@ -1262,6 +1264,7 @@ modders modename modestr + modeval modpack modtimes moduledir @@ -1794,6 +1797,7 @@ servercfg servercmd serverdialog + serverdst serverget servermanager servermode diff --git a/Makefile b/Makefile index b901ecca..e93c078f 100644 --- a/Makefile +++ b/Makefile @@ -235,32 +235,11 @@ prefab-mac-arm64-server-debug: prefab-mac-arm64-server-debug-build prefab-mac-x86-64-server-debug-build: prereqs assets-cmake \ build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless \ - build/prefab/full/mac_x86_64_server/debug/ballisticacore_server \ - build/prefab/full/mac_x86_64_server/debug/config_template.yaml \ - build/prefab/full/mac_x86_64_server/debug/README.txt - @${STAGE_ASSETS} -cmakeserver build/prefab/full/mac_x86_64_server/debug/dist + @${STAGE_ASSETS} -cmakeserver -debug build/prefab/full/mac_x86_64_server/debug prefab-mac-arm64-server-debug-build: prereqs assets-cmake \ build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless \ - build/prefab/full/mac_arm64_server/debug/ballisticacore_server \ - build/prefab/full/mac_arm64_server/debug/config_template.yaml \ - build/prefab/full/mac_arm64_server/debug/README.txt - @${STAGE_ASSETS} -cmakeserver build/prefab/full/mac_arm64_server/debug/dist - -build/prefab/full/mac_%_server/debug/ballisticacore_server: \ - assets/src/server/ballisticacore_server.py tools/batools/pcommand.py - @tools/pcommand stage_server_file debug $< $@ - -build/prefab/full/mac_%_server/debug/config_template.yaml: \ - assets/src/server/config_template.yaml \ - tools/batools/build.py \ - tools/batools/pcommand.py \ - tools/bacommon/servermanager.py - @tools/pcommand stage_server_file debug $< $@ - -build/prefab/full/mac_%_server/debug/README.txt: \ - assets/src/server/README.txt - @cp $< $@ + @${STAGE_ASSETS} -cmakeserver -debug build/prefab/full/mac_arm64_server/debug build/prefab/full/mac_%_server/debug/dist/ballisticacore_headless: .efrocachemap @tools/pcommand efrocache_get $@ @@ -286,32 +265,13 @@ prefab-mac-arm64-server-release: prefab-mac-arm64-server-release-build prefab-mac-x86-64-server-release-build: prereqs assets-cmake \ build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless \ - build/prefab/full/mac_x86_64_server/release/ballisticacore_server \ - build/prefab/full/mac_x86_64_server/release/config_template.yaml \ - build/prefab/full/mac_x86_64_server/release/README.txt - @${STAGE_ASSETS} -cmakeserver build/prefab/full/mac_x86_64_server/release/dist + @${STAGE_ASSETS} -cmakeserver -release \ + build/prefab/full/mac_x86_64_server/release prefab-mac-arm64-server-release-build: prereqs assets-cmake \ build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless \ - build/prefab/full/mac_arm64_server/release/ballisticacore_server \ - build/prefab/full/mac_arm64_server/release/config_template.yaml \ - build/prefab/full/mac_arm64_server/release/README.txt - @${STAGE_ASSETS} -cmakeserver build/prefab/full/mac_arm64_server/release/dist - -build/prefab/full/mac_%_server/release/ballisticacore_server: \ - assets/src/server/ballisticacore_server.py tools/batools/pcommand.py - @tools/pcommand stage_server_file release $< $@ - -build/prefab/full/mac_%_server/release/config_template.yaml: \ - assets/src/server/config_template.yaml \ - tools/batools/build.py \ - tools/batools/pcommand.py \ - tools/bacommon/servermanager.py - @tools/pcommand stage_server_file release $< $@ - -build/prefab/full/mac_%_server/release/README.txt: \ - assets/src/server/README.txt - @cp $< $@ + @${STAGE_ASSETS} -cmakeserver -release \ + build/prefab/full/mac_arm64_server/release build/prefab/full/mac_%_server/release/dist/ballisticacore_headless: .efrocachemap @tools/pcommand efrocache_get $@ @@ -397,32 +357,13 @@ prefab-linux-arm64-server-debug: prefab-linux-arm64-server-debug-build prefab-linux-x86-64-server-debug-build: prereqs assets-cmake \ build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless \ - build/prefab/full/linux_x86_64_server/debug/ballisticacore_server \ - build/prefab/full/linux_x86_64_server/debug/config_template.yaml \ - build/prefab/full/linux_x86_64_server/debug/README.txt - @${STAGE_ASSETS} -cmakeserver build/prefab/full/linux_x86_64_server/debug/dist + @${STAGE_ASSETS} -cmakeserver -debug \ + build/prefab/full/linux_x86_64_server/debug prefab-linux-arm64-server-debug-build: prereqs assets-cmake \ build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless \ - build/prefab/full/linux_arm64_server/debug/ballisticacore_server \ - build/prefab/full/linux_arm64_server/debug/config_template.yaml \ - build/prefab/full/linux_arm64_server/debug/README.txt - @${STAGE_ASSETS} -cmakeserver build/prefab/full/linux_arm64_server/debug/dist - -build/prefab/full/linux_%_server/debug/ballisticacore_server: \ - assets/src/server/ballisticacore_server.py tools/batools/pcommand.py - @tools/pcommand stage_server_file debug $< $@ - -build/prefab/full/linux_%_server/debug/config_template.yaml: \ - assets/src/server/config_template.yaml \ - tools/batools/build.py \ - tools/batools/pcommand.py \ - tools/bacommon/servermanager.py - @tools/pcommand stage_server_file debug $< $@ - -build/prefab/full/linux_%_server/debug/README.txt: \ - assets/src/server/README.txt - @cp $< $@ + @${STAGE_ASSETS} -cmakeserver -debug \ + build/prefab/full/linux_arm64_server/debug build/prefab/full/linux_%_server/debug/dist/ballisticacore_headless: .efrocachemap @tools/pcommand efrocache_get $@ @@ -442,28 +383,19 @@ prefab-linux-x86-64-server-release: prefab-linux-x86-64-server-release-build @tools/pcommand ensure_prefab_platform linux_x86_64 @${RUN_PREFAB_LINUX_X86_64_SERVER_RELEASE} +prefab-linux-arm64-server-release: prefab-linux-arm64-server-release-build + @tools/pcommand ensure_prefab_platform linux_arm64 + @${RUN_PREFAB_LINUX_ARM64_SERVER_RELEASE} + prefab-linux-x86-64-server-release-build: prereqs assets-cmake \ build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless \ - build/prefab/full/linux_x86_64_server/release/ballisticacore_server \ - build/prefab/full/linux_x86_64_server/release/config_template.yaml \ - build/prefab/full/linux_x86_64_server/release/README.txt - @${STAGE_ASSETS} \ - -cmakeserver build/prefab/full/linux_x86_64_server/release/dist + @${STAGE_ASSETS} -cmakeserver -release \ + build/prefab/full/linux_x86_64_server/release -build/prefab/full/linux_%_server/release/ballisticacore_server: \ - assets/src/server/ballisticacore_server.py tools/batools/pcommand.py - @tools/pcommand stage_server_file release $< $@ - -build/prefab/full/linux_%_server/release/config_template.yaml: \ - assets/src/server/config_template.yaml \ - tools/batools/build.py \ - tools/batools/pcommand.py \ - tools/bacommon/servermanager.py - @tools/pcommand stage_server_file release $< $@ - -build/prefab/full/linux_%_server/release/README.txt: \ - assets/src/server/README.txt - @cp $< $@ +prefab-linux-arm64-server-release-build: prereqs assets-cmake \ + build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless \ + @${STAGE_ASSETS} -cmakeserver -release \ + build/prefab/full/linux_arm64_server/release build/prefab/full/linux_%_server/release/dist/ballisticacore_headless: .efrocachemap @tools/pcommand efrocache_get $@ @@ -519,35 +451,12 @@ prefab-windows-x86-server-debug: prefab-windows-x86-server-debug-build prefab-windows-x86-server-debug-build: prereqs \ assets-windows-${WINPLAT_X86} \ build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe \ - build/prefab/full/windows_x86_server/debug/launch_ballisticacore_server.bat \ - build/prefab/full/windows_x86_server/debug/ballisticacore_server.py \ - build/prefab/full/windows_x86_server/debug/config_template.yaml \ - build/prefab/full/windows_x86_server/debug/README.txt @${STAGE_ASSETS} -winserver-${WINPLAT_X86}-Debug \ - build/prefab/full/windows_x86_server/debug/dist + build/prefab/full/windows_x86_server/debug build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe: .efrocachemap @tools/pcommand efrocache_get $@ -build/prefab/full/windows_%_server/debug/ballisticacore_server.py: \ - assets/src/server/ballisticacore_server.py tools/batools/pcommand.py - @tools/pcommand stage_server_file debug $< $@ - -build/prefab/full/windows_%_server/debug/launch_ballisticacore_server.bat: \ - assets/src/server/launch_ballisticacore_server.bat tools/batools/pcommand.py - @tools/pcommand stage_server_file debug $< $@ - -build/prefab/full/windows_%_server/debug/config_template.yaml: \ - assets/src/server/config_template.yaml \ - tools/batools/build.py \ - tools/batools/pcommand.py \ - tools/bacommon/servermanager.py - @tools/pcommand stage_server_file debug $< $@ - -build/prefab/full/windows_%_server/debug/README.txt: \ - assets/src/server/README.txt - @cp $< $@ - # Windows server release: RUN_PREFAB_WINDOWS_X86_SERVER_RELEASE = cd \ @@ -560,36 +469,13 @@ prefab-windows-x86-server-release: prefab-windows-x86-server-release-build prefab-windows-x86-server-release-build: prereqs \ assets-windows-${WINPLAT_X86} \ - build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe \ - build/prefab/full/windows_x86_server/release/launch_ballisticacore_server.bat \ - build/prefab/full/windows_x86_server/release/ballisticacore_server.py \ - build/prefab/full/windows_x86_server/release/config_template.yaml \ - build/prefab/full/windows_x86_server/release/README.txt + build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe @${STAGE_ASSETS} -winserver-${WINPLAT_X86}-Release \ - build/prefab/full/windows_x86_server/release/dist + build/prefab/full/windows_x86_server/release build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe: .efrocachemap @tools/pcommand efrocache_get $@ -build/prefab/full/windows_%_server/release/ballisticacore_server.py: \ - assets/src/server/ballisticacore_server.py tools/batools/pcommand.py - @tools/pcommand stage_server_file release $< $@ - -build/prefab/full/windows_%_server/release/launch_ballisticacore_server.bat: \ - assets/src/server/launch_ballisticacore_server.bat tools/batools/pcommand.py - @tools/pcommand stage_server_file release $< $@ - -build/prefab/full/windows_%_server/release/config_template.yaml: \ - assets/src/server/config_template.yaml \ - tools/batools/build.py \ - tools/batools/pcommand.py \ - tools/bacommon/servermanager.py - @tools/pcommand stage_server_file release $< $@ - -build/prefab/full/windows_%_server/release/README.txt: \ - assets/src/server/README.txt - @cp $< $@ - # Tell make which of these targets don't represent files. .PHONY: prefab-debug prefab-release prefab-debug-build prefab-release-build \ prefab-server-debug prefab-server-release prefab-server-debug-build \ @@ -608,7 +494,9 @@ build/prefab/full/windows_%_server/release/README.txt: \ prefab-linux-x86-64-release-build prefab-linux-arm64-release-build \ prefab-linux-x86-64-server-debug prefab-linux-arm64-server-debug \ prefab-linux-x86-64-server-debug-build prefab-linux-arm64-server-debug-build \ - prefab-linux-x86-64-server-release prefab-linux-x86-64-server-release-build \ + prefab-linux-x86-64-server-release prefab-linux-arm64-server-release \ + prefab-linux-x86-64-server-release-build \ + prefab-linux-arm64-server-release-build \ prefab-windows-x86-debug prefab-windows-x86-debug-build \ prefab-windows-x86-release prefab-windows-x86-release-build \ prefab-windows-x86-server-debug prefab-windows-x86-server-debug-build \ @@ -842,7 +730,7 @@ cmake-server: cmake-server-build cmake-server-build: assets-cmake resources code @tools/pcommand cmake_prep_dir build/cmake/server-$(CM_BT_LC) - @${STAGE_ASSETS} -cmakeserver build/cmake/server-$(CM_BT_LC) + @${STAGE_ASSETS} -cmakeserver -${CM_BT_LC} build/cmake/server-$(CM_BT_LC) @cd build/cmake/server-$(CM_BT_LC) && test -f Makefile \ || cmake -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) -DHEADLESS=true \ ../../../ballisticacore-cmake diff --git a/tools/batools/assetstaging.py b/tools/batools/assetstaging.py index 204e68d8..6d418694 100755 --- a/tools/batools/assetstaging.py +++ b/tools/batools/assetstaging.py @@ -16,6 +16,7 @@ from efrotools import PYVER if TYPE_CHECKING: from typing import Optional, List + from pathlib import Path # Suffix for the pyc files we include in stagings. # We're using deterministic opt pyc files; see PEP 552. @@ -33,6 +34,7 @@ class Config: # We always calc src relative to this script. self.src = self.projroot + '/assets/build' self.dst: Optional[str] = None + self.serverdst: Optional[str] = None self.win_extras_src: Optional[str] = None self.win_platform: Optional[str] = None self.win_type: Optional[str] = None @@ -104,12 +106,13 @@ class Config: self.win_platform = winplt self.win_type = wintype assert winempty == '' - self.dst = args[1] self.tex_suffix = '.dds' if wintype == 'win': - pass + self.dst = args[-1] elif wintype == 'winserver': + self.dst = os.path.join(args[-1], 'dist') + self.serverdst = args[-1] self.include_textures = False self.include_audio = False self.include_models = False @@ -143,10 +146,20 @@ class Config: self.dst = args[1] self.tex_suffix = '.dds' elif '-cmakeserver' in args: - self.dst = args[1] + self.dst = os.path.join(args[-1], 'dist') + self.serverdst = args[-1] self.include_textures = False self.include_audio = False self.include_models = False + # Require either -debug or -release in args. + if '-debug' in args: + self.debug = True + assert '-release' not in args + elif '-release' in args: + self.debug = False + else: + raise RuntimeError( + "Expected either '-debug' or '-release' in args.") elif '-xcode-mac' in args: self.src = os.environ['SOURCE_ROOT'] + '/assets/build' self.dst = (os.environ['TARGET_BUILD_DIR'] + '/' + @@ -314,35 +327,7 @@ def _sync_pylib(cfg: Config) -> None: _run(cmd) -def main(projroot: str, args: Optional[List[str]] = None) -> None: - """Stage assets for a build.""" - - if args is None: - args = sys.argv - - cfg = Config(projroot) - cfg.parse_args(args) - - # Ok, now for every top level dir in src, come up with a nice single - # command to sync the needed subset of it to dst. - - # We can now use simple speedy timestamp based updates since - # we no longer have to try to preserve timestamps to get .pyc files - # to behave (hooray!) - - # Do our stripped down pylib dir for platforms that use that. - if cfg.include_pylib: - _sync_pylib(cfg) - else: - if cfg.dst is not None and os.path.isdir(cfg.dst + '/pylib'): - subprocess.run(['rm', '-rf', cfg.dst + '/pylib'], check=True) - - # On windows we need to pull in some dlls and this and that - # (we also include a non-stripped-down set of python libs). - if cfg.win_extras_src is not None: - _sync_windows_extras(cfg) - - # Now standard common game data. +def _sync_standard_game_data(cfg: Config) -> None: assert cfg.dst is not None _run('mkdir -p "' + cfg.dst + '/ba_data"') cmd = ('rsync --recursive --update --delete --delete-excluded' @@ -374,15 +359,147 @@ def main(projroot: str, args: Optional[List[str]] = None) -> None: cfg.dst + '/ba_data/"') _run(cmd) + +def _sync_server_files(cfg: Config) -> None: + assert cfg.serverdst is not None + modeval = 'debug' if cfg.debug else 'release' + stage_server_file(projroot=cfg.projroot, + mode=modeval, + infilename='assets/src/server/ballisticacore_server.py', + outfilename=os.path.join( + cfg.serverdst, + 'ballisticacore_server.py' if cfg.win_type + is not None else 'ballisticacore_server')) + stage_server_file(projroot=cfg.projroot, + mode=modeval, + infilename='assets/src/server/README.txt', + outfilename=os.path.join(cfg.serverdst, 'README.txt')) + stage_server_file(projroot=cfg.projroot, + mode=modeval, + infilename='assets/src/server/config_template.yaml', + outfilename=os.path.join(cfg.serverdst, + 'config_template.yaml')) + if cfg.win_type is not None: + stage_server_file( + projroot=cfg.projroot, + mode=modeval, + infilename='assets/src/server/launch_ballisticacore_server.bat', + outfilename=os.path.join(cfg.serverdst, + 'launch_ballisticacore_server.bat')) + + +def _write_if_changed(path: str, + contents: str, + make_executable: bool = False) -> None: + changed: bool + try: + with open(path) as infile: + existing = infile.read() + changed = (contents != existing) + except FileNotFoundError: + changed = True + if changed: + with open(path, 'w') as outfile: + outfile.write(contents) + if make_executable: + subprocess.run(['chmod', '+x', path], check=True) + + +def stage_server_file(projroot: str, mode: str, infilename: str, + outfilename: str) -> None: + """Stage files for the server environment with some filtering.""" + import batools.build + from efrotools import replace_one + if mode not in ('debug', 'release'): + raise RuntimeError(f"Invalid server-file-staging mode '{mode}';" + f" expected 'debug' or 'release'.") + + print(f'Building server file: {os.path.basename(outfilename)}') + + os.makedirs(os.path.dirname(outfilename), exist_ok=True) + + basename = os.path.basename(infilename) + if basename == 'config_template.yaml': + # Inject all available config values into the config file. + _write_if_changed( + outfilename, + batools.build.filter_server_config(str(projroot), infilename)) + + elif basename == 'ballisticacore_server.py': + # Run Python in opt mode for release builds. + with open(infilename) as infile: + lines = infile.read().splitlines() + if mode == 'release': + lines[0] = replace_one(lines[0], + f'#!/usr/bin/env python{PYVER}', + f'#!/usr/bin/env -S python{PYVER} -O') + _write_if_changed(outfilename, + '\n'.join(lines) + '\n', + make_executable=True) + elif basename == 'README.txt': + with open(infilename) as infile: + readme = infile.read() + _write_if_changed(outfilename, readme) + elif basename == 'launch_ballisticacore_server.bat': + # Run Python in opt mode for release builds. + with open(infilename) as infile: + lines = infile.read().splitlines() + if mode == 'release': + lines[1] = replace_one( + lines[1], ':: Python interpreter.', ':: Python interpreter.' + ' (in opt mode so we use bundled .opt-1.pyc files)') + lines[2] = replace_one( + lines[2], 'dist\\\\python.exe ballisticacore_server.py', + 'dist\\\\python.exe -O ballisticacore_server.py') + else: + # In debug mode we use the bundled debug interpreter. + lines[2] = replace_one( + lines[2], 'dist\\\\python.exe ballisticacore_server.py', + 'dist\\\\python_d.exe ballisticacore_server.py') + + with open(outfilename, 'w') as outfile: + outfile.write('\n'.join(lines) + '\n') + else: + raise RuntimeError(f"Unknown server file for staging: '{basename}'.") + + +def main(projroot: str, args: Optional[List[str]] = None) -> None: + """Stage assets for a build.""" + + if args is None: + args = sys.argv + + cfg = Config(projroot) + cfg.parse_args(args) + + # Ok, now for every top level dir in src, come up with a nice single + # command to sync the needed subset of it to dst. + + # We can now use simple speedy timestamp based updates since + # we no longer have to try to preserve timestamps to get .pyc files + # to behave (hooray!) + + # Do our stripped down pylib dir for platforms that use that. + if cfg.include_pylib: + _sync_pylib(cfg) + else: + if cfg.dst is not None and os.path.isdir(cfg.dst + '/pylib'): + subprocess.run(['rm', '-rf', cfg.dst + '/pylib'], check=True) + + # Sync our server files if we're doing that. + if cfg.serverdst is not None: + _sync_server_files(cfg) + + # On windows we need to pull in some dlls and this and that + # (we also include a non-stripped-down set of python libs). + if cfg.win_extras_src is not None: + _sync_windows_extras(cfg) + + # Standard stuff in ba_data + _sync_standard_game_data(cfg) + # On Android we need to build a payload file so it knows # what to pull out of the apk. if cfg.include_payload_file: + assert cfg.dst is not None _write_payload_file(cfg.dst, cfg.is_payload_full) - - -# if __name__ == '__main__': -# try: -# main() -# except CleanError as exc: -# exc.pretty_print() -# sys.exit(1) diff --git a/tools/batools/build.py b/tools/batools/build.py index 2d09ee9b..5a638f1e 100644 --- a/tools/batools/build.py +++ b/tools/batools/build.py @@ -648,15 +648,12 @@ def _get_server_config_template_yaml(projroot: str) -> str: return '\n'.join(lines_out) -def filter_server_config(projroot: str, infilepath: str, - outfilepath: str) -> None: +def filter_server_config(projroot: str, infilepath: str) -> str: """Add commented-out config options to a server config.""" with open(infilepath) as infile: cfg = infile.read() - cfg = cfg.replace('#__CONFIG_TEMPLATE_VALUES__', - _get_server_config_template_yaml(projroot)) - with open(outfilepath, 'w') as outfile: - outfile.write(cfg) + return cfg.replace('#__CONFIG_TEMPLATE_VALUES__', + _get_server_config_template_yaml(projroot)) def update_docs_md(check: bool) -> None: diff --git a/tools/batools/pcommand.py b/tools/batools/pcommand.py index 88e47418..995fdaad 100644 --- a/tools/batools/pcommand.py +++ b/tools/batools/pcommand.py @@ -20,61 +20,14 @@ if TYPE_CHECKING: def stage_server_file() -> None: """Stage files for the server environment with some filtering.""" - import os - import subprocess - import batools.build from efro.error import CleanError - from efrotools import replace_one - from efrotools import PYVER + import batools.assetstaging if len(sys.argv) != 5: raise CleanError('Expected 3 args (mode, infile, outfile).') mode, infilename, outfilename = sys.argv[2], sys.argv[3], sys.argv[4] - if mode not in ('debug', 'release'): - raise CleanError(f"Invalid mode '{mode}'; expected debug or release.") - - print(f'Building server file: {os.path.basename(outfilename)}') - - os.makedirs(os.path.dirname(outfilename), exist_ok=True) - - basename = os.path.basename(infilename) - if basename == 'config_template.yaml': - # Inject all available config values into the config file. - batools.build.filter_server_config(str(PROJROOT), infilename, + batools.assetstaging.stage_server_file(str(PROJROOT), mode, infilename, outfilename) - elif basename == 'ballisticacore_server.py': - # Run Python in opt mode for release builds. - with open(infilename) as infile: - lines = infile.read().splitlines() - if mode == 'release': - lines[0] = replace_one(lines[0], - f'#!/usr/bin/env python{PYVER}', - f'#!/usr/bin/env -S python{PYVER} -O') - with open(outfilename, 'w') as outfile: - outfile.write('\n'.join(lines) + '\n') - subprocess.run(['chmod', '+x', outfilename], check=True) - elif basename == 'launch_ballisticacore_server.bat': - # Run Python in opt mode for release builds. - with open(infilename) as infile: - lines = infile.read().splitlines() - if mode == 'release': - lines[1] = replace_one( - lines[1], ':: Python interpreter.', ':: Python interpreter.' - ' (in opt mode so we use bundled .opt-1.pyc files)') - lines[2] = replace_one( - lines[2], 'dist\\\\python.exe ballisticacore_server.py', - 'dist\\\\python.exe -O ballisticacore_server.py') - else: - # In debug mode we use the bundled debug interpreter. - lines[2] = replace_one( - lines[2], 'dist\\\\python.exe ballisticacore_server.py', - 'dist\\\\python_d.exe ballisticacore_server.py') - - with open(outfilename, 'w') as outfile: - outfile.write('\n'.join(lines) + '\n') - else: - raise CleanError(f"Unknown server file for staging: '{basename}'.") - def py_examine() -> None: """Run a python examination at a given point in a given file."""