From 95135c8c56bcb516b6dd4226c813370a50a4382a Mon Sep 17 00:00:00 2001 From: "Salvador E. Tropea" Date: Tue, 30 Nov 2021 19:12:14 -0300 Subject: [PATCH] New expansion patterns and out_dir from global section. - Also added expansion in out_dir - Related to #116 --- CHANGELOG.md | 7 +++ README.md | 7 +++ docs/README.in | 7 +++ kibot/__main__.py | 1 + kibot/globals.py | 5 ++ kibot/gs.py | 11 ++++ kibot/kiplot.py | 14 +++-- kibot/optionable.py | 108 +++++++++++++++++++++++-------------- kibot/out_base.py | 9 +--- kibot/out_compress.py | 9 ++-- kibot/out_kibom.py | 2 +- kibot/out_pdf_pcb_print.py | 2 +- kibot/out_render_3d.py | 2 +- kibot/pre_base.py | 6 +++ kibot/pre_drc.py | 6 +-- kibot/pre_erc.py | 6 +-- kibot/pre_filters.py | 2 +- kibot/pre_update_xml.py | 5 +- 18 files changed, 141 insertions(+), 68 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bd2645e..ec41ac58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,9 +25,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Generic filter: options to match if a field is/isn't defined. - Excellon drill: added `route_mode_for_oval_holes` option. - Default global `dir` option. +- Global option to specify `out_dir` (like -d command line option) - Pattern to expand the variant name: %V - 3D view render - SCH PDF Print: monochrome and no frame options. +- New expansion patterns: + - **%g** the `file_id` of the global variant. + - **%G** the `name` of the global variant. + - **%bc**, **%bd**, **%bf**, **%bF**, **%bp** and **%br** board data + - **%sc**, **%sd**, **%sf**, **%sF**, **%sp** and **%sr** schematic data +- Now patterns are also expanded in the out_dir name. ### Changed - Internal BoM: now components with different Tolerance, Voltage, Current diff --git a/README.md b/README.md index eec13d69..8e95c03b 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,8 @@ The pattern uses the following expansions: - **%D** date the script was started. - **%f** original pcb/sch file name without extension. - **%F** original pcb/sch file name without extension. Including the directory part of the name. +- **%g** the `file_id` of the global variant. +- **%G** the `name` of the global variant. - **%i** a contextual ID, depends on the output type. - **%p** pcb/sch title from pcb metadata. - **%r** revision from pcb/sch metadata. @@ -221,6 +223,11 @@ global: output: '%f_rev_%r-%i.%x' ``` +Note that the following patterns: **%c**, **%d**, **%f**, **%F**, **%p** and **%r** depends on the context. +If you use them for an output related to the PCB these values will be obtained from the PCB. +If you need to force the origin of the data you can use **%bX** for the PCB and **%sX** for the schematic, where +**X** is the pattern to expand. + #### Default *dir* option The default `dir` value for any output is `.`. You can change it here. diff --git a/docs/README.in b/docs/README.in index 9bf26eca..1ce83cb6 100644 --- a/docs/README.in +++ b/docs/README.in @@ -183,6 +183,8 @@ The pattern uses the following expansions: - **%D** date the script was started. - **%f** original pcb/sch file name without extension. - **%F** original pcb/sch file name without extension. Including the directory part of the name. +- **%g** the `file_id` of the global variant. +- **%G** the `name` of the global variant. - **%i** a contextual ID, depends on the output type. - **%p** pcb/sch title from pcb metadata. - **%r** revision from pcb/sch metadata. @@ -200,6 +202,11 @@ global: output: '%f_rev_%r-%i.%x' ``` +Note that the following patterns: **%c**, **%d**, **%f**, **%F**, **%p** and **%r** depends on the context. +If you use them for an output related to the PCB these values will be obtained from the PCB. +If you need to force the origin of the data you can use **%bX** for the PCB and **%sX** for the schematic, where +**X** is the pattern to expand. + #### Default *dir* option The default `dir` value for any output is `.`. You can change it here. diff --git a/kibot/__main__.py b/kibot/__main__.py index 9ba874dc..3cb3052c 100644 --- a/kibot/__main__.py +++ b/kibot/__main__.py @@ -285,6 +285,7 @@ def detect_kicad(): def main(): set_locale() ver = 'KiBot '+__version__+' - '+__copyright__+' - License: '+__license__ + GS.out_dir_in_cmd_line = '-d' in sys.argv or '--out-dir' in sys.argv args = docopt(__doc__, version=ver, options_first=True) # Set the specified verbosity diff --git a/kibot/globals.py b/kibot/globals.py index 794dba71..2b669e4d 100644 --- a/kibot/globals.py +++ b/kibot/globals.py @@ -3,6 +3,7 @@ # Copyright (c) 2020-2021 Instituto Nacional de TecnologĂ­a Industrial # License: GPL-3.0 # Project: KiBot (formerly KiPlot) +import os from .gs import GS from .macros import macros, document # noqa: F401 from .pre_filters import FiltersOptions @@ -19,6 +20,8 @@ class Globals(FiltersOptions): """ Default pattern for output file names """ self.dir = '' """ Default pattern for the output directories """ + self.out_dir = '' + """ Base output dir, same as command line `--out-dir` """ self.variant = '' """ Default variant to apply to all outputs """ self.kiauto_wait_start = 0 @@ -50,6 +53,8 @@ class Globals(FiltersOptions): logger.warning(W_MUSTBEINT+'kiauto_wait_start must be integer, truncating to '+str(GS.global_kiauto_wait_start)) GS.global_kiauto_time_out_scale = self.set_global(GS.global_kiauto_time_out_scale, self.kiauto_time_out_scale, 'kiauto_time_out_scale') + if not GS.out_dir_in_cmd_line and self.out_dir: + GS.out_dir = os.path.join(os.getcwd(), self.out_dir) set_filters(self.unparsed) diff --git a/kibot/gs.py b/kibot/gs.py index c7e6aa8f..1ee2cfd9 100644 --- a/kibot/gs.py +++ b/kibot/gs.py @@ -29,6 +29,7 @@ class GS(object): sch_basename = None # file # Main output dir out_dir = None + out_dir_in_cmd_line = False filter_file = None board = None sch = None @@ -142,3 +143,13 @@ class GS(object): if not GS.sch_file: logger.error('No SCH file found (*.sch), use -e to specify one.') exit(EXIT_BAD_ARGS) + + @staticmethod + def load_board(): + """ Will be repplaced by kiplot.py """ + assert False + + @staticmethod + def load_sch(): + """ Will be repplaced by kiplot.py """ + assert False diff --git a/kibot/kiplot.py b/kibot/kiplot.py index c7cab681..980e8722 100644 --- a/kibot/kiplot.py +++ b/kibot/kiplot.py @@ -312,9 +312,9 @@ def preflight_checks(skip_pre): BasePreFlight.run_enabled() -def get_output_dir(o_dir, dry=False): +def get_output_dir(o_dir, obj, dry=False): # outdir is a combination of the config and output - outdir = os.path.abspath(os.path.join(GS.out_dir, o_dir)) + outdir = os.path.abspath(obj.expand_dirname(os.path.join(GS.out_dir, o_dir))) # Create directory if needed logger.debug("Output destination: {}".format(outdir)) if not dry and not os.path.exists(outdir): @@ -338,8 +338,7 @@ def config_output(out, dry=False): def run_output(out): GS.current_output = out.name try: - out_dir = out.expand_dirname(out.dir) - out.run(get_output_dir(out_dir)) + out.run(get_output_dir(out.dir, out)) out._done = True except PlotError as e: logger.error("In output `"+str(out)+"`: "+str(e)) @@ -426,7 +425,7 @@ def get_out_targets(outputs, ori_names, targets, dependencies, comments): for out in outputs: name = name2make(out.name) ori_names[name] = out.name - tg = out.get_targets(os.path.join(GS.out_dir, out.expand_dirname(out.dir))) + tg = out.get_targets(out.expand_dirname(os.path.join(GS.out_dir, out.dir))) if not tg: continue targets[name] = [adapt_file_name(fn) for fn in tg] @@ -509,3 +508,8 @@ def generate_makefile(makefile, cfg_file, outputs, kibot_sys=False): f.write('{} -s all {}{}\n\n'.format(kibot_cmd, ori_names[name], log_action)) # Mark all outputs as PHONY f.write('.PHONY: '+' '.join(extra_targets+list(targets.keys()))+'\n') + + +# To avoid circular dependencies: Optionable needs it, but almost everything needs Optionable +GS.load_board = load_board +GS.load_sch = load_sch diff --git a/kibot/optionable.py b/kibot/optionable.py index 177ba6a9..777213f0 100644 --- a/kibot/optionable.py +++ b/kibot/optionable.py @@ -208,62 +208,93 @@ class Optionable(object): return GS.solved_global_variant.name return '' - def expand_filename_pcb(self, name): + def expand_filename_common(self, name): + """ Expansions common to the PCB and Schematic """ + # PCB expansions, explicit + if GS.board and '%b' in name: + name = name.replace('%bc', GS.pcb_comp) + name = name.replace('%bd', GS.pcb_date) + name = name.replace('%bF', GS.pcb_no_ext) + name = name.replace('%bf', GS.pcb_basename) + name = name.replace('%bp', GS.pcb_title) + name = name.replace('%br', GS.pcb_rev) + name = name.replace('%D', GS.today) + if GS.solved_global_variant: + name = name.replace('%g', GS.solved_global_variant.file_id) + name = name.replace('%G', GS.solved_global_variant.name) + # Schematic expansions, explicit + if GS.sch and '%s' in name: + name = name.replace('%sc', GS.sch_comp) + name = name.replace('%sd', GS.sch_date) + name = name.replace('%sF', GS.sch_no_ext) + name = name.replace('%sf', GS.sch_basename) + name = name.replace('%sp', GS.sch_title) + name = name.replace('%sr', GS.sch_rev) + name = name.replace('%T', GS.time) + if self: + name = name.replace('%i', self._expand_id) + name = name.replace('%v', self._find_variant()) + name = name.replace('%V', self._find_variant_name()) + name = name.replace('%x', self._expand_ext) + return name + + def expand_filename_both(self, name, is_sch=True): """ Expands %* values in filenames. Uses data from the PCB. """ if GS.debug_level > 3: parent = None - if hasattr(self, '_parent'): + if self and hasattr(self, '_parent'): parent = self._parent logger.debug('Expanding `{}` in PCB context for {} parent: {}'.format(name, self, parent)) - if GS.board: + # Determine if we need to expand SCH and/or PCB related data + has_dep_exp = any(map(lambda x: x in name, ['%c', '%d', '%F', '%f', '%p', '%r'])) + do_sch = is_sch and has_dep_exp + # logger.error(name + ' is_sch ' +str(is_sch)+" "+ str(do_sch)) + # raise + do_pcb = not is_sch and has_dep_exp + # Load the needed data + if GS.pcb_file and (do_pcb or '%b' in name): + if GS.board is None: + GS.load_board() GS.load_pcb_title_block() - # Do the replacements + if GS.sch_file and (do_sch or '%s' in name): + if GS.sch is None: + GS.load_sch() + GS.load_sch_title_block() + # This member can be called with a preflight object + name = Optionable.expand_filename_common(self, name) + if GS.board and do_pcb: name = name.replace('%c', GS.pcb_comp) name = name.replace('%d', GS.pcb_date) - name = name.replace('%D', GS.today) name = name.replace('%F', GS.pcb_no_ext) name = name.replace('%f', GS.pcb_basename) - name = name.replace('%i', self._expand_id) name = name.replace('%p', GS.pcb_title) name = name.replace('%r', GS.pcb_rev) - name = name.replace('%T', GS.time) - name = name.replace('%v', self._find_variant() if self else '') - name = name.replace('%V', self._find_variant_name() if self else '') - name = name.replace('%x', self._expand_ext) - # sanitize the name to avoid characters illegal in file systems - name = name.replace('\\', '/') - name = re.sub(r'[?%*:|"<>]', '_', name) + if GS.sch and do_sch: + name = name.replace('%c', GS.sch_comp) + name = name.replace('%d', GS.sch_date) + name = name.replace('%F', GS.sch_no_ext) + name = name.replace('%f', GS.sch_basename) + name = name.replace('%p', GS.sch_title) + name = name.replace('%r', GS.sch_rev) + # sanitize the name to avoid characters illegal in file systems + name = name.replace('\\', '/') + name = re.sub(r'[?%*:|"<>]', '_', name) if GS.debug_level > 3: logger.debug('Expanded `{}`'.format(name)) return name + def expand_filename_pcb(self, name): + """ Expands %* values in filenames. + Uses data from the PCB. """ + # This member can be called with a preflight object + return Optionable.expand_filename_both(self, name, is_sch=False) + def expand_filename_sch(self, name): """ Expands %* values in filenames. Uses data from the SCH. """ - if GS.debug_level > 3: - logger.debug('Expanding `{}` in sch context for {}'.format(name, self)) - if GS.sch_file: - GS.load_sch_title_block() - # Do the replacements - name = name.replace('%c', GS.sch_comp) - name = name.replace('%d', GS.sch_date) - name = name.replace('%D', GS.today) - name = name.replace('%F', GS.sch_no_ext) - name = name.replace('%f', GS.sch_basename) - name = name.replace('%i', self._expand_id) - name = name.replace('%p', GS.sch_title) - name = name.replace('%r', GS.sch_rev) - name = name.replace('%T', GS.time) - name = name.replace('%v', self._find_variant() if self else '') - name = name.replace('%V', self._find_variant_name() if self else '') - name = name.replace('%x', self._expand_ext) - # sanitize the name to avoid characters illegal in file systems - name = name.replace('\\', '/') - name = re.sub(r'[?%*:|"<>]', '_', name) - if GS.debug_level > 3: - logger.debug('Expanded `{}`'.format(name)) - return name + # This member can be called with a preflight object + return Optionable.expand_filename_both(self, name) @staticmethod def force_list(val): @@ -310,10 +341,7 @@ class BaseOptions(Optionable): cur_ext = self._expand_ext self._expand_id = id self._expand_ext = ext - if self._parent._sch_related: - name = self.expand_filename_sch(name) - else: - name = self.expand_filename_pcb(name) + name = self.expand_filename_both(name, is_sch=self._parent._sch_related) res = os.path.abspath(os.path.join(dir, name)) self._expand_id = cur_id self._expand_ext = cur_ext diff --git a/kibot/out_base.py b/kibot/out_base.py index 0eca868c..f31b6c76 100644 --- a/kibot/out_base.py +++ b/kibot/out_base.py @@ -78,15 +78,10 @@ class BaseOutput(RegOutput): self.options.config(self) def expand_dirname(self, out_dir): - if self._sch_related: - return self.options.expand_filename_sch(out_dir) - return self.options.expand_filename_pcb(out_dir) + return self.options.expand_filename_both(out_dir, is_sch=self._sch_related) def expand_filename(self, out_dir, name): - if self._sch_related: - name = self.options.expand_filename_sch(name) - else: - name = self.options.expand_filename_pcb(name) + name = self.options.expand_filename_both(name, is_sch=self._sch_related) return os.path.abspath(os.path.join(out_dir, name)) def run(self, output_dir): diff --git a/kibot/out_compress.py b/kibot/out_compress.py index f90dcc5e..0927dc88 100644 --- a/kibot/out_compress.py +++ b/kibot/out_compress.py @@ -118,6 +118,7 @@ class CompressOptions(BaseOptions): def get_files(self, output, no_out_run=False): output_real = os.path.realpath(output) files = OrderedDict() + out_dir = self.expand_filename_sch(GS.out_dir) for f in self.files: # Get the list of candidates files_list = None @@ -125,7 +126,7 @@ class CompressOptions(BaseOptions): for out in GS.outputs: if out.name == f.from_output: config_output(out) - files_list = out.get_targets(get_output_dir(out.expand_dirname(out.dir), dry=True)) + files_list = out.get_targets(get_output_dir(out.dir, out, dry=True)) break if files_list is None: logger.error('Unknown output `{}` selected in {}'.format(f.from_output, self._parent)) @@ -142,7 +143,7 @@ class CompressOptions(BaseOptions): logger.error('Unable to generate `{}` from {}'.format(file, out)) exit(INTERNAL_ERROR) else: - files_list = glob.iglob(os.path.join(GS.out_dir, f.source), recursive=True) + files_list = glob.iglob(os.path.join(out_dir, f.source), recursive=True) # Filter and adapt them for fname in filter(re.compile(f.filter).match, files_list): fname_real = os.path.realpath(fname) @@ -154,7 +155,7 @@ class CompressOptions(BaseOptions): if f.dest: dest = os.path.join(f.dest, os.path.basename(fname)) else: - dest = os.path.relpath(dest, GS.out_dir) + dest = os.path.relpath(dest, out_dir) files[fname_real] = dest return files @@ -162,7 +163,7 @@ class CompressOptions(BaseOptions): return [self._parent.expand_filename(out_dir, self.output)] def get_dependencies(self): - output = self.get_targets(GS.out_dir)[0] + output = self.get_targets(self.expand_filename_sch(GS.out_dir))[0] files = self.get_files(output, no_out_run=True) return files.keys() diff --git a/kibot/out_kibom.py b/kibot/out_kibom.py index 63df7977..10e32571 100644 --- a/kibot/out_kibom.py +++ b/kibot/out_kibom.py @@ -352,7 +352,7 @@ class KiBoMOptions(BaseOptions): self.conf = 'bom.ini' else: # A configuration - conf = os.path.abspath(os.path.join(GS.out_dir, CONFIG_FILENAME)) + conf = os.path.abspath(os.path.join(self.expand_filename_sch(GS.out_dir), CONFIG_FILENAME)) self.conf.save(conf) self.conf = conf self._expand_ext = self.format.lower() diff --git a/kibot/out_pdf_pcb_print.py b/kibot/out_pdf_pcb_print.py index 0c0ff97d..c614b141 100644 --- a/kibot/out_pdf_pcb_print.py +++ b/kibot/out_pdf_pcb_print.py @@ -131,7 +131,7 @@ class PDF_Pcb_PrintOptions(VariantOptions): logger.error(CMD_PCBNEW_PRINT_LAYERS+' returned %d', ret) exit(PDF_PCB_PRINT) if video_remove: - video_name = os.path.join(GS.out_dir, 'pcbnew_export_screencast.ogv') + video_name = os.path.join(self.expand_filename_pcb(GS.out_dir), 'pcbnew_export_screencast.ogv') if os.path.isfile(video_name): os.remove(video_name) diff --git a/kibot/out_render_3d.py b/kibot/out_render_3d.py index d5ffe15f..441baa44 100644 --- a/kibot/out_render_3d.py +++ b/kibot/out_render_3d.py @@ -131,7 +131,7 @@ class Render3DOptions(Base3DOptions): logger.error(CMD_PCBNEW_3D+' returned %d', ret) exit(RENDER_3D_ERR) if video_remove: - video_name = os.path.join(GS.out_dir, 'pcbnew_3d_view_screencast.ogv') + video_name = os.path.join(self.expand_filename_pcb(GS.out_dir), 'pcbnew_3d_view_screencast.ogv') if os.path.isfile(video_name): os.remove(video_name) diff --git a/kibot/pre_base.py b/kibot/pre_base.py index 430c8e5e..6b54e09b 100644 --- a/kibot/pre_base.py +++ b/kibot/pre_base.py @@ -5,6 +5,7 @@ # Project: KiBot (formerly KiPlot) from .gs import GS from .registrable import Registrable +from .optionable import Optionable from .log import get_logger logger = get_logger(__name__) @@ -22,6 +23,8 @@ class BasePreFlight(Registrable): self._sch_related = False self._pcb_related = False self._enabled = True + self._expand_id = '' + self._expand_ext = '' @staticmethod def add_preflight(o_pre): @@ -105,6 +108,9 @@ class BasePreFlight(Registrable): """ Returns a list of targets generated by this preflight """ return [] + def expand_dirname(self, out_dir): + return Optionable.expand_filename_both(self, out_dir, is_sch=self._sch_related) + def _find_variant(self): return '' diff --git a/kibot/pre_drc.py b/kibot/pre_drc.py index 4355eadd..85c035d2 100644 --- a/kibot/pre_drc.py +++ b/kibot/pre_drc.py @@ -34,7 +34,7 @@ class Run_DRC(BasePreFlight): # noqa: F821 load_board() out_pattern = GS.global_output if GS.global_output is not None else GS.def_global_output name = Optionable.expand_filename_pcb(self, out_pattern) - return [os.path.abspath(os.path.join(GS.out_dir, name))] + return [os.path.abspath(os.path.join(Optionable.expand_filename_pcb(self, GS.out_dir), name))] def run(self): check_script(CMD_PCBNEW_RUN_DRC, URL_PCBNEW_RUN_DRC, '1.4.0') @@ -45,13 +45,13 @@ class Run_DRC(BasePreFlight): # noqa: F821 cmd.extend(['-f', GS.filter_file]) if BasePreFlight.get_option('ignore_unconnected'): # noqa: F821 cmd.append('-i') - cmd.extend([GS.pcb_file, GS.out_dir]) + cmd.extend([GS.pcb_file, Optionable.expand_filename_pcb(self, GS.out_dir)]) # If we are in verbose mode enable debug in the child cmd, video_remove = add_extra_options(cmd) logger.info('- Running the DRC') ret = exec_with_retry(cmd) if video_remove: - video_name = os.path.join(GS.out_dir, 'pcbnew_run_drc_screencast.ogv') + video_name = os.path.join(Optionable.expand_filename_pcb(self, GS.out_dir), 'pcbnew_run_drc_screencast.ogv') if os.path.isfile(video_name): os.remove(video_name) if ret: diff --git a/kibot/pre_erc.py b/kibot/pre_erc.py index 09b8bcb8..0b23da9b 100644 --- a/kibot/pre_erc.py +++ b/kibot/pre_erc.py @@ -34,7 +34,7 @@ class Run_ERC(BasePreFlight): # noqa: F821 load_sch() out_pattern = GS.global_output if GS.global_output is not None else GS.def_global_output name = Optionable.expand_filename_sch(self, out_pattern) - return [os.path.abspath(os.path.join(GS.out_dir, name))] + return [os.path.abspath(os.path.join(Optionable.expand_filename_sch(self, GS.out_dir), name))] def run(self): check_eeschema_do() @@ -47,13 +47,13 @@ class Run_ERC(BasePreFlight): # noqa: F821 cmd.append('-w') if GS.filter_file: cmd.extend(['-f', GS.filter_file]) - cmd.extend([GS.sch_file, GS.out_dir]) + cmd.extend([GS.sch_file, Optionable.expand_filename_sch(self, GS.out_dir)]) # If we are in verbose mode enable debug in the child cmd, video_remove = add_extra_options(cmd) logger.info('- Running the ERC') ret = exec_with_retry(cmd) if video_remove: - video_name = os.path.join(GS.out_dir, 'run_erc_eeschema_screencast.ogv') + video_name = os.path.join(Optionable.expand_filename_sch(self, GS.out_dir), 'run_erc_eeschema_screencast.ogv') if os.path.isfile(video_name): os.remove(video_name) if ret: diff --git a/kibot/pre_filters.py b/kibot/pre_filters.py index daf37adb..da58612c 100644 --- a/kibot/pre_filters.py +++ b/kibot/pre_filters.py @@ -96,7 +96,7 @@ class Filters(BasePreFlight): # noqa: F821 def apply(self): # Create the filters file if self._value: - o_dir = get_output_dir('') + o_dir = get_output_dir('', self) GS.filter_file = os.path.join(o_dir, 'kibot_errors.filter') with open(GS.filter_file, 'w') as f: f.write(self._value) diff --git a/kibot/pre_update_xml.py b/kibot/pre_update_xml.py index 8f3f8c69..e5da5d25 100644 --- a/kibot/pre_update_xml.py +++ b/kibot/pre_update_xml.py @@ -8,6 +8,7 @@ from sys import (exit) from .macros import macros, pre_class # noqa: F401 from .error import (KiPlotConfigurationError) from .gs import (GS) +from .optionable import Optionable from .kiplot import check_eeschema_do, exec_with_retry, add_extra_options from .misc import (CMD_EESCHEMA_DO, BOM_ERROR) from .log import (get_logger) @@ -33,7 +34,7 @@ class Update_XML(BasePreFlight): # noqa: F821 def run(self): check_eeschema_do() - cmd = [CMD_EESCHEMA_DO, 'bom_xml', GS.sch_file, GS.out_dir] + cmd = [CMD_EESCHEMA_DO, 'bom_xml', GS.sch_file, Optionable.expand_filename_sch(self, GS.out_dir)] # If we are in verbose mode enable debug in the child cmd, video_remove = add_extra_options(cmd) logger.info('- Updating BoM in XML format') @@ -42,6 +43,6 @@ class Update_XML(BasePreFlight): # noqa: F821 logger.error('Failed to update the BoM, error %d', ret) exit(BOM_ERROR) if video_remove: - video_name = os.path.join(GS.out_dir, 'bom_xml_eeschema_screencast.ogv') + video_name = os.path.join(Optionable.expand_filename_sch(self, GS.out_dir), 'bom_xml_eeschema_screencast.ogv') if os.path.isfile(video_name): os.remove(video_name)