def parse_file_copy(ctx, 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 StandardArgTree.parse( ctx, 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": PatternNode.parse, "REGEX": PatternNode.parse, }, flags=[ "INSTALL", "NO_SOURCE_PERMISSIONS", "USE_SOURCE_PERMISSIONS", "FILES_MATCHING", ], breakstack=breakstack)
def parse_install_export(ctx, 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 StandardArgTree.parse( ctx, 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_include_external_msproject(ctx, tokens, breakstack): """ :: include_external_msproject(projectname location [TYPE projectTypeGUID] [GUID projectGUID] [PLATFORM platformName] dep1 dep2 ...) :see: https://cmake.org/cmake/help/latest/command/include_external_msproject.html """ kwargs = { "TYPE": PositionalParser(1), "GUID": PositionalParser(1), "PLATFORM": PositionalParser(1) } return StandardArgTree.parse(ctx, tokens, "2+", kwargs, [], breakstack)
def parse_ctest_update(ctx, tokens, breakstack): """ :: ctest_update([SOURCE <source-dir>] [RETURN_VALUE <result-var>] [CAPTURE_CMAKE_ERROR <result-var>] [QUIET]) :see: https://cmake.org/cmake/help/latest/command/ctest_update.html """ kwargs = { "SOURCE": PositionalParser(1), "RETURN_VALUE": PositionalParser(1), "CAPTURE_CMAKE_ERROR": PositionalParser(1) } flags = ["QUIET"] return StandardArgTree.parse(ctx, tokens, "+", kwargs, flags, breakstack)
def parse_exec_program(ctx, tokens, breakstack): """ :: exec_program(Executable [directory in which to run] [ARGS <arguments to executable>] [OUTPUT_VARIABLE <var>] [RETURN_VALUE <var>]) :see: https://cmake.org/cmake/help/latest/command/exec_program.html """ kwargs = { "ARGS": PositionalParser("+"), "OUTPUT_VARIABLE": PositionalParser(1), "RETURN_VALUE": PositionalParser(1) } return StandardArgTree.parse(ctx, tokens, 2, kwargs, [], breakstack)
def parse_ctest_configure(ctx, tokens, breakstack): """ :: ctest_configure([BUILD <build-dir>] [SOURCE <source-dir>] [APPEND] [OPTIONS <options>] [RETURN_VALUE <result-var>] [QUIET] [CAPTURE_CMAKE_ERROR <result-var>]) :see: https://cmake.org/cmake/help/latest/command/ctest_configure.html """ kwargs = { "BUILD": PositionalParser(1), "SOURCE": PositionalParser(1), "OPTIONS": PositionalParser(1), "RETURN_VALUE": PositionalParser(1), "CAPTURE_CMAKE_ERROR": PositionalParser(1) } return StandardArgTree.parse( ctx, tokens, "+", kwargs, ["APPEND", "QUIET"], breakstack)
def parse_math(ctx, tokens, breakstack): """ :: math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>]) :see: https://cmake.org/cmake/help/latest/command/math.html """ kwargs = {"OUTPUT_FORMAT": PositionalParser(1)} return StandardArgTree.parse(ctx, tokens, "3", kwargs, [], breakstack)
def parse_file_read(ctx, 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 StandardArgTree.parse(ctx, tokens, npargs='*', kwargs={ "OFFSET": PositionalParser(1), "LIMIT": PositionalParser(1), }, flags=["READ", "HEX"], breakstack=breakstack)
def parse_install_targets(ctx, tokens, breakstack): """ :: install_targets(<dir> [RUNTIME_DIRECTORY dir] target target) :see: https://cmake.org/cmake/help/latest/command/install_targets.html """ kwargs = {"RUNTIME_DIRECTORY": PositionalParser(1)} return StandardArgTree.parse(ctx, tokens, "2+", kwargs, [], breakstack)
def parse_fetchcontent_getproperties(ctx, tokens, breakstack): """ :: FetchContent_GetProperties( <name> [SOURCE_DIR <srcDirVar>] [BINARY_DIR <binDirVar>] [POPULATED <doneVar>] ) """ return StandardArgTree.parse(ctx, tokens, npargs=1, kwargs={ "SOURCE_DIR": PositionalParser(1), "BINARY_DIR": PositionalParser(1), "POPULATED": PositionalParser(1), }, flags=[], breakstack=breakstack)
def parse_add_custom_command_events(ctx, 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 """ subtree = StandardArgTree.parse(ctx, tokens, npargs='*', kwargs={ "BYPRODUCTS": PositionalParser('*'), "COMMAND": ShellCommandNode.parse, "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) subtree.check_required_kwargs( ctx.lint_ctx, { # Truly required keyword arguments "COMMAND": "E1125", # Required by convention "COMMENT": "C0113" }) return subtree
def parse_ctest_run_script(ctx, tokens, breakstack): """ :: ctest_run_script([NEW_PROCESS] script_file_name script_file_name1 script_file_name2 ... [RETURN_VALUE var]) :see: https://cmake.org/cmake/help/latest/command/ctest_run_script.html """ kwargs = {"RETURN_VALUE": PositionalParser(1)} flags = ["NEW_PROCESS"] return StandardArgTree.parse(ctx, tokens, "+", kwargs, flags, breakstack)
def parse_install_script(ctx, 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 StandardArgTree.parse( ctx, tokens, npargs='*', kwargs={ "SCRIPT": PositionalParser(1), "CODE": PositionalParser(1), "COMPONENT": PositionalParser(1), }, flags=[ "EXCLUDE_FROM_ALL" ], breakstack=breakstack)
def parse_ctest_coverage(ctx, tokens, breakstack): """ :: ctest_coverage([BUILD <build-dir>] [APPEND] [LABELS <label>...] [RETURN_VALUE <result-var>] [CAPTURE_CMAKE_ERROR <result-var>] [QUIET] ) :see: https://cmake.org/cmake/help/latest/command/ctest_coverage.html """ kwargs = { "BUILD": PositionalParser(1), "LABELS": PositionalParser("+"), "RETURN_VALUE": PositionalParser(1), "CAPTURE_CMAKE_ERROR": PositionalParser(1), } return StandardArgTree.parse( ctx, tokens, "+", kwargs, ["APPEND", "QUIET"], breakstack)
def parse_add_custom_command_standard(ctx, 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 """ subtree = StandardArgTree.parse( ctx, tokens, npargs='*', kwargs={ "BYPRODUCTS": PositionalParser('*'), "COMMAND": ShellCommandNode.parse, "COMMENT": PositionalParser('*'), "DEPENDS": PositionalParser('*'), "DEPFILE": PositionalParser(1), "JOB_POOL": PositionalParser(1), "IMPLICIT_DEPENDS": TupleParser(2, '+'), "MAIN_DEPENDENCY": PositionalParser(1), "OUTPUT": PositionalParser('+'), "WORKING_DIRECTORY": PositionalParser(1) }, flags=["APPEND", "VERBATIM", "USES_TERMINAL", "COMMAND_EXPAND_LISTS"], breakstack=breakstack) subtree.check_required_kwargs( ctx.lint_ctx, { # Truly required keyword arguments "COMMAND": "E1125", # Required by convention "COMMENT": "C0113" }) return subtree
def parse_file_generate_output(ctx, 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 StandardArgTree.parse(ctx, tokens, npargs=1, kwargs={ "OUTPUT": PositionalParser(1), "INPUT": PositionalParser(1), "CONTENT": PositionalParser('+'), "CONDITION": ConditionalGroupNode.parse, }, flags=["GENERATE"], breakstack=breakstack)
def parse_file_glob(ctx, 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 StandardArgTree.parse( ctx, tokens, npargs='+', kwargs={ "LIST_DIRECTORIES": PositionalParser(1), "RELATIVE": PositionalParser(1) }, flags=["GLOB", "GLOB_RECURSE", "CONFIGURE_DEPENDS", "FOLLOW_SYMLINKS"], breakstack=breakstack)
def parse_install_targets_sub(ctx, tokens, breakstack): """ Parse the inner kwargs of an ``install(TARGETS)`` command. This is common logic for ARCHIVE, LIBRARY, RUNTIME, etc. :see: https://cmake.org/cmake/help/v3.14/command/install.html#targets """ return StandardArgTree.parse( ctx, tokens, npargs='*', kwargs={ "DESTINATION": PositionalParser(1), "PERMISSIONS": PositionalParser('+'), "CONFIGURATIONS": PositionalParser('+'), "COMPONENT": PositionalParser(1), "NAMELINK_COMPONENT": PositionalParser(1), }, flags=[ "OPTIONAL", "EXCLUDE_FROM_ALL", "NAMELINK_ONLY", "NAMELINK_SKIP" ], breakstack=breakstack)
def parse_ctest_start(ctx, tokens, breakstack): """ :: ctest_start(<model> [<source> [<binary>]] [GROUP <group>] [QUIET]) ctest_start([<model> [<source> [<binary>]]] [GROUP <group>] APPEND [QUIET]) :see: https://cmake.org/cmake/help/latest/command/ctest_start.html """ kwargs = { "GROUP": PositionalParser(1) } flags = ["QUIET", "APPEND"] return StandardArgTree.parse(ctx, tokens, "+", kwargs, flags, breakstack)
def parse_subdirs(ctx, tokens, breakstack): """ :: subdirs(dir1 dir2 ...[EXCLUDE_FROM_ALL exclude_dir1 exclude_dir2 ...] [PREORDER] ) :see: https://cmake.org/cmake/help/latest/command/subdirs.html """ kwargs = { "EXCLUDE_FROM_ALL": PositionalParser("+"), } flags = ["PREORDER"] return StandardArgTree.parse(ctx, tokens, "+", kwargs, flags, breakstack)
def parse_foreach_range(ctx, tokens, breakstack): """ :: foreach(<loop_var> RANGE <start> <stop> [<step>]) <commands> endforeach() """ return StandardArgTree.parse(ctx, tokens, npargs=1, kwargs={"RANGE": PositionalParser("1-3")}, flags=[], breakstack=breakstack)
def parse(cls, ctx, tokens, breakstack): """ :: [PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS <permissions>...] """ return super(PatternNode, cls).parse(ctx, tokens, npargs='+', kwargs={ "PERMISSIONS": PositionalParser('+'), }, flags=["EXCLUDE"], breakstack=breakstack)
def parse_install_directory(ctx, 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 StandardArgTree.parse( ctx, 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": PatternNode.parse, "REGEX": PatternNode.parse, }, flags=[ "USER_SOURCE_PERMISSIONS", "OPTIONAL", "MESSAGE_NEVER", "FILES_MATCHING", ], breakstack=breakstack)
def parse_file_create_link(ctx, 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 StandardArgTree.parse(ctx, tokens, npargs='+', kwargs={ "RESULT": PositionalParser(1), }, flags=[ "COPY_ON_ERROR", "SYMBOLIC", ], breakstack=breakstack)
def parse_file_strings(ctx, tokens, breakstack): """ :: file(STRINGS <filename> <variable> [<options>...]) :see: https://cmake.org/cmake/help/v3.14/command/file.html#read """ return StandardArgTree.parse(ctx, 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_ctest_memcheck(ctx, tokens, breakstack): """ :: ctest_memcheck([BUILD <build-dir>] [APPEND] [START <start-number>] [END <end-number>] [STRIDE <stride-number>] [EXCLUDE <exclude-regex>] [INCLUDE <include-regex>] [EXCLUDE_LABEL <label-exclude-regex>] [INCLUDE_LABEL <label-include-regex>] [EXCLUDE_FIXTURE <regex>] [EXCLUDE_FIXTURE_SETUP <regex>] [EXCLUDE_FIXTURE_CLEANUP <regex>] [PARALLEL_LEVEL <level>] [TEST_LOAD <threshold>] [SCHEDULE_RANDOM <ON|OFF>] [STOP_TIME <time-of-day>] [RETURN_VALUE <result-var>] [DEFECT_COUNT <defect-count-var>] [QUIET] ) :see: https://cmake.org/cmake/help/latest/command/ctest_memcheck.html """ kwargs = { "BUILD": PositionalParser(1), "START": PositionalParser(1), "END": PositionalParser(1), "STRIDE": PositionalParser(1), "EXCLUDE": PositionalParser(1), "INCLUDE": PositionalParser(1), "EXCLUDE_LABEL": PositionalParser(1), "INCLUDE_LABEL": PositionalParser(1), "EXCLUDE_FIXTURE": PositionalParser(1), "EXCLUDE_FIXTURE_SETUP": PositionalParser(1), "EXCLUDE_FIXTURE_CLEANUP": PositionalParser(1), "PARALLEL_LEVEL": PositionalParser(1), "TEST_LOAD": PositionalParser(1), "SCHEDULE_RANDOM": PositionalParser(1, flags=["ON", "OFF"]), "STOP_TIME": PositionalParser(1), "RETURN_VALUE": PositionalParser(1), "DEFECT_COUNT": PositionalParser(1), } flags = ["APPEND", "QUIET"] return StandardArgTree.parse(ctx, tokens, 0, kwargs, flags, breakstack)
def parse_file_xfer(ctx, 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 StandardArgTree.parse(ctx, 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_external_project_add(ctx, tokens, breakstack): """ :: ExternalProject_Add(<name> [<option>...]) :see: https://cmake.org/cmake/help/v3.14/module/ExternalProject.html """ return StandardArgTree.parse( ctx, tokens, npargs=1, kwargs={ # Directory Options "PREFIX": PositionalParser(1), "TMP_DIR": PositionalParser(1), "STAMP_DIR": PositionalParser(1), "LOG_DIR": PositionalParser(1), "DOWNLOAD_DIR": PositionalParser(1), "SOURCE_DIR": PositionalParser(1), "BINARY_DIR": PositionalParser(1), "INSTALL_DIR": PositionalParser(1), # Download Step Options "DOWNLOAD_COMMAND": ShellCommandNode.parse, "URL": PositionalParser('+'), "URL_HASH": PositionalParser(1), "URL_MD5": PositionalParser(1), "DOWNLOAD_NAME": PositionalParser(1), "DOWNLOAD_NO_EXTRACT": PositionalParser(1), "DOWNLOAD_NO_PROGRESS": PositionalParser(1), "TIMEOUT": PositionalParser(1), "HTTP_USERNAME": PositionalParser(1), "HTTP_PASSWORD": PositionalParser(1), "HTTP_HEADER": PositionalParser('+'), "TLS_VERIFY": PositionalParser(1), "TLS_CAINFO": PositionalParser(1), "NETRC": PositionalParser( 1, flags=["CMAKE_NETRC", "IGNORED", "OPTIONAL", "REQUIRED"]), "NETRC_FILE": PositionalParser(1), # Git "GIT_REPOSITORY": PositionalParser(1), "GIT_TAG": PositionalParser(1), "GIT_REMOTE_NAME": PositionalParser(1), "GIT_SUBMODULES": PositionalParser('+'), "GIT_SHALLOW": PositionalParser(1), "GIT_PROGRESS": PositionalParser(1), "GIT_CONFIG": PositionalParser('+'), # Subversion "SVN_REPOSITORY": PositionalParser(1), "SVN_REVISION": PositionalParser(1), "SVN_USERNAME": PositionalParser(1), "SVN_PASSWORD": PositionalParser(1), "SVN_TRUST_CERT": PositionalParser(1), # Mercurial "HG_REPOSITORY": PositionalParser(1), "HG_TAG": PositionalParser(1), # CVS "CVS_REPOSITORY": PositionalParser(1), "CVS_MODULE": PositionalParser(1), "CVS_TAG": PositionalParser(1), # Update/Patch Step Options "UPDATE_COMMAND": ShellCommandNode.parse, "UPDATE_DISCONNECTED": PositionalParser(1), "PATCH_COMMAND": ShellCommandNode.parse, # Configure Step Options "CONFIGURE_COMMAND": ShellCommandNode.parse, "CMAKE_COMMAND": PositionalParser(1), "CMAKE_GENERATOR": PositionalParser(1), "CMAKE_GENERATOR_PLATFORM": PositionalParser(1), "CMAKE_GENERATOR_TOOLSET": PositionalParser(1), "CMAKE_GENERATOR_INSTANCE": PositionalParser(1), "CMAKE_ARGS": PositionalParser('+'), "CMAKE_CACHE_ARGS": PositionalParser('+'), "CMAKE_CACHE_DEFAULT_ARGS": PositionalParser('+'), "SOURCE_SUBDIR": PositionalParser(1), # Build Step Options "BUILD_COMMAND": ShellCommandNode.parse, "BUILD_IN_SOURCE": PositionalParser(1), "BUILD_ALWAYS": PositionalParser(1), "BUILD_BYPRODUCTS": PositionalParser('+'), # Install Step Options "INSTALL_COMMAND": ShellCommandNode.parse, # Test Step Options "TEST_COMMAND": ShellCommandNode.parse, "TEST_BEFORE_INSTALL": PositionalParser(1), "TEST_AFTER_INSTALL": PositionalParser(1), "TEST_EXCLUDE_FROM_MAIN": PositionalParser(1), # Output Logging Options "LOG_DOWNLOAD": PositionalParser(1), "LOG_UPDATE": PositionalParser(1), "LOG_PATCH": PositionalParser(1), "LOG_CONFIGURE": PositionalParser(1), "LOG_BUILD": PositionalParser(1), "LOG_INSTALL": PositionalParser(1), "LOG_TEST": PositionalParser(1), "LOG_MERGED_STDOUTERR": PositionalParser(1), "LOG_OUTPUT_ON_FAILURE": PositionalParser(1), # Terminal Access Options "USES_TERMINAL_DOWNLOAD": PositionalParser(1), "USES_TERMINAL_UPDATE": PositionalParser(1), "USES_TERMINAL_CONFIGURE": PositionalParser(1), "USES_TERMINAL_BUILD": PositionalParser(1), "USES_TERMINAL_INSTALL": PositionalParser(1), "USES_TERMINAL_TEST": PositionalParser(1), # Target Options "DEPENDS": PositionalParser('+'), "EXCLUDE_FROM_ALL": PositionalParser(1), "STEP_TARGETS": PositionalParser('+'), "INDEPENDENT_STEP_TARGETS": PositionalParser('+'), # Misc Options "LIST_SEPARATOR": PositionalParser(1), "COMMAND": ShellCommandNode.parse, }, flags=[], breakstack=breakstack)
def parse_install_targets(ctx, 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"]), # Common kwargs "DESTINATION": PositionalParser(1), "PERMISSIONS": PositionalParser('+'), "CONFIGURATIONS": PositionalParser('+'), "COMPONENT": PositionalParser(1), "NAMELINK_COMPONENT": PositionalParser(1), } flags = ( "OPTIONAL", "EXCLUDE_FROM_ALL", "NAMELINK_ONLY", "NAMELINK_SKIP" ) designated_kwargs = ( "ARCHIVE", "LIBRARY", "RUNTIME", "OBJECTS", "FRAMEWORK", "BUNDLE", "PRIVATE_HEADER", "PUBLIC_HEADER", "RESOURCE" ) # NOTE(josh): from here on, code is essentially StandardArgTree.parse(), # except that # we cannot break on the common subset of kwargs in the breakstack because # they are valid kwargs for the subtrees (ARCHIVE, LIBRARY, etc) as well as # the primary tree tree = StandardArgTree() # If it is a whitespace token then put it directly in the parse tree at # the current depth while tokens and tokens[0].type in WHITESPACE_TOKENS: tree.children.append(tokens.pop(0)) continue # ARCHIVE, LIBRARY, RUNTIME, subtrees etc only break on the start of # another subtree, or on "INCLUDES DESTINATION" subtree_breakstack = breakstack + [KwargBreaker( list(designated_kwargs) + ["INCLUDES"] )] # kwargs at this tree depth break on other kwargs or flags kwarg_breakstack = breakstack + [KwargBreaker( list(kwargs.keys()) + list(designated_kwargs) + list(flags) )] # and flags at this depth break only on kwargs positional_breakstack = breakstack + [KwargBreaker( list(kwargs.keys()) + list(designated_kwargs) )] while tokens: # Break if the next token belongs to a parent parser, i.e. if it # matches a keyword argument of something higher in the stack, or if # it closes a parent group. if should_break(tokens[0], breakstack): break # If it is a whitespace token then put it directly in the parse tree at # the current depth if tokens[0].type in WHITESPACE_TOKENS: tree.children.append(tokens.pop(0)) continue # If it's a comment, then add it at the current depth if tokens[0].type in (lex.TokenType.COMMENT, lex.TokenType.BRACKET_COMMENT): child = CommentNode() tree.children.append(child) child.children.append(tokens.pop(0)) continue ntokens = len(tokens) # NOTE(josh): each flag is also stored in kwargs as with a positional parser # of size zero. This is a legacy thing that should be removed, but for now # just make sure we check flags first. word = get_normalized_kwarg(tokens[0]) if word in designated_kwargs: subtree = KeywordGroupNode.parse( ctx, tokens, word, parse_install_targets, subtree_breakstack) elif word in kwargs: subtree = KeywordGroupNode.parse( ctx, tokens, word, kwargs[word], kwarg_breakstack) else: subtree = PositionalGroupNode.parse( ctx, tokens, '+', flags, positional_breakstack) assert len(tokens) < ntokens tree.children.append(subtree) return tree
def parse_add_custom_target(ctx, tokens, breakstack): """ :: add_custom_target(Name [ALL] [command1 [args1...]] [COMMAND command2 [args2...] ...] [DEPENDS depend depend depend ... ] [BYPRODUCTS [files...]] [WORKING_DIRECTORY dir] [COMMENT comment] [JOB_POOL job_pool] [VERBATIM] [USES_TERMINAL] [COMMAND_EXPAND_LISTS] [SOURCES src1 [src2...]]) :see: https://cmake.org/cmake/help/latest/command/add_custom_target.html """ kwargs = { "BYPRODUCTS": PositionalParser("+"), "COMMAND": ShellCommandNode.parse, "COMMENT": PositionalParser(1), "DEPENDS": PositionalParser("+"), "JOB_POOL": PositionalParser(1), "SOURCES": PositionalParser("+"), "WORKING_DIRECTORY": PositionalParser(1), } required_kwargs = { # Required by convention "COMMENT": "C0113" } flags = ("VERBATIM", "USES_TERMINAL", "COMMAND_EXPAND_LISTS") tree = ArgGroupNode() # If it is a whitespace token then put it directly in the parse tree at # the current depth while tokens and tokens[0].type in WHITESPACE_TOKENS: tree.children.append(tokens.pop(0)) continue breaker = KwargBreaker(list(kwargs.keys()) + list(flags)) child_breakstack = breakstack + [breaker] nametree = None state = "name" while tokens: # Break if the next token belongs to a parent parser, i.e. if it # matches a keyword argument of something higher in the stack, or if # it closes a parent group. if should_break(tokens[0], breakstack): break # If it is a whitespace token then put it directly in the parse tree at # the current depth if tokens[0].type in WHITESPACE_TOKENS: tree.children.append(tokens.pop(0)) continue # If it's a comment, then add it at the current depth if tokens[0].type in (TokenType.COMMENT, TokenType.BRACKET_COMMENT): child = TreeNode(NodeType.COMMENT) tree.children.append(child) child.children.append(tokens.pop(0)) continue ntokens = len(tokens) if state == "name": next_semantic = get_first_semantic_token(tokens[1:]) if (next_semantic is not None and get_normalized_kwarg(next_semantic) == "ALL"): npargs = 2 else: npargs = 1 nametree = PositionalGroupNode.parse(ctx, tokens, npargs, ["ALL"], child_breakstack) assert len(tokens) < ntokens tree.children.append(nametree) state = "first-command" continue word = get_normalized_kwarg(tokens[0]) if state == "first-command": if not (word in kwargs or word in flags): subtree = PositionalGroupNode.parse(ctx, tokens, '+', [], child_breakstack) tree.children.append(subtree) assert len(tokens) < ntokens state = "kwargs" continue if word in flags: subtree = FlagGroupNode.parse( ctx, tokens, flags, breakstack + [KwargBreaker(list(kwargs.keys()))]) assert len(tokens) < ntokens tree.children.append(subtree) continue if word in kwargs: required_kwargs.pop(word, None) subtree = KeywordGroupNode.parse(ctx, tokens, word, kwargs[word], child_breakstack) assert len(tokens) < ntokens tree.children.append(subtree) continue ctx.lint_ctx.record_lint("E1122", location=tokens[0].get_location()) # logger.warning( # "Unexpected positional argument %s at %s", # tokens[0].spelling, tokens[0].location()) subtree = PositionalGroupNode.parse(ctx, tokens, '+', [], child_breakstack) assert len(tokens) < ntokens tree.children.append(subtree) continue if required_kwargs: location = () for token in tree.get_semantic_tokens(): location = token.get_location() break missing_kwargs = sorted( (lintid, word) for word, lintid in sorted(required_kwargs.items())) for lintid, word in missing_kwargs: ctx.lint_ctx.record_lint(lintid, word, location=location) return tree