1
0

feat: add several QOL features v1.1
All checks were successful
Deploy Tools / build-package (push) Successful in 27s

This commit is contained in:
Jonathan Hoffstadt 2025-04-11 21:59:04 -05:00
parent 0fff761253
commit 72bad7de00
6 changed files with 93 additions and 37 deletions

View File

@ -37,9 +37,10 @@ Documentation can be found [here](https://github.com/PilotLightTech/pilotlight/w
### Real World
Complete & more advanced examples can be found here:
* [gen_core.py](https://github.com/PilotLightTech/pilotlight/blob/master/scripts/gen_core.py)
* [gen_dev.py](https://github.com/PilotLightTech/pilotlight/blob/master/scripts/gen_dev.py)
* [gen_examples.py](https://github.com/PilotLightTech/pilotlight/blob/master/scripts/gen_examples.py)
* [gen_tests.py](https://github.com/PilotLightTech/pilotlight/blob/master/scripts/gen_tests.py)
* [gen_distribute.py](https://github.com/PilotLightTech/pilotlight/blob/master/scripts/gen_distribute.py)
### Basic Example

View File

@ -153,7 +153,7 @@ def generate_build(name, user_options = None):
continue
# find hot reload target
if data.reload_target_name is not None:
if len(data.reload_target_names) > 0:
hot_reload = True
helper.add_title("configuration | " + register_config)
@ -186,7 +186,12 @@ def generate_build(name, user_options = None):
helper.add_spacing()
helper.add_comment("# let user know if hot reloading")
helper.add_line('if pidof -x "' + PurePath(data.reload_target_name).stem + '" -o $$ >/dev/null;then')
for reload_target in data.reload_target_names:
if reload_target == data.reload_target_names[0]:
helper.add_line('if pidof -x "' + PurePath(reload_target).stem + '" -o $$ >/dev/null;then')
else:
helper.add_line('elif pidof -x "' + PurePath(reload_target).stem + '" -o $$ >/dev/null;then')
helper.set_indent(4)
helper.add_line('PL_HOT_RELOAD_STATUS=1')
helper.print_space()
@ -200,7 +205,7 @@ def generate_build(name, user_options = None):
# delete old binaries & files
for settings in config_only_settings:
if settings.source_files:
if settings.source_files and settings.always_build:
if settings.name == compiler:
if settings.target_type == pl.TargetType.DYNAMIC_LIBRARY:
helper.delete_file(settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension)
@ -226,6 +231,12 @@ def generate_build(name, user_options = None):
helper.add_line('if [ $PL_HOT_RELOAD_STATUS -ne 1 ]; then')
helper.add_spacing()
if not settings.always_build:
helper.add_comment('only build once')
file_name = settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension
helper.add_line('if [ ! -f "' + file_name + '" ]; then')
helper.add_spacing()
if settings.pre_build_step is not None:
helper.add_line(settings.pre_build_step)
helper.add_spacing()
@ -296,7 +307,7 @@ def generate_build(name, user_options = None):
helper.print_line('${YELLOW}Step: ' + settings.target_name +'${NC}')
helper.print_line('${YELLOW}~~~~~~~~~~~~~~~~~~~${NC}')
helper.print_line('${CYAN}Compiling and Linking...${NC}')
helper.add_line('gcc -shared $PL_SOURCES $PL_INCLUDE_DIRECTORIES $PL_DEFINES $PL_COMPILER_FLAGS $PL_INCLUDE_DIRECTORIES $PL_LINK_DIRECTORIES $PL_LINKER_FLAGS $PL_STATIC_LINK_LIBRARIES $PL_DYNAMIC_LINK_LIBRARIES -o "./' + settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension +'"')
helper.add_line('gcc -shared $PL_SOURCES $PL_INCLUDE_DIRECTORIES $PL_DEFINES $PL_COMPILER_FLAGS $PL_INCLUDE_DIRECTORIES $PL_LINK_DIRECTORIES $PL_STATIC_LINK_LIBRARIES $PL_DYNAMIC_LINK_LIBRARIES $PL_LINKER_FLAGS -o "./' + settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension +'"')
helper.add_spacing()
elif settings.target_type == pl.TargetType.EXECUTABLE:
@ -311,7 +322,7 @@ def generate_build(name, user_options = None):
helper.print_line('${YELLOW}Step: ' + settings.target_name +'${NC}')
helper.print_line('${YELLOW}~~~~~~~~~~~~~~~~~~~${NC}')
helper.print_line('${CYAN}Compiling and Linking...${NC}')
helper.add_line('gcc $PL_SOURCES $PL_INCLUDE_DIRECTORIES $PL_DEFINES $PL_COMPILER_FLAGS $PL_INCLUDE_DIRECTORIES $PL_LINK_DIRECTORIES $PL_LINKER_FLAGS $PL_STATIC_LINK_LIBRARIES $PL_DYNAMIC_LINK_LIBRARIES -o "./' + settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension +'"')
helper.add_line('gcc $PL_SOURCES $PL_INCLUDE_DIRECTORIES $PL_DEFINES $PL_COMPILER_FLAGS $PL_INCLUDE_DIRECTORIES $PL_LINK_DIRECTORIES $PL_STATIC_LINK_LIBRARIES $PL_DYNAMIC_LINK_LIBRARIES $PL_LINKER_FLAGS -o "./' + settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension +'"')
helper.add_spacing()
# check build status
@ -332,6 +343,10 @@ def generate_build(name, user_options = None):
helper.add_line(settings.post_build_step)
helper.add_spacing()
if not settings.always_build:
helper.add_comment('only build once check')
helper.add_line('fi')
if not settings.reloadable and hot_reload:
helper.add_comment("hot reload skip")
helper.add_line("fi")

View File

@ -155,7 +155,7 @@ def generate_build(name, user_options = None):
continue
# check if hot reload
if data.reload_target_name is not None:
if len(data.reload_target_names) > 0:
hot_reload = True
helper.add_title("configuration | " + register_config)
@ -188,8 +188,13 @@ def generate_build(name, user_options = None):
helper.add_spacing()
helper.add_comment("# let user know if hot reloading")
helper.add_line('running_count=$(ps aux | grep -v grep | grep -ci "' + PurePath(data.reload_target_name).stem + '")')
for reload_target in data.reload_target_names:
helper.add_comment("# let user know if hot reloading")
helper.add_line('running_count=$(ps aux | grep -v grep | grep -ci "' + PurePath(reload_target).stem + '")')
if reload_target == data.reload_target_names[0]:
helper.add_line('if [ $running_count -gt 0 ]')
else:
helper.add_line('elif [ $running_count -gt 0 ]')
helper.add_line('then')
helper.set_indent(4)
helper.add_line('PL_HOT_RELOAD_STATUS=1')
@ -200,11 +205,11 @@ def generate_build(name, user_options = None):
helper.add_line('else')
helper.set_indent(4)
helper.add_comment('cleanup binaries if not hot reloading')
helper.add_line('PL_HOT_RELOAD_STATUS=0')
helper.add_line('PL_HOT_RELOAD_STATUS=$PL_HOT_RELOAD_STATUS')
# delete old binaries & files
for settings in config_only_settings:
if settings.source_files:
if settings.source_files and settings.always_build:
if settings.name == compiler:
if settings.target_type == pl.TargetType.DYNAMIC_LIBRARY:
helper.delete_file(settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension)
@ -229,6 +234,12 @@ def generate_build(name, user_options = None):
helper.add_line('if [ $PL_HOT_RELOAD_STATUS -ne 1 ]; then')
helper.add_spacing()
if not settings.always_build:
helper.add_comment('only build once')
file_name = settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension
helper.add_line('if [ ! -f "' + file_name + '" ]; then')
helper.add_spacing()
if settings.pre_build_step is not None:
helper.add_line(settings.pre_build_step)
helper.add_spacing()
@ -312,7 +323,7 @@ def generate_build(name, user_options = None):
helper.print_line('${YELLOW}Step: ' + settings.target_name +'${NC}')
helper.print_line('${YELLOW}~~~~~~~~~~~~~~~~~~~${NC}')
helper.print_line('${CYAN}Compiling and Linking...${NC}')
helper.add_line('clang -shared $PL_SOURCES $PL_INCLUDE_DIRECTORIES $PL_DEFINES $PL_COMPILER_FLAGS $PL_INCLUDE_DIRECTORIES $PL_LINK_DIRECTORIES $PL_LINKER_FLAGS $PL_STATIC_LINK_LIBRARIES $PL_DYNAMIC_LINK_LIBRARIES $PL_LINK_FRAMEWORKS -o "./' + settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension +'"')
helper.add_line('clang -shared $PL_SOURCES $PL_INCLUDE_DIRECTORIES $PL_DEFINES $PL_COMPILER_FLAGS $PL_INCLUDE_DIRECTORIES $PL_LINK_DIRECTORIES $PL_STATIC_LINK_LIBRARIES $PL_DYNAMIC_LINK_LIBRARIES $PL_LINK_FRAMEWORKS $PL_LINKER_FLAGS -o "./' + settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension +'"')
helper.add_spacing()
elif settings.target_type == pl.TargetType.EXECUTABLE:
@ -321,7 +332,7 @@ def generate_build(name, user_options = None):
helper.print_line('${YELLOW}Step: ' + settings.target_name +'${NC}')
helper.print_line('${YELLOW}~~~~~~~~~~~~~~~~~~~${NC}')
helper.print_line('${CYAN}Compiling and Linking...${NC}')
helper.add_line('clang $PL_SOURCES $PL_INCLUDE_DIRECTORIES $PL_DEFINES $PL_COMPILER_FLAGS $PL_INCLUDE_DIRECTORIES $PL_LINK_DIRECTORIES $PL_LINKER_FLAGS $PL_STATIC_LINK_LIBRARIES $PL_DYNAMIC_LINK_LIBRARIES -o "./' + settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension +'"')
helper.add_line('clang $PL_SOURCES $PL_INCLUDE_DIRECTORIES $PL_DEFINES $PL_COMPILER_FLAGS $PL_INCLUDE_DIRECTORIES $PL_LINK_DIRECTORIES $PL_STATIC_LINK_LIBRARIES $PL_DYNAMIC_LINK_LIBRARIES $PL_LINKER_FLAGS -o "./' + settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension +'"')
helper.add_spacing()
# check build status
@ -342,6 +353,10 @@ def generate_build(name, user_options = None):
helper.add_line(settings.post_build_step)
helper.add_spacing()
if not settings.always_build:
helper.add_comment('only build once check')
helper.add_line('fi')
if not settings.reloadable and hot_reload:
helper.add_comment("hot reload skip")
helper.add_line("fi")

View File

@ -147,8 +147,6 @@ def generate_build(name, user_options = None):
# helper.add_line(_context.pre_build_step)
# helper.add_spacing()
for register_config in data.registered_configurations:
# filter this config only settings
@ -161,7 +159,7 @@ def generate_build(name, user_options = None):
continue
# find hot reload target
if data.reload_target_name is not None:
if len(data.reload_target_names) > 0:
hot_reload = True
helper.add_title("configuration | " + register_config)
@ -193,9 +191,10 @@ def generate_build(name, user_options = None):
helper.add_line("@set PL_HOT_RELOAD_STATUS=0")
helper.add_spacing()
helper.add_comment("hack to see if " + data.reload_target_name + " exe is running")
helper.add_comment("hack to see if hot reload target exes are running")
helper.add_line("@echo off")
helper.add_line('2>nul (>>"' + data.reload_target_name + '.exe" echo off) && (@set PL_HOT_RELOAD_STATUS=0) || (@set PL_HOT_RELOAD_STATUS=1)')
for reload_target in data.reload_target_names:
helper.add_line('2>nul (>>"' + reload_target + '.exe" echo off) && (@set PL_HOT_RELOAD_STATUS=%PL_HOT_RELOAD_STATUS%) || (@set PL_HOT_RELOAD_STATUS=1)')
helper.add_spacing()
helper.add_comment("let user know if hot reloading")
@ -212,7 +211,7 @@ def generate_build(name, user_options = None):
# delete old binaries & files
for settings in config_only_settings:
if settings.source_files:
if settings.source_files and settings.always_build:
helper.delete_file(settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension)
if settings.target_type == pl.TargetType.DYNAMIC_LIBRARY:
helper.delete_file(settings.output_directory + '/' + settings.output_binary + '_*' + settings.output_binary_extension)
@ -236,6 +235,12 @@ def generate_build(name, user_options = None):
helper.add_line('@if %PL_HOT_RELOAD_STATUS% equ 1 goto ' + "Exit_" + settings.target_name)
helper.add_spacing()
if not settings.always_build:
p = pathlib.PureWindowsPath(settings.output_directory + '/' + settings.output_binary + settings.output_binary_extension)
helper.add_comment("only build once")
helper.add_line('@if exist "' + str(p) + '" goto Exit_' + settings.target_name)
helper.add_spacing()
if settings.pre_build_step is not None:
helper.add_line(settings.pre_build_step)
helper.add_spacing()
@ -427,6 +432,9 @@ def generate_build(name, user_options = None):
helper.add_label("Exit_" + settings.target_name)
helper.add_spacing()
helper.add_line('@del "' + str(pathlib.PureWindowsPath(settings.output_directory + '/*.obj')) + '" > nul 2> nul')
helper.add_spacing()
helper.add_line(':Cleanup' + register_config)
helper.add_spacing()
helper.print_line('Cleaning...')

View File

@ -14,7 +14,7 @@
# [SECTION] version
#-----------------------------------------------------------------------------
__version__ = "1.0.12"
__version__ = "1.1.0"
#-----------------------------------------------------------------------------
# [SECTION] imports
@ -69,6 +69,7 @@ class CompilerSettings:
self.target_type = None
self.lock_file = None
self.reloadable = None
self.always_build = None
class ScriptData:
@ -76,7 +77,7 @@ class ScriptData:
self.version = __version__
self.current_settings = []
self.project_name = None
self.reload_target_name = None
self.reload_target_names = []
self.registered_configurations = []
class BuildContext:
@ -87,12 +88,14 @@ class BuildContext:
# current profiles
self._profiles = []
self._stashed_profiles = []
# current target information
self._target_name = None
self._target_type = None
self._target_lock_file = None
self._target_reloadable = False
self._target_always_build = True
# current platform
self._platform_name = None
@ -274,18 +277,20 @@ def project(name: str):
pass
@contextmanager
def target(name: str, target_type: TargetType = TargetType.EXECUTABLE, reloadable: bool = False):
def target(name: str, target_type: TargetType = TargetType.EXECUTABLE, reloadable: bool = False, always_build: bool = True):
try:
_context._target_name = name
_context._target_type = target_type
_context._target_lock_file = "lock.tmp"
_context._target_reloadable = reloadable
_context._target_always_build = always_build
yield None
finally:
_context._target_name = None
_context._target_type = None
_context._target_lock_file = None
_context._target_reloadable = False
_context._target_always_build = True
_context._target_output_directory = None
_context._target_output_binary = None
_context._target_definitions = []
@ -359,6 +364,7 @@ def compiler(name: str):
compiler.target_type = _context._target_type
compiler.lock_file = _context._target_lock_file
compiler.reloadable = _context._target_reloadable
compiler.always_build = _context._target_always_build
# inherited from various scopes
if _context._platform_output_directory is not None:
@ -415,8 +421,19 @@ def compiler(name: str):
# [SECTION] public api
#-----------------------------------------------------------------------------
def stash_profiles():
_context._stashed_profiles = _context._profiles
_context._profiles = []
def apply_profiles():
_context._profiles = _context._stashed_profiles
_context._stashed_profiles = []
def set_hot_reload_target(target_name: str):
_context._script_data.reload_target_name = target_name
_context._script_data.reload_target_names = [target_name]
def add_hot_reload_target(target_name: str):
_context._script_data.reload_target_names.append(target_name)
def add_source_files(*args):

View File

@ -2,7 +2,7 @@ import setuptools
from codecs import open
import os
wip_version = "1.0.12"
wip_version = "1.1.0"
def readme():
try: