From 4ebc7ca73ea0cceb7d5651ac6a2844ec940795e0 Mon Sep 17 00:00:00 2001 From: Eric Froemling Date: Sat, 26 Oct 2019 00:21:45 -0700 Subject: [PATCH] adding basic environment checks during builds --- .idea/dictionaries/ericf.xml | 1 + Makefile | 45 +++++++++++++++++++++--------------- tools/efrotools/snippets.py | 12 +++++++++- tools/snippets | 16 +++++++++---- 4 files changed, 51 insertions(+), 23 deletions(-) diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml index 6e2a4940..5e46b2e7 100644 --- a/.idea/dictionaries/ericf.xml +++ b/.idea/dictionaries/ericf.xml @@ -223,6 +223,7 @@ charstr checkarg checkboxwidget + checkenv checkfast checkfull checkins diff --git a/Makefile b/Makefile index 7aaac726..039aeb9f 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,7 @@ help: list # things like tool config files, etc. PREREQS = .dir-locals.el .mypy.ini .pycheckers \ .pylintrc .style.yapf .clang-format \ - .projectile .editorconfig + .projectile .editorconfig .cache/checkenv prereqs: ${PREREQS} @@ -51,36 +51,36 @@ prereqs-clean: @rm -rf ${PREREQS} .irony # Build all assets for all platforms. -assets: +assets: prereqs @cd assets && make -j${CPUS} # Build only assets required for cmake builds (linux, mac) -assets-cmake: +assets-cmake: prereqs @cd assets && $(MAKE) -j${CPUS} cmake # Build only assets required for windows builds. # (honoring the WINDOWS_PLATFORM value) -assets-windows: +assets-windows: prereqs @cd assets && $(MAKE) -j${CPUS} win-${WINDOWS_PLATFORM} # Build only assets required for Win32 windows builds. -assets-windows-Win32: +assets-windows-Win32: prereqs @cd assets && $(MAKE) -j${CPUS} win-Win32 # Build only assets required for x64 windows builds. -assets-windows-x64: +assets-windows-x64: prereqs @cd assets && $(MAKE) -j${CPUS} win-x64 # Build only assets required for mac xcode builds -assets-mac: +assets-mac: prereqs @cd assets && $(MAKE) -j${CPUS} mac # Build only assets required for ios. -assets-ios: +assets-ios: prereqs @cd assets && $(MAKE) -j${CPUS} ios # Build only assets required for android. -assets-android: +assets-android: prereqs @cd assets && $(MAKE) -j${CPUS} android # Clean all assets. @@ -88,7 +88,7 @@ assets-clean: @cd assets && $(MAKE) clean # Build resources. -resources: resources/Makefile +resources: prereqs resources/Makefile @cd resources && $(MAKE) -j${CPUS} resources # Clean resources. @@ -96,7 +96,7 @@ resources-clean: @cd resources && $(MAKE) clean # Build our generated code. -code: +code: prereqs @cd src/generated_src && $(MAKE) -j${CPUS} generated_code # Clean generated code. @@ -151,7 +151,8 @@ prefab-release-build: prefab-mac-debug: prefab-mac-debug-build @cd build/prefab/mac/debug && ./ballisticacore -prefab-mac-debug-build: assets-cmake build/prefab/mac/debug/ballisticacore +prefab-mac-debug-build: prereqs assets-cmake \ + build/prefab/mac/debug/ballisticacore @${STAGE_ASSETS} -cmake build/prefab/mac/debug build/prefab/mac/debug/ballisticacore: .efrocachemap @@ -160,16 +161,18 @@ build/prefab/mac/debug/ballisticacore: .efrocachemap prefab-mac-release: prefab-mac-release-build @cd build/prefab/mac/release && ./ballisticacore -prefab-mac-release-build: assets-cmake build/prefab/mac/release/ballisticacore +prefab-mac-release-build: prereqs assets-cmake \ + build/prefab/mac/release/ballisticacore @${STAGE_ASSETS} -cmake build/prefab/mac/release build/prefab/mac/release/ballisticacore: .efrocachemap @tools/snippets efrocache_get $@ -prefab-linux-debug: prefab-linux-build +prefab-linux-debug: prefab-linux-debug-build @cd build/prefab/linux/debug && ./ballisticacore -prefab-linux-debug-build: assets-cmake build/prefab/linux/debug/ballisticacore +prefab-linux-debug-build: prereqs assets-cmake \ + build/prefab/linux/debug/ballisticacore @${STAGE_ASSETS} -cmake build/prefab/linux/debug build/prefab/linux/debug/ballisticacore: .efrocachemap @@ -178,7 +181,7 @@ build/prefab/linux/debug/ballisticacore: .efrocachemap prefab-linux-release: prefab-linux-release-build @cd build/prefab/linux/release && ./ballisticacore -prefab-linux-release-build: assets-cmake \ +prefab-linux-release-build: prereqs assets-cmake \ build/prefab/linux/release/ballisticacore @${STAGE_ASSETS} -cmake build/prefab/linux/release @@ -190,7 +193,7 @@ PREFAB_WINDOWS_PLATFORM = x64 prefab-windows-debug: prefab-windows-debug-build build/prefab/windows/debug/BallisticaCore.exe -prefab-windows-debug-build: assets-windows-${PREFAB_WINDOWS_PLATFORM} \ +prefab-windows-debug-build: prereqs assets-windows-${PREFAB_WINDOWS_PLATFORM} \ build/prefab/windows/debug/BallisticaCore.exe @${STAGE_ASSETS} -win-$(PREFAB_WINDOWS_PLATFORM) build/prefab/windows/debug @@ -200,7 +203,8 @@ build/prefab/windows/debug/BallisticaCore.exe: .efrocachemap prefab-windows-release: prefab-windows-release-build build/prefab/windows/release/BallisticaCore.exe -prefab-windows-release-build: assets-windows-${PREFAB_WINDOWS_PLATFORM} \ +prefab-windows-release-build: prereqs \ + assets-windows-${PREFAB_WINDOWS_PLATFORM} \ build/prefab/windows/release/BallisticaCore.exe @${STAGE_ASSETS} -win-$(PREFAB_WINDOWS_PLATFORM) build/prefab/windows/release @@ -444,5 +448,10 @@ TOOL_CFG_SRC = tools/efrotools/snippets.py config/config.json .pycheckers: config/toolconfigsrc/pycheckers ${TOOL_CFG_SRC} ${TOOL_CFG_INST} $< $@ +.cache/checkenv: + @tools/snippets checkenv + @mkdir -p .cache + @touch .cache/checkenv + # Tell make which of these targets don't represent files. .PHONY: diff --git a/tools/efrotools/snippets.py b/tools/efrotools/snippets.py index 68b307cd..388a2232 100644 --- a/tools/efrotools/snippets.py +++ b/tools/efrotools/snippets.py @@ -36,10 +36,16 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: from typing import Dict, Any, List + +class CleanError(Exception): + """Exception resulting in a clean error string print and exit.""" + + # Absolute path of the project root. PROJROOT = Path(__file__).resolve().parents[2] CLRHDR = '\033[95m' +CLRRED = '\033[91m' CLRBLU = '\033[94m' CLREND = '\033[0m' @@ -72,7 +78,11 @@ def snippets_main(globs: Dict[str, Any]) -> None: getattr(funcs[sys.argv[2]], '__doc__', '')) print('\nsnippets ' + sys.argv[2] + ':\n' + docs + '\n') elif sys.argv[1] in funcs: - funcs[sys.argv[1]]() + try: + funcs[sys.argv[1]]() + except CleanError as exc: + print(CLRRED + str(exc) + CLREND) + sys.exit(-1) else: print('Unknown snippets command: "' + sys.argv[1] + '"', file=sys.stderr) diff --git a/tools/snippets b/tools/snippets index 31b591d5..633dde22 100755 --- a/tools/snippets +++ b/tools/snippets @@ -42,10 +42,11 @@ import efrotools # Pull in some standard snippets we want to expose. # noinspection PyUnresolvedReferences from efrotools.snippets import ( # pylint: disable=unused-import - PROJROOT, snippets_main, formatcode, formatscripts, formatmakefile, - cpplintcode, pylintscripts, mypyscripts, tool_config_install, sync, - sync_all, scriptfiles, pycharmscripts, clioncode, androidstudiocode, - makefile_target_list, spelling, spelling_all, compile_python_files) + PROJROOT, CleanError, snippets_main, formatcode, formatscripts, + formatmakefile, cpplintcode, pylintscripts, mypyscripts, + tool_config_install, sync, sync_all, scriptfiles, pycharmscripts, + clioncode, androidstudiocode, makefile_target_list, spelling, spelling_all, + compile_python_files) if TYPE_CHECKING: from typing import Optional, List @@ -639,6 +640,13 @@ def warm_start_asset_build() -> None: check=True) +def checkenv() -> None: + """Check for tools necessary to build and run the app.""" + if subprocess.run(['which', 'python3.7'], check=False, + capture_output=True).returncode != 0: + raise CleanError('python3.7 is required for these builds.') + + def make_prefab() -> None: """Run prefab builds for the current platform.""" from efrotools import run