Commit: 978a7459f121c2a1491687ccc83b0caddc7d6d1f Author: Campbell Barton Date: Thu Jan 19 17:07:20 2023 +1100 Branches: master https://developer.blender.org/rB978a7459f121c2a1491687ccc83b0caddc7d6d1f
CMake: support multi-line strings for the help_features target =================================================================== M build_files/cmake/cmake_print_build_options.py =================================================================== diff --git a/build_files/cmake/cmake_print_build_options.py b/build_files/cmake/cmake_print_build_options.py index 3dc2951680a..7a30bb5da2b 100644 --- a/build_files/cmake/cmake_print_build_options.py +++ b/build_files/cmake/cmake_print_build_options.py @@ -6,18 +6,80 @@ import re import sys +from typing import Optional + cmakelists_file = sys.argv[-1] -def main(): +def count_backslashes_before_pos(file_data: str, pos: int) -> int: + slash_count = 0 + pos -= 1 + while pos >= 0: + if file_data[pos] != '\\': + break + pos -= 1 + slash_count += 1 + return slash_count + + +def extract_cmake_string_at_pos(file_data: str, pos_beg: int) -> Optional[str]: + assert file_data[pos_beg - 1] == '"' + + pos = pos_beg + # Dummy assignment. + pos_end = pos_beg + while True: + pos_next = file_data.find('"', pos) + if pos_next == -1: + raise Exception("Un-terminated string (parse error?)") + + count_slashes = count_backslashes_before_pos(file_data, pos_next) + if (count_slashes % 2) == 0: + pos_end = pos_next + # Found the closing quote. + break + + # The quote was back-slash escaped, step over it. + pos = pos_next + 1 + file_data[pos_next] + + assert file_data[pos_end] == '"' + + if pos_beg == pos_end: + return None + + # See: https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#escape-sequences + text = file_data[pos_beg: pos_end].replace( + # Handle back-slash literals. + "\\\\", "\\", + ).replace( + # Handle tabs. + "\\t", "\t", + ).replace( + # Handle escaped quotes. + "\\\"", "\"", + ).replace( + # Handle tabs. + "\\;", ";", + ).replace( + # Handle trailing newlines. + "\\\n", "", + ) + + return text + + +def main() -> None: options = [] - for l in open(cmakelists_file, 'r').readlines(): - if not l.lstrip().startswith('#'): - l_option = re.sub(r'.*\boption\s*\(\s*(WITH_[a-zA-Z0-9_]+)\s+\"(.*)\"\s*.*', r'\g<1> - \g<2>', l) - if l_option != l: - l_option = l_option.strip() - if l_option.startswith('WITH_'): - options.append(l_option) + with open(cmakelists_file, 'r', encoding="utf-8") as fh: + file_data = fh.read() + for m in re.finditer(r"^\s*option\s*\(\s*(WITH_[a-zA-Z0-9_]+)\s+(\")", file_data, re.MULTILINE): + option_name = m.group(1) + option_descr = extract_cmake_string_at_pos(file_data, m.span(2)[1]) + if option_descr is None: + # Possibly a parsing error, at least show something. + option_descr = "(UNDOCUMENTED)" + options.append("{:s}: {:s}".format(option_name, option_descr)) print('\n'.join(options)) _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs