def parse_install_export(tokens, breakstack): """ :: install(EXPORT <export-name> DESTINATION <dir> [NAMESPACE <namespace>] [[FILE <name>.cmake]| [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [EXPORT_LINK_INTERFACE_LIBRARIES] [COMPONENT <component>] [EXCLUDE_FROM_ALL]) :see: https://cmake.org/cmake/help/v3.14/command/install.html#installing-exports """ return parse_standard( tokens, npargs='*', kwargs={ "EXPORT": PositionalParser(1), "DESTINATION": PositionalParser(1), "NAMESPACE": PositionalParser(1), "FILE": PositionalParser(1), "PERMISSIONS": PositionalParser('+'), "CONFIGURATIONS": PositionalParser('+'), "COMPONENT": PositionalParser(1), }, flags=[ "EXCLUDE_FROM_ALL" ], breakstack=breakstack)
def parse_external_project_add_step(tokens, breakstack): """ :: ExternalProject_Add_Step(<name> [<option>...]) :see: https://cmake.org/cmake/help/v3.14/module/ExternalProject.html#command:externalproject_add_step """ return parse_standard(tokens, npargs=2, kwargs={ "COMMAND": parse_shell_command, "COMMENT": PositionalParser('+'), "DEPENDEES": PositionalParser('+'), "DEPENDERS": PositionalParser('+'), "DEPENDS": PositionalParser('+'), "BYPRODUCTS": PositionalParser('+'), "ALWAYS": PositionalParser(1), "EXCLUDE_FROM_MAIN": PositionalParser(1), "WORKING_DIRECTORY": PositionalParser(1), "LOG": PositionalParser(1), "USES_TERMINAL": PositionalParser(1), }, flags=[], breakstack=breakstack)
def parse_install_files(tokens, breakstack): """ :: install(<FILES|PROGRAMS> files... TYPE <type> | DESTINATION <dir> [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL]) :see: https://cmake.org/cmake/help/v3.14/command/install.html#files """ return parse_standard( tokens, npargs='*', kwargs={ "FILES": PositionalParser('+'), "PROGRAMS": PositionalParser('+'), "TYPE": PositionalParser(1), "DESTINATION": PositionalParser(1), "PERMISSIONS": PositionalParser('+'), "CONFIGURATIONS": PositionalParser('+'), "COMPONENT": PositionalParser(1), "RENAME": PositionalParser(1), }, flags=[ "OPTIONAL", "EXCLUDE_FROM_ALL", ], breakstack=breakstack)
def parse_install_targets(tokens, breakstack): """ :: install(TARGETS targets... [EXPORT <export-name>] [[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE| PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE] [DESTINATION <dir>] [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [NAMELINK_COMPONENT <component>] [OPTIONAL] [EXCLUDE_FROM_ALL] [NAMELINK_ONLY|NAMELINK_SKIP] ] [...] [INCLUDES DESTINATION [<dir> ...]] ) :see: https://cmake.org/cmake/help/v3.14/command/install.html#targets """ kwargs = { "TARGETS": PositionalParser('+'), "EXPORT": PositionalParser(1), "INCLUDES": PositionalParser('+', flags=["DESTINATION"]) } for subkey in ("ARCHIVE", "LIBRARY", "RUNTIME", "OBJECTS", "FRAMEWORK", "BUNDLE", "PRIVATE_HEADER", "PUBLIC_HEADER", "RESOURCE"): kwargs[subkey] = parse_install_targets_sub return parse_standard( tokens, npargs='*', kwargs=kwargs, flags=[], breakstack=breakstack)
def parse_file_lock(tokens, breakstack): """ :: file(LOCK <path> [DIRECTORY] [RELEASE] [GUARD <FUNCTION|FILE|PROCESS>] [RESULT_VARIABLE <variable>] [TIMEOUT <seconds>]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#locking """ return parse_standard(tokens, npargs='+', kwargs={ "GUARD": PositionalParser( 1, flags=["FUNCTION", "FILE", "PROCESS"]), "RESULT_VARIABLE": PositionalParser(1), "TIMEOUT": PositionalParser(1) }, flags=[ "LOCK", "DIRECTORY", "RELEASE", ], breakstack=breakstack)
def parse_add_custom_command_events(tokens, breakstack): """ :: add_custom_command(TARGET <target> PRE_BUILD | PRE_LINK | POST_BUILD COMMAND command1 [ARGS] [args1...] [COMMAND command2 [ARGS] [args2...] ...] [BYPRODUCTS [files...]] [WORKING_DIRECTORY dir] [COMMENT comment] [VERBATIM] [USES_TERMINAL] [COMMAND_EXPAND_LISTS]) :see: https://cmake.org/cmake/help/latest/command/add_custom_command.html """ return parse_standard( tokens, npargs='*', kwargs={ "BYPRODUCTS": PositionalParser('*'), "COMMAND": parse_shell_command, "COMMENT": PositionalParser('*'), "TARGET": PositionalParser(1), "WORKING_DIRECTORY": PositionalParser(1) }, flags=[ "APPEND", "VERBATIM", "USES_TERMINAL", "COMMAND_EXPAND_LISTS", "PRE_BUILD", "PRE_LINK", "POST_BUILD"], breakstack=breakstack)
def parse_file_xfer(tokens, breakstack): """ :: file(DOWNLOAD <url> <file> [<options>...]) file(UPLOAD <file> <url> [<options>...]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#transfer """ return parse_standard( tokens, npargs=3, kwargs={ "INACTIVITY_TIMEOUT": PositionalParser(1), "LOG": PositionalParser(1), "STATUS": PositionalParser(1), "TIMEOUT": PositionalParser(1), "USERPWD": PositionalParser(1), "HTTPHEADER": PositionalParser(1), "NETRC": PositionalParser( 1, flags=["CMAKE_NETRC", "IGNORED", "OPTIONAL", "REQUIRED"]), "NETRC_FILE": PositionalParser(1), "EXPECTED_HASH": PositionalParser(1), "EXPECTED_MD5": PositionalParser(1), "TLS_VERIFY": PositionalParser(1), "TLS_CAINFO": PositionalParser(1), }, flags=[ "DOWNLOAD", "UPLOAD", "SHOW_PROGRESS", ], breakstack=breakstack)
def parse_file_strings(tokens, breakstack): """ :: file(STRINGS <filename> <variable> [<options>...]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#read """ return parse_standard( tokens, npargs='*', kwargs={ "LENGTH_MAXIMUM": PositionalParser(1), "LENGTH_MINIMUM": PositionalParser(1), "LIMIT_COUNT": PositionalParser(1), "LIMIT_INPUT": PositionalParser(1), "LIMIT_OUTPUT": PositionalParser(1), "REGEX": PositionalParser(1), "ENCODING": PositionalParser(1, flags=[ "UTF-8", "UTF-16LE", "UTF-16BE", "UTF-32LE", "UTF-32BE" ]), }, flags=[ "STRINGS", "NEWLINE_CONSUME", "NO_HEX_CONVERSION", ], breakstack=breakstack)
def parse_file_glob(tokens, breakstack): """ :: file(GLOB <variable> [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS] [<globbing-expressions>...]) file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS] [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS] [<globbing-expressions>...]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#filesystem """ return parse_standard( tokens, npargs='+', kwargs={ "LIST_DIRECTORIES": PositionalParser(1), "RELATIVE": PositionalParser(1) }, flags=[ "GLOB", "GLOB_RECURSE", "CONFIGURE_DEPENDS", "FOLLOW_SYMLINKS"], breakstack=breakstack)
def parse_add_custom_command(tokens, breakstack): """ :: add_custom_command(OUTPUT output1 [output2 ...] COMMAND command1 [ARGS] [args1...] [COMMAND command2 [ARGS] [args2...] ...] [MAIN_DEPENDENCY depend] [DEPENDS [depends...]] [IMPLICIT_DEPENDS <lang1> depend1 [<lang2> depend2] ...] [WORKING_DIRECTORY dir] [COMMENT comment] [VERBATIM] [APPEND]) :see: https://cmake.org/cmake/help/v3.0/command/add_custom_command.html """ return parse_standard( tokens, npargs='*', kwargs={ "COMMAND": parser.parse_shell_command, "COMMENT": parser.PositionalParser('*'), "DEPENDS": parser.PositionalParser('*'), "IMPLICIT_DEPENDS": parser.PositionalTupleParser('+', 2), "MAIN_DEPENDENCY": parser.PositionalParser(1), "OUTPUT": parser.PositionalParser('+'), "WORKING_DIRECTORY": parser.PositionalParser(1) }, flags=["APPEND", "VERBATIM", "PRE_BUILD", "PRE_LINK", "POST_BUILD"], breakstack=breakstack)
def parse_add_library(tokens, breakstack): """ ``add_library()`` has several forms: * normal libraires * imported libraries * object libraries * alias libraries * interface libraries This function is just the dispatcher :see: https://cmake.org/cmake/help/latest/command/add_library.html """ semantic_iter = iter_semantic_tokens(tokens) # NOTE(josh): first token is always the name of the library _ = next(semantic_iter, None) # Second token is usually the descriminator, except for INTERFACE second_token = next(semantic_iter, None) if second_token is None: # All add_library() commands should have at least two arguments logger.warning("Invalid add_library() command at %s", tokens[0].get_location()) return parse_standard(tokens, npargs='*', kwargs={}, flags=[], breakstack=breakstack) descriminator = second_token.spelling.upper() parsemap = { "OBJECT": parse_add_library_object, "ALIAS": parse_add_library_alias, "INTERFACE": parse_add_library_interface, "IMPORTED": parse_add_library_imported } if descriminator in parsemap: return parsemap[descriminator](tokens, breakstack) third_token = next(semantic_iter, None) if third_token is not None: descriminator = third_token.spelling.upper() if descriminator == "IMPORTED": return parse_add_library_imported(tokens, breakstack) # If the descriminator token might be a variable dereference, then it # might be hiding the descriminator... so we shouldn't infer # sortability unless it is a word that doesn't match any of the descriminator # flags sortable = True if "${" in second_token.spelling or "${" in third_token.spelling: sortable = False return parse_add_library_standard(tokens, breakstack, sortable)
def parse_add_executable_alias(tokens, breakstack): """ :: add_executable(<name> ALIAS <target>) :see: https://cmake.org/cmake/help/latest/command/add_executable.html """ return parse_standard( tokens, npargs=3, kwargs={}, flags=["ALIAS"], breakstack=breakstack)
def parse_add_library_alias(tokens, breakstack): """ :: add_library(<name> ALIAS <target>) :see: https://cmake.org/cmake/help/latest/command/add_library.html#alias-libraries """ return parse_standard(tokens, npargs=3, kwargs={}, flags=["ALIAS"], breakstack=breakstack)
def parse_add_library_interface(tokens, breakstack): """ :: add_library(<name> INTERFACE [IMPORTED [GLOBAL]]) :see: https://cmake.org/cmake/help/latest/command/add_library.html#interface-libraries """ return parse_standard(tokens, npargs='+', kwargs={}, flags=["INTERFACE", "IMPORTED", "GLOBAL"], breakstack=breakstack)
def parse_install(tokens, breakstack): """ The ``install()`` command has multiple different forms, implemented by different functions. The forms are indicated by the first token and are: * TARGETS * FILES * DIRECTORY * SCRIPT * CODE * EXPORT :see: https://cmake.org/cmake/help/v3.0/command/install.html """ descriminator_token = get_first_semantic_token(tokens) if descriminator_token is None: logger.warning("Invalid install() command at %s", tokens[0].get_location()) return parse_standard(tokens, npargs='*', kwargs={}, flags=[], breakstack=breakstack) descriminator = descriminator_token.spelling.upper() parsemap = { "TARGETS": parse_install_targets, "FILES": parse_install_files, "PROGRAMS": parse_install_files, "DIRECTORY": parse_install_directory, "SCRIPT": parse_install_script, "CODE": parse_install_script, "EXPORT": parse_install_export } if descriminator not in parsemap: logger.warning("Invalid install form \"%s\" at %s", descriminator, tokens[0].location()) return parse_standard(tokens, npargs='*', kwargs={}, flags=[], breakstack=breakstack) return parsemap[descriminator](tokens, breakstack)
def parse_add_executable_imported(tokens, breakstack): """ :: add_executable(<name> IMPORTED [GLOBAL]) :see: https://cmake.org/cmake/help/latest/command/add_executable.html """ return parse_standard( tokens, npargs='+', kwargs={}, flags=["IMPORTED", "GLOBAL"], breakstack=breakstack)
def parse_foreach_range(tokens, breakstack): """ :: foreach(<loop_var> RANGE <start> <stop> [<step>]) <commands> endforeach() """ return parse_standard(tokens, npargs=1, kwargs={"RANGE": PositionalParser(3)}, flags=[], breakstack=breakstack)
def parse_file_timestamp(tokens, breakstack): """ :: file(TIMESTAMP <filename> <variable> [<format>] [UTC]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#strings """ return parse_standard(tokens, npargs='+', kwargs={}, flags=["TIMESTAMP", "UTC"], breakstack=breakstack)
def parse_file_hash(tokens, breakstack): """ :: file(<HASH> <filename> <variable>) :see: https://cmake.org/cmake/help/v3.14/command/file.html#strings """ return parse_standard(tokens, npargs=3, kwargs={}, flags=HASH_STRINGS, breakstack=breakstack)
def parse_add_library_imported(tokens, breakstack): """ :: add_library(<name> <SHARED|STATIC|MODULE|OBJECT|UNKNOWN> IMPORTED [GLOBAL]) :see: https://cmake.org/cmake/help/latest/command/add_library.html """ return parse_standard(tokens, npargs='+', kwargs={}, flags=[ "SHARED", "STATIC", "MODULE", "OBJECT", "UNKOWN", "IMPORTED", "GLOBAL" ], breakstack=breakstack)
def parse_set_target_properties(tokens, breakstack): """ :: set_target_properties(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...) """ return parse_standard( tokens, npargs='+', kwargs={ "PROPERTIES": PositionalTupleParser(2, '+', []) }, flags=[], breakstack=breakstack)
def parse_file_copy(tokens, breakstack): """ :: file(<COPY|INSTALL> <files>... DESTINATION <dir> [FILE_PERMISSIONS <permissions>...] [DIRECTORY_PERMISSIONS <permissions>...] [NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS] [FILES_MATCHING] [[PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS <permissions>...]] [...]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#filesystem """ return parse_standard( tokens, npargs='*', kwargs={ "COPY": PositionalParser('*'), "DESTINATION": PositionalParser(1), "FILE_PERMISSIONS": PositionalParser('+', flags=[ "OWNER_READ", "OWNER_WRITE", "OWNER_EXECUTE", "GROUP_READ", "GROUP_WRITE", "GROUP_EXECUTE", "WORLD_READ", "WORLD_WRITE", "WORLD_EXECUTE", "SETUID", "SETGID" ]), "DIRECTORY_PERMISSIONS": PositionalParser('+'), "PATTERN": parse_pattern, "REGEX": parse_pattern, }, flags=[ "INSTALL", "NO_SOURCE_PERMISSIONS", "USE_SOURCE_PERMISSIONS", "FILES_MATCHING", ], breakstack=breakstack)
def parse_file_read(tokens, breakstack): """ :: file(READ <filename> <variable> [OFFSET <offset>] [LIMIT <max-in>] [HEX]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#read """ return parse_standard(tokens, npargs='*', kwargs={ "OFFSET": PositionalParser(1), "LIMIT": PositionalParser(1), }, flags=["READ", "HEX"], breakstack=breakstack)
def parse_fetchcontent_getproperties(tokens, breakstack): """ :: FetchContent_GetProperties( <name> [SOURCE_DIR <srcDirVar>] [BINARY_DIR <binDirVar>] [POPULATED <doneVar>] ) """ return parse_standard(tokens, npargs=1, kwargs={ "SOURCE_DIR": PositionalParser(1), "BINARY_DIR": PositionalParser(1), "POPULATED": PositionalParser(1), }, flags=[], breakstack=breakstack)
def parse_file_create_link(tokens, breakstack): """ :: file(CREATE_LINK <original> <linkname> [RESULT <result>] [COPY_ON_ERROR] [SYMBOLIC]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#filesystem """ return parse_standard(tokens, npargs='+', kwargs={ "RESULT": PositionalParser(1), }, flags=[ "COPY_ON_ERROR", "SYMBOLIC", ], breakstack=breakstack)
def parse_file_generate_output(tokens, breakstack): """ :: file(GENERATE OUTPUT output-file <INPUT input-file|CONTENT content> [CONDITION expression]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#writing """ return parse_standard(tokens, npargs=1, kwargs={ "OUTPUT": PositionalParser(1), "INPUT": PositionalParser(1), "CONTENT": PositionalParser('+'), "CONDITION": parse_conditional, }, flags=["GENERATE"], breakstack=breakstack)
def parse_install_script(tokens, breakstack): """ :: install([[SCRIPT <file>] [CODE <code>]] [COMPONENT <component>] [EXCLUDE_FROM_ALL] [...]) :see: https://cmake.org/cmake/help/v3.14/command/install.html#custom-installation-logic """ return parse_standard( tokens, npargs='*', kwargs={ "SCRIPT": PositionalParser(1), "CODE": PositionalParser(1), "COMPONENT": PositionalParser(1), }, flags=[ "EXCLUDE_FROM_ALL" ], breakstack=breakstack)
def parse_install_directory(tokens, breakstack): """ :: install(DIRECTORY dirs... TYPE <type> | DESTINATION <dir> [FILE_PERMISSIONS permissions...] [DIRECTORY_PERMISSIONS permissions...] [USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [EXCLUDE_FROM_ALL] [FILES_MATCHING] [[PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS permissions...]] [...]) :see: https://cmake.org/cmake/help/v3.14/command/install.html#directory """ return parse_standard( tokens, npargs='*', kwargs={ "DIRECTORY": PositionalParser('+'), "TYPE": PositionalParser(1), "DESTINATION": PositionalParser(1), "FILE_PERMISSIONS": PositionalParser('+'), "DIRECTORY_PERMISSIONS": PositionalParser('+'), "CONFIGURATIONS": PositionalParser('+'), "COMPONENT": PositionalParser(1), "RENAME": PositionalParser(1), "PATTERN": parse_pattern, "REGEX": parse_pattern, }, flags=[ "USER_SOURCE_PERMISSIONS", "OPTIONAL", "MESSAGE_NEVER", "FILES_MATCHING", ], breakstack=breakstack)
def parse_foreach(tokens, breakstack): """ ``parse_foreach()`` has a couple of forms: * the usual form * range form * in (lists/items) form This function is just the dispatcher :see: https://cmake.org/cmake/help/latest/command/foreach.html """ semantic_iter = iter_semantic_tokens(tokens) # first token is always the loop variable _ = next(semantic_iter, None) # Second token is usually the descriminator second_token = next(semantic_iter, None) if second_token is None: # All foreach() statements should have at least two arguments logger.warning("Invalid foreach() statement at %s", tokens[0].get_location()) return parse_standard(tokens, npargs='*', kwargs={}, flags=[], breakstack=breakstack) descriminator = second_token.spelling.upper() dispatchee = { "RANGE": parse_foreach_range, "IN": parse_foreach_in }.get(descriminator, None) if dispatchee is not None: return dispatchee(tokens, breakstack) return parse_foreach_standard(tokens, breakstack)
def parse_add_custom_command_standard(tokens, breakstack): """ :: add_custom_command(OUTPUT output1 [output2 ...] COMMAND command1 [ARGS] [args1...] [COMMAND command2 [ARGS] [args2...] ...] [MAIN_DEPENDENCY depend] [DEPENDS [depends...]] [BYPRODUCTS [files...]] [IMPLICIT_DEPENDS <lang1> depend1 [<lang2> depend2] ...] [WORKING_DIRECTORY dir] [COMMENT comment] [DEPFILE depfile] [JOB_POOL job_pool] [VERBATIM] [APPEND] [USES_TERMINAL] [COMMAND_EXPAND_LISTS]) :see: https://cmake.org/cmake/help/latest/command/add_custom_command.html """ return parse_standard( tokens, npargs='*', kwargs={ "BYPRODUCTS": PositionalParser('*'), "COMMAND": parse_shell_command, "COMMENT": PositionalParser('*'), "DEPENDS": PositionalParser('*'), "DEPFILE": PositionalParser(1), "JOB_POOL": PositionalParser(1), "IMPLICIT_DEPENDS": PositionalTupleParser(2, '+'), "MAIN_DEPENDENCY": PositionalParser(1), "OUTPUT": PositionalParser('+'), "WORKING_DIRECTORY": PositionalParser(1) }, flags=["APPEND", "VERBATIM", "USES_TERMINAL", "COMMAND_EXPAND_LISTS"], breakstack=breakstack)