def eval_auto(self, inputs, outputs): for rule_name, auto in self.auto_presets.items(): # name: (inputs, outputs, assigns) # check if all inputs match required auto inputs for auto_input in auto[0]: regex = wildcard_regex(auto_input) if regex: re_regex = re.compile(regex) match = all(re_regex.match(input) for input in inputs) else: match = all(input == auto_input for input in inputs) if not match: break if not match: continue # check if all outputs match required auto outputs for auto_output in auto[1]: regex = wildcard_regex(auto_output) if regex: re_regex = re.compile(regex) match = all(re_regex.match(output) for output in outputs) else: match = all(output == auto_output for output in outputs) if not match: break if not match: continue # if everything match - return rule name and variables return rule_name, auto[2] # if no rule found then just fail and optionally return None raise ValueError("unable to deduce auto rule in '%s' (%s:%i)" % ( self.current_line, self.filename, self.current_line_i, )) return None, None
def eval_filter(self, name, regex_or_value): value = self.variables.get(name, "") regex = wildcard_regex(regex_or_value) if regex: return re.match(regex, value) else: return regex_or_value == value
def eval_auto(self, inputs, outputs): for rule_name, auto in self.auto_presets.items(): # name: (inputs, outputs, assigns) # check if all inputs match required auto inputs for auto_input in auto[0]: regex = wildcard_regex(auto_input) if regex: re_regex = re.compile(regex) match = all(re_regex.match(input) for input in inputs) else: match = all(input == auto_input for input in inputs) if not match: break if not match: continue # check if all outputs match required auto outputs for auto_output in auto[1]: regex = wildcard_regex(auto_output) if regex: re_regex = re.compile(regex) match = all(re_regex.match(output) for output in outputs) else: match = all(output == auto_output for output in outputs) if not match: break if not match: continue # if everything match - return rule name and variables return rule_name, auto[2] # if no rule found then just fail and optionally return None raise ValueError(("unable to deduce auto rule in '%s', " + "please check if your file extensions are supported by current toolchain (%s:%i) " + "please also mind that file extensions like object files ('.o' and '.obj') and " + "executables may differ between platforms, so you should use transforms to make them work, " + "for example 'build objects(*): auto *.cpp' instead of 'build *.obj: auto *.cpp'") % ( self.current_line, self.filename, self.current_line_i )) return None, None