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: