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."""