diff --git a/README.md b/README.md index c5ba65d..751af81 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/pl_build/backend_linux.py b/pl_build/backend_linux.py index 86db170..c12441e 100644 --- a/pl_build/backend_linux.py +++ b/pl_build/backend_linux.py @@ -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,13 +186,18 @@ 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') - helper.set_indent(4) - helper.add_line('PL_HOT_RELOAD_STATUS=1') - helper.print_space() - helper.print_line('${BOLD}${WHITE}${RED_BG}--------${GREEN_BG} HOT RELOADING ${RED_BG}--------${NC}') - helper.print_space() - helper.set_indent(0) + 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() + helper.print_line('${BOLD}${WHITE}${RED_BG}--------${GREEN_BG} HOT RELOADING ${RED_BG}--------${NC}') + helper.print_space() + helper.set_indent(0) helper.add_line('else') helper.set_indent(4) helper.add_comment('cleanup binaries if not hot reloading') @@ -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") diff --git a/pl_build/backend_macos.py b/pl_build/backend_macos.py index 3227566..e8ebe41 100644 --- a/pl_build/backend_macos.py +++ b/pl_build/backend_macos.py @@ -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,23 +188,28 @@ 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 + '")') - helper.add_line('if [ $running_count -gt 0 ]') - helper.add_line('then') - helper.set_indent(4) - helper.add_line('PL_HOT_RELOAD_STATUS=1') - helper.print_space() - helper.print_line('${BOLD}${WHITE}${RED_BG}--------${GREEN_BG} HOT RELOADING ${RED_BG}--------${NC}') - helper.print_space() - helper.set_indent(0) + 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') + helper.print_space() + helper.print_line('${BOLD}${WHITE}${RED_BG}--------${GREEN_BG} HOT RELOADING ${RED_BG}--------${NC}') + helper.print_space() + helper.set_indent(0) 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") diff --git a/pl_build/backend_win32.py b/pl_build/backend_win32.py index fdf6ca9..bdf41e0 100644 --- a/pl_build/backend_win32.py +++ b/pl_build/backend_win32.py @@ -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...') diff --git a/pl_build/core.py b/pl_build/core.py index e5a8134..7c29874 100644 --- a/pl_build/core.py +++ b/pl_build/core.py @@ -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): diff --git a/setup.py b/setup.py index f7f0114..af1232b 100644 --- a/setup.py +++ b/setup.py @@ -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: