diff --git a/.efrocachemap b/.efrocachemap
index 41191cfc..1672304c 100644
--- a/.efrocachemap
+++ b/.efrocachemap
@@ -3932,24 +3932,32 @@
"assets/build/windows/Win32/ucrtbased.dll": "https://files.ballistica.net/cache/ba1/b5/85/f8b6d0558ddb87267f34254b1450",
"assets/build/windows/Win32/vc_redist.x86.exe": "https://files.ballistica.net/cache/ba1/1c/e1/4a1a2eddda2f4aebd5f8b64ab08e",
"assets/build/windows/Win32/vcruntime140d.dll": "https://files.ballistica.net/cache/ba1/50/8d/bc2600ac9491f1b14d659709451f",
- "build/prefab/full/linux_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a2/5f/c53f5b72ac1522e05fddf1f8aa3c",
- "build/prefab/full/linux_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/a5/2f/a977c267b82b93044d5c24535d10",
- "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/05/92/f317843a45060600773bf145f6e8",
- "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0e/9a/fc28e3b0026eb5da187ad926a660",
- "build/prefab/full/mac_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/89/b1/836fe91297961e99f4338761d129",
- "build/prefab/full/mac_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/41/4d/e1e1e06d36de397efa2229aea25b",
- "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0e/cd/5214d15f319d62528d9365279a30",
- "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c4/33/6491afaec6a52ea4603c26145dac",
- "build/prefab/full/windows_x86/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/97/42/0aca4f23d3e5e08164c07bef5220",
- "build/prefab/full/windows_x86/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/b8/a7/42ca4700ff2f117bf367df716815",
- "build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/7e/93/381f83c8b1c6c546157375fa999f",
- "build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/71/c2/38fa7a0b59671f02f03de96aabca",
- "build/prefab/lib/linux_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/54/a1/e5a2906b6bd18229f21f5a5d0876",
- "build/prefab/lib/linux_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b9/e7/ac87044e0eac75551bcacdf2e41d",
- "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/18/c2/3a457694a20c7dc22eb0d5cb67fc",
- "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3a/0c/96264568710c8e6a84af77a4f0d9",
- "build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/f4/af/a284828a6448682278b899533e3e",
- "build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1e/51/7ecca58ce0acc5108b146037f2db",
- "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/30/00/f840b3853c2c7f8a2e3fa760b493",
- "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a9/d7/526b7a83d480e6ba14bae73afd2d"
+ "build/prefab/full/linux_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ba/0a/503d80285b4e98197495d912ffe2",
+ "build/prefab/full/linux_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/87/8f/cc883d6dc9d4599694ae07640d03",
+ "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e4/9f/8a227fb667886cac6ac141eda922",
+ "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/4b/c2/a1c067dab547a61c8a635a2f14bc",
+ "build/prefab/full/mac_arm64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/8a/91/90a45733c48687ecccb3baf52d2b",
+ "build/prefab/full/mac_arm64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/05/31/483700af5f45598fd4bc535352e7",
+ "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e9/de/16ecb8f5a43cc11725ba8fd25b92",
+ "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/aa/07/f7c43b399342b1a7d311dce02bd9",
+ "build/prefab/full/mac_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/27/ba/609c8cfcf5518cb00efe1e7c4394",
+ "build/prefab/full/mac_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/8c/5b/bf4bea08d9861932a2fc64452840",
+ "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/3d/bc/91fc66b45b4109de9f9769d63163",
+ "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/cc/1b/13d06eb5703326a8d45e447eee22",
+ "build/prefab/full/windows_x86/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/db/80/f32753340c14607d7bcb06700920",
+ "build/prefab/full/windows_x86/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/2c/81/11a95002c322158e9a72fa38d209",
+ "build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/3f/98/3ba1d4b690f21b2c6fab4c56640d",
+ "build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/d8/2c/e271424b6a361e0b202723bd9b9a",
+ "build/prefab/lib/linux_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/50/30/cd615d3ad04924ab211fda6294de",
+ "build/prefab/lib/linux_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/5a/8f/8ecc7e5adf66021652d4b92c7fb0",
+ "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/41/d0/d1ecacdbdd5e42d0e171c9c04cea",
+ "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2d/dd/f11c021a66e17a63a944689b236e",
+ "build/prefab/lib/mac_arm64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/94/34/1853fd4dbd82355bbd65717c433f",
+ "build/prefab/lib/mac_arm64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/8c/fb/ee704284dbcd8fc1222507fd18e5",
+ "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/91/4d/b5e5982ebbf42b38170e0c449581",
+ "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/8e/a4/52c27869b2ebcceb6f808e85dd15",
+ "build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/58/4b/c5294de3d55ce8a6425740307ac1",
+ "build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e8/7c/ef89ae18c9bbcf44ffa4dee9ffb5",
+ "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2c/01/2604026ff01a32dfe9568626b655",
+ "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9c/42/ecaae792330e32d18521d5db91c1"
}
\ No newline at end of file
diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml
index 311586cc..2205777f 100644
--- a/.idea/dictionaries/ericf.xml
+++ b/.idea/dictionaries/ericf.xml
@@ -30,8 +30,8 @@
achname
achs
acinstance
- ack
ack'ed
+ ack
acked
acks
acnt
@@ -153,8 +153,8 @@
bacommon
badguy
bafoundation
- ballistica
ballistica's
+ ballistica
ballisticacore
ballisticacorecb
bamaster
@@ -587,6 +587,7 @@
efrocachemap
efroemling
efrogradle
+ efrohome
efrosync
efrotool
efrotools
@@ -617,6 +618,7 @@
entrytypeselect
enumtype
enumval
+ envcfg
envhash
envname
envval
@@ -769,6 +771,7 @@
freesound
froemling
frombuffer
+ fromini
fsdf
fsettings
fsplit
@@ -807,8 +810,8 @@
gamedata
gameinstance
gamemap
- gamepad
gamepad's
+ gamepad
gamepadadvanced
gamepads
gamepadselect
@@ -1197,8 +1200,8 @@
lsqlite
lssl
lstart
- lstr
lstr's
+ lstr
lstrs
lsval
ltex
@@ -1834,8 +1837,8 @@
sessionname
sessionplayer
sessionplayers
- sessionteam
sessionteam's
+ sessionteam
sessionteams
sessiontype
setactivity
@@ -1972,6 +1975,7 @@
strptime
strt
strval
+ subargs
subclassof
subcontainer
subcontainerheight
@@ -2170,8 +2174,8 @@
txtw
typeargs
typecheck
- typechecker
typechecker's
+ typechecker
typedval
typeshed
typestr
@@ -2225,6 +2229,7 @@
upkeeptimer
uploadargs
uploadcmd
+ uppercased
uptime
ureq
useragent
diff --git a/Makefile b/Makefile
index aae2e772..0d464079 100644
--- a/Makefile
+++ b/Makefile
@@ -23,8 +23,9 @@ endif
# #
################################################################################
-# Override this to 'localhost' to build cloud builds on a local Mac.
-MAC_CLOUDSHELL_HOST ?= homebook-fro
+# Cloudshell hosts used to build various platforms/architectures.
+CLOUDSHELL_HOST_MAC_X86_64 ?= homebook-fro
+CLOUDSHELL_HOST_MAC_ARM64 ?= fromini
# List targets in this Makefile and basic descriptions for them.
help:
@@ -109,7 +110,7 @@ clean-list:
@git clean -dnx ${ROOT_CLEAN_IGNORES}
# Tell make which of these targets don't represent files.
-.PHONY: list prereqs prereqs-clean assets assets-cmake assets-windows \
+.PHONY: help prereqs prereqs-clean assets assets-cmake assets-windows \
assets-windows-Win32 assets-windows-x64 \
assets-mac assets-ios assets-android assets-clean \
resources resources-clean code code-clean \
@@ -537,12 +538,12 @@ update-check: prereqs
# Run formatting on all files in the project considered 'dirty'.
format:
@${MAKE} -j3 format-code format-scripts format-makefile
- @tools/pcommand echo GRN Formatting complete!
+ @tools/pcommand echo BLD Formatting complete!
# Same but always formats; ignores dirty state.
format-full:
@${MAKE} -j3 format-code-full format-scripts-full format-makefile
- @tools/pcommand echo GRN Formatting complete!
+ @tools/pcommand echo BLD Formatting complete!
# Run formatting for compiled code sources (.cc, .h, etc.).
format-code: prereqs
diff --git a/ballisticacore-cmake/.idea/dictionaries/ericf.xml b/ballisticacore-cmake/.idea/dictionaries/ericf.xml
index a21e82c9..a11b6ae5 100644
--- a/ballisticacore-cmake/.idea/dictionaries/ericf.xml
+++ b/ballisticacore-cmake/.idea/dictionaries/ericf.xml
@@ -13,8 +13,8 @@
ack'ed
acked
acks
- aclass
aclass's
+ aclass
activityplayer
addrs
adjoint
@@ -149,8 +149,8 @@
cmath
cmds
cmdvals
- codewarrior
codewarrior's
+ codewarrior
cofnodes
collapseable
collidable
@@ -241,6 +241,7 @@
echidna
edef
efro
+ efrohome
elems
elevenbase
elevenbits
@@ -252,6 +253,7 @@
endline
endtime
entrypoint
+ envcfg
envval
ericf
ericsson
@@ -315,6 +317,7 @@
freeifaddrs
freqs
froemling
+ fromini
frompos
frontmost
ftos
@@ -815,6 +818,7 @@
stringi
strlen
strtof
+ subargs
subclsssing
subentities
subitems
@@ -894,6 +898,7 @@
unsignaled
unstuff
unsynchronized
+ uppercased
userspace
uther
uuids
diff --git a/ballisticacore-cmake/CMakeLists.txt b/ballisticacore-cmake/CMakeLists.txt
index 08af1583..78acb86e 100644
--- a/ballisticacore-cmake/CMakeLists.txt
+++ b/ballisticacore-cmake/CMakeLists.txt
@@ -9,16 +9,24 @@ option(TEST_BUILD "include testing features" OFF)
set(CMAKE_CXX_STANDARD 17)
if (APPLE)
- # Seems as of Mojave we need to explicitly pull in /usr/local stuff.
- include_directories("/usr/local/include")
- link_directories("/usr/local/lib")
+ # Seems as of Mojave we need to explicitly pull in homebrew paths.
+ # Just hard-coding recommended homebrew install paths for now.
+ # Is there a more elegant way to do this?
+ if (CMAKE_SYSTEM_PROCESSOR MATCHES arm64)
+ list(APPEND CMAKE_PREFIX_PATH /opt/homebrew)
+ include_directories("/opt/homebrew/include")
+ link_directories("/opt/homebrew/lib")
+ else()
+ list(APPEND CMAKE_PREFIX_PATH /usr/local)
+ include_directories("/usr/local/include")
+ link_directories("/usr/local/lib")
+ endif()
- # On Mac with homebrew it seems that Requesting 3.7 when we've got
- # 3.8 installed will point us at the 3.8 framework but will attempt
- # to load a 3.7 library from within it which doesn't exist. So we need
- # to be a bit more explicit telling it where to look. This is no longer
- # necessary since we're using 3.8 now but may be once 3.9 becomes available
- # through homebrew.
+ # On Mac with homebrew it seems that Requesting 3.X when we've got
+ # 3.(X+1) installed will point us at the 3.(X+1) framework but will attempt
+ # to load a 3.X library from within it which doesn't exist. So we need
+ # to be a bit more explicit telling it where to look. Note: this was last
+ # tested with 3.7; should revisit sometime to make sure still applies.
execute_process(COMMAND "python3.8-config" "--prefix"
OUTPUT_VARIABLE Python_ROOT_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE)
diff --git a/tools/batools/build.py b/tools/batools/build.py
index 2a6c2694..dbd1769f 100644
--- a/tools/batools/build.py
+++ b/tools/batools/build.py
@@ -366,8 +366,8 @@ def gen_fulltest_buildfile_apple() -> None:
lines = []
# iOS stuff
- lines.append('nice -n 18 make ios-build')
- lines.append('nice -n 18 make ios-new-build')
+ lines.append('make ios-build')
+ lines.append('make ios-new-build')
if DO_SPARSE_TEST_BUILDS:
extras = SPARSE_TEST_BUILDS[dayoffset % len(SPARSE_TEST_BUILDS)]
extras = [e for e in extras if e.startswith('ios.')]
@@ -380,7 +380,7 @@ def gen_fulltest_buildfile_apple() -> None:
raise RuntimeError(f'Unknown extra: {extra}')
# tvOS stuff
- lines.append('nice -n 18 make tvos-build')
+ lines.append('make tvos-build')
if DO_SPARSE_TEST_BUILDS:
extras = SPARSE_TEST_BUILDS[dayoffset % len(SPARSE_TEST_BUILDS)]
extras = [e for e in extras if e.startswith('tvos.')]
@@ -393,12 +393,12 @@ def gen_fulltest_buildfile_apple() -> None:
raise RuntimeError(f'Unknown extra: {extra}')
# macOS stuff
- lines.append('nice -n 18 make mac-build')
+ lines.append('make mac-build')
# (throw release build in the mix to hopefully catch opt-mode-only errors).
- lines.append('nice -n 18 make mac-appstore-release-build')
- lines.append('nice -n 18 make mac-new-build')
- lines.append('nice -n 18 make cmake-server-build')
- lines.append('nice -n 18 make cmake-build')
+ lines.append('make mac-appstore-release-build')
+ lines.append('make mac-new-build')
+ lines.append('make cmake-server-build')
+ lines.append('make cmake-build')
if DO_SPARSE_TEST_BUILDS:
extras = SPARSE_TEST_BUILDS[dayoffset % len(SPARSE_TEST_BUILDS)]
extras = [e for e in extras if e.startswith('mac.')]
@@ -457,6 +457,8 @@ def get_current_prefab_platform(wsl_gives_windows: bool = True) -> str:
if system == 'Darwin':
if machine == 'x86_64':
return 'mac_x86_64'
+ if machine == 'arm64':
+ return 'mac_arm64'
# TODO: add support for arm macs.
raise RuntimeError(f'make_prefab: unsupported mac machine type:'
f' {machine}.')
@@ -727,15 +729,19 @@ def update_docs_md(check: bool) -> None:
print(f'{docs_path} is up to date.')
-def cmake_prep_dir(dirname: str) -> None:
+def cmake_prep_dir(dirname: str, verbose: bool = False) -> None:
"""Create a dir, recreating it when cmake/python/etc. version changes.
Useful to prevent builds from breaking when cmake or other components
are updated.
"""
+ # pylint: disable=too-many-locals
+ # pylint: disable=too-many-branches
+ # pylint: disable=too-many-statements
import json
from efrotools import PYVER
verfilename = os.path.join(dirname, '.ba_cmake_env')
+ title = 'cmake_prep_dir'
versions: Dict[str, str]
if os.path.isfile(verfilename):
@@ -752,14 +758,29 @@ def cmake_prep_dir(dirname: str) -> None:
cmake_ver = cmake_ver_output.splitlines()[0].split('cmake version ')[1]
cmake_ver_existing = versions.get('cmake_version')
assert isinstance(cmake_ver_existing, (str, type(None)))
+ if verbose:
+ print(f'{Clr.BLD}{title}:{Clr.RST} {cmake_ver=} {cmake_ver_existing=}')
+
+ # ...or if the actual location of cmake on disk changes.
+ cmake_path = os.path.realpath(
+ subprocess.run(['which', 'cmake'], check=True,
+ capture_output=True).stdout.decode().strip())
+ cmake_path_existing = versions.get('cmake_path')
+ assert isinstance(cmake_path_existing, (str, type(None)))
+ if verbose:
+ print(f'{Clr.BLD}{title}:{Clr.RST}'
+ f' {cmake_path=} {cmake_path_existing=}')
# ...or if python's version changes.
- python_ver_output = subprocess.run([f'python{PYVER}', '--version'],
- check=True,
- capture_output=True).stdout.decode()
+ python_ver_output = subprocess.run(
+ [f'python{PYVER}', '--version'], check=True,
+ capture_output=True).stdout.decode().strip()
python_ver = python_ver_output.splitlines()[0].split('Python ')[1]
python_ver_existing = versions.get('python_version')
assert isinstance(python_ver_existing, (str, type(None)))
+ if verbose:
+ print(f'{Clr.BLD}{title}:{Clr.RST}'
+ f' {python_ver=} {python_ver_existing=}')
# ...or if the actual location of python on disk changes.
python_path = os.path.realpath(
@@ -768,15 +789,31 @@ def cmake_prep_dir(dirname: str) -> None:
capture_output=True).stdout.decode())
python_path_existing = versions.get('python_path')
assert isinstance(python_path_existing, (str, type(None)))
+ if verbose:
+ print(f'{Clr.BLD}{title}:{Clr.RST}'
+ f' {python_path=} {python_path_existing=}')
# Blow away and start from scratch if any vals differ from existing.
- if (cmake_ver_existing != cmake_ver or python_ver_existing != python_ver
- or python_path != python_path_existing):
+ if (cmake_ver_existing == cmake_ver and cmake_path == cmake_path_existing
+ and python_ver_existing == python_ver
+ and python_path == python_path_existing):
+ if verbose:
+ print(f'{Clr.BLD}{title}:{Clr.RST} Keeping existing build dir.')
+ else:
+ if verbose:
+ print(
+ f'{Clr.BLD}{title}:{Clr.RST} Blowing away existing build dir.')
+
if (cmake_ver_existing is not None
and cmake_ver_existing != cmake_ver):
print(f'{Clr.BLU}CMake version changed from {cmake_ver_existing}'
f' to {cmake_ver}; clearing existing build at'
f' "{dirname}".{Clr.RST}')
+ if (cmake_path_existing is not None
+ and cmake_path_existing != cmake_path):
+ print(f'{Clr.BLU}CMake path changed from {cmake_path_existing}'
+ f' to {cmake_path}; clearing existing build at'
+ f' "{dirname}".{Clr.RST}')
if (python_ver_existing is not None
and python_ver_existing != python_ver):
print(f'{Clr.BLU}Python version changed from {python_ver_existing}'
@@ -793,6 +830,7 @@ def cmake_prep_dir(dirname: str) -> None:
outfile.write(
json.dumps({
'cmake_version': cmake_ver,
+ 'cmake_path': cmake_path,
'python_version': python_ver,
'python_path': python_path
}))
diff --git a/tools/batools/pcommand.py b/tools/batools/pcommand.py
index 825b6819..327db1e6 100644
--- a/tools/batools/pcommand.py
+++ b/tools/batools/pcommand.py
@@ -86,41 +86,6 @@ def clean_orphaned_assets() -> None:
efrotools.run('find assets/build -depth -empty -type d -delete')
-def fix_mac_ssh() -> None:
- """Turn off mac ssh password access.
-
- (This totally doesn't belong in this project btw..)
- """
- configpath = '/etc/ssh/sshd_config'
- with open(configpath) as infile:
- lines = infile.readlines()
- index = lines.index('#PasswordAuthentication yes\n')
- lines[index] = 'PasswordAuthentication no\n'
- index = lines.index('#ChallengeResponseAuthentication yes\n')
- lines[index] = 'ChallengeResponseAuthentication no\n'
- index = lines.index('UsePAM yes\n')
- lines[index] = 'UsePAM no\n'
- with open(configpath, 'w') as outfile:
- outfile.write(''.join(lines))
- print('SSH config updated successfully!')
-
-
-def check_mac_ssh() -> None:
- """Make sure ssh password access is turned off.
-
- (This totally doesn't belong here, but I use it it to remind myself to
- fix mac ssh after system updates which blow away ssh customizations).
- """
- with open('/etc/ssh/sshd_config') as infile:
- lines = infile.read().splitlines()
- if ('UsePAM yes' in lines or '#PasswordAuthentication yes' in lines
- or '#ChallengeResponseAuthentication yes' in lines):
- print('ERROR: ssh config is allowing password access.\n'
- 'To fix: sudo tools/pcommand fix_mac_ssh')
- sys.exit(255)
- print('password ssh auth seems disabled; hooray!')
-
-
def resize_image() -> None:
"""Resize an image and save it to a new location.
@@ -415,7 +380,12 @@ def python_winprune() -> None:
def capitalize() -> None:
"""Print args capitalized."""
- print(' '.join(w.capitalize() for w in sys.argv[2:]))
+ print(' '.join(w.capitalize() for w in sys.argv[2:]), end='')
+
+
+def upper() -> None:
+ """Print args uppercased."""
+ print(' '.join(w.upper() for w in sys.argv[2:]), end='')
def efrocache_update() -> None:
@@ -518,13 +488,7 @@ def ensure_prefab_platform() -> None:
def prefab_run_var() -> None:
- """Print a var for running a prefab run for the current platform.
-
- We use this mechanism instead of just having a command recursively run
- a make target so that ctrl-c can be handled cleanly and directly by the
- command getting run instead of generating extra errors in the recursive
- processes.
- """
+ """Print the current platform prefab run target var."""
import batools.build
if len(sys.argv) != 3:
raise RuntimeError('Expected 1 arg.')
@@ -731,12 +695,14 @@ def cmake_prep_dir() -> None:
Useful to prevent builds from breaking when cmake or other components
are updated.
"""
+ import os
from efro.error import CleanError
import batools.build
if len(sys.argv) != 3:
raise CleanError('Expected 1 arg (dir name)')
dirname = sys.argv[2]
- batools.build.cmake_prep_dir(dirname)
+ batools.build.cmake_prep_dir(dirname,
+ verbose=os.environ.get('VERBOSE') == '1')
def gen_binding_code() -> None:
diff --git a/tools/efrotools/pcommand.py b/tools/efrotools/pcommand.py
index 0e2f1241..061fcd56 100644
--- a/tools/efrotools/pcommand.py
+++ b/tools/efrotools/pcommand.py
@@ -61,9 +61,8 @@ def pcommand_main(globs: Dict[str, Any]) -> None:
exc.pretty_print()
sys.exit(1)
else:
- print(
- f'{Clr.RED}Unknown pcommand command: "{sys.argv[1]}"{Clr.RST}',
- file=sys.stderr)
+ print(f'{Clr.RED}Unknown pcommand: "{sys.argv[1]}"{Clr.RST}',
+ file=sys.stderr)
retval = 255
if show_help:
@@ -422,7 +421,7 @@ def sync_all() -> None:
import concurrent.futures
from efro.error import CleanError
from efro.terminal import Clr
- print(f'{Clr.BLU}Updating formatting for all projects...{Clr.RST}')
+ print(f'{Clr.BLD}Updating formatting for all projects...{Clr.RST}')
projects_str = os.environ.get('EFROTOOLS_SYNC_PROJECTS')
if projects_str is None:
raise CleanError('EFROTOOL_SYNC_PROJECTS is not defined.')
@@ -453,17 +452,17 @@ def sync_all() -> None:
# Real mode
for i in range(2):
if i == 0:
- print(Clr.BLU + 'Running sync pass 1:'
+ print(Clr.BLD + 'Running sync pass 1:'
' (ensures all changes at dsts are pushed to src)' +
Clr.RST)
else:
- print(Clr.BLU + 'Running sync pass 2:'
+ print(Clr.BLD + 'Running sync pass 2:'
' (ensures latest src is pulled to all dsts)' + Clr.RST)
for project in projects_str.split(':'):
cmd = f'cd "{project}" && make sync-full'
print(cmd)
subprocess.run(cmd, shell=True, check=True)
- print(Clr.BLU + 'Sync-all successful!' + Clr.RST)
+ print(Clr.BLD + 'Sync-all successful!' + Clr.RST)
def sync() -> None:
diff --git a/tools/efrotools/sync.py b/tools/efrotools/sync.py
index 142ce815..b295016d 100644
--- a/tools/efrotools/sync.py
+++ b/tools/efrotools/sync.py
@@ -36,7 +36,8 @@ def _valid_filename(fname: str) -> bool:
raise ValueError(f'{fname} is not a simple filename.')
if fname in [
'requirements.txt', 'pylintrc', 'clang-format', 'pycheckers',
- 'style.yapf', 'test_task_bin', '.editorconfig'
+ 'style.yapf', 'test_task_bin', '.editorconfig', 'cloudshell',
+ 'vmshell', 'editorconfig'
]:
return True
return (any(fname.endswith(ext) for ext in ('.py', '.pyi'))
@@ -255,13 +256,20 @@ def add_marker(src_proj: str, srcdata: str) -> str:
lines = srcdata.splitlines()
+ # Normally we add our hash as the first line in the file, but if there's
+ # a shebang, we put it under that.
+ firstline = 0
+ if len(lines) > 0 and lines[0].startswith('#!'):
+ firstline = 1
+
# Make sure we're not operating on an already-synced file; that's just
# asking for trouble.
- if len(lines) > 1 and 'EFRO_SYNC_HASH=' in lines[1]:
+ if (len(lines) > (firstline + 1)
+ and ('EFRO_SYNC_HASH=' in lines[firstline + 1])):
raise RuntimeError('Attempting to sync a file that is itself synced.')
hashstr = string_hash(srcdata)
- lines.insert(0,
+ lines.insert(firstline,
f'# Synced from {src_proj}.\n# EFRO_SYNC_HASH={hashstr}\n#')
return '\n'.join(lines) + '\n'
@@ -284,11 +292,24 @@ def get_dst_file_info(dstfile: Path) -> Tuple[str, str, str]:
dstlines = dstdata.splitlines()
if not dstlines:
raise ValueError(f'no lines found in {dstfile}')
- if 'EFRO_SYNC_HASH' not in dstlines[1]:
+ found = False
+ offs: Optional[int] = None
+ marker_hash: Optional[str] = None
+ for offs in range(2):
+ checkline = 1 + offs
+ if 'EFRO_SYNC_HASH' in dstlines[checkline]:
+ marker_hash = dstlines[checkline].split('EFRO_SYNC_HASH=')[1]
+ found = True
+ break
+ if not found:
raise ValueError(f'no EFRO_SYNC_HASH found in {dstfile}')
- marker_hash = dstlines[1].split('EFRO_SYNC_HASH=')[1]
+ assert offs is not None
+ assert marker_hash is not None
- # Return data minus the hash line.
- dstdata = '\n'.join(dstlines[3:]) + '\n'
+ # Return data minus the 3 hash lines:
+ dstlines.pop(offs)
+ dstlines.pop(offs)
+ dstlines.pop(offs)
+ dstdata = '\n'.join(dstlines) + '\n'
dst_hash = string_hash(dstdata)
return marker_hash, dst_hash, dstdata
diff --git a/tools/pcommand b/tools/pcommand
index 779df934..5df5a8dc 100755
--- a/tools/pcommand
+++ b/tools/pcommand
@@ -25,20 +25,20 @@ from efrotools.pcommand import (
makefile_target_list, spelling, spelling_all, pytest, echo,
compile_python_files, pyver)
from batools.pcommand import (
- stage_server_file, py_examine, fix_mac_ssh, check_mac_ssh, resize_image,
- check_clean_safety, clean_orphaned_assets, archive_old_builds,
- lazy_increment_build, get_master_asset_src_dir, androidaddr, push_ipa,
- printcolors, gen_fulltest_buildfile_android,
- gen_fulltest_buildfile_windows, gen_fulltest_buildfile_apple,
- gen_fulltest_buildfile_linux, python_build_apple, python_build_apple_debug,
- python_build_android, python_build_android_debug, python_android_patch,
- python_gather, python_winprune, capitalize, efrocache_update,
- efrocache_get, get_modern_make, warm_start_asset_build, update_docs_md,
- list_pip_reqs, install_pip_reqs, checkenv, ensure_prefab_platform,
- prefab_run_var, make_prefab, update_makebob, lazybuild,
- android_archive_unstripped_libs, efro_gradle, stage_assets,
- update_assets_makefile, update_project, update_cmake_prefab_lib,
- cmake_prep_dir, gen_binding_code, gen_flat_data_code)
+ stage_server_file, py_examine, resize_image, check_clean_safety,
+ clean_orphaned_assets, archive_old_builds, lazy_increment_build,
+ get_master_asset_src_dir, androidaddr, push_ipa, printcolors,
+ gen_fulltest_buildfile_android, gen_fulltest_buildfile_windows,
+ gen_fulltest_buildfile_apple, gen_fulltest_buildfile_linux,
+ python_build_apple, python_build_apple_debug, python_build_android,
+ python_build_android_debug, python_android_patch, python_gather,
+ python_winprune, capitalize, upper, efrocache_update, efrocache_get,
+ get_modern_make, warm_start_asset_build, update_docs_md, list_pip_reqs,
+ install_pip_reqs, checkenv, ensure_prefab_platform, prefab_run_var,
+ make_prefab, update_makebob, lazybuild, android_archive_unstripped_libs,
+ efro_gradle, stage_assets, update_assets_makefile, update_project,
+ update_cmake_prefab_lib, cmake_prep_dir, gen_binding_code,
+ gen_flat_data_code)
# pylint: enable=unused-import
if TYPE_CHECKING: