def parse_get_filename_component(ctx, tokens, breakstack): """ :: get_filename_component(<VAR> <FileName> <COMP> [CACHE]) get_filename_component(<VAR> FileName PROGRAM [PROGRAM_ARGS <ARG_VAR>] [CACHE]) :see: https://cmake.org/cmake/help/latest/command/get_filename_component.html """ descriminator = get_nth_semantic_token(tokens, 2) if descriminator is not None and descriminator.spelling.upper( ) == "PROGRAM": flags = ["PROGRAM", "PROGRAM_ARGS", "CACHE"] return StandardArgTree.parse(ctx, tokens, "3+", {}, flags, breakstack) flags = [ "DIRECTORY", "NAME", "EXT", "NAME_WE", "ABSOLUTE", "REALPATH", "PATH", ] return StandardArgTree.parse(ctx, tokens, "3+", {}, flags, breakstack)
def parse_source_group(ctx, tokens, breakstack): """ :: source_group(<name> [FILES <src>...] [REGULAR_EXPRESSION <regex>]) source_group(TREE <root> [PREFIX <prefix>] [FILES <src>...]) source_group(<name> <regex>) :see: https://cmake.org/cmake/help/latest/command/source_group.html """ descriminator = get_nth_semantic_token(tokens, 0) if descriminator is not None and descriminator.spelling.upper() == "TREE": kwargs = { "PREFIX": PositionalParser(1), "FILES": PositionalParser("+") } return StandardArgTree.parse(ctx, tokens, 2, kwargs, [], breakstack) kwargs = { "FILES": PositionalParser("+"), "REGULAR_EXPRESSION": PositionalParser(1) } descriminator = get_nth_semantic_token(tokens, 1) if descriminator is not None and descriminator.spelling.upper( ) not in kwargs: return StandardArgTree.parse(ctx, tokens, 2, {}, [], breakstack) return StandardArgTree.parse(ctx, tokens, 1, kwargs, [], breakstack)
def parse_build_command(ctx, tokens, breakstack): """ :: build_command(<variable> [CONFIGURATION <config>] [TARGET <target>] [PROJECT_NAME <projname>] # legacy, causes warning ) :see: https://cmake.org/cmake/help/latest/command/build_command.html """ kwargs = { "CONFIGURATION": PositionalParser(1), "TARGET": PositionalParser(1), "PROJECT_NAME": PositionalParser(1) } second_token = get_nth_semantic_token(tokens, 1) if second_token is not None and second_token.spelling.upper not in kwargs: ctx.lint_ctx.record_lint( "W0106", "build_command(<cachevariable> <makecommand>)", location=tokens[0].get_location()) return StandardArgTree.parse(ctx, tokens, "2", {}, [], breakstack) return StandardArgTree.parse(ctx, tokens, "1", kwargs, [], breakstack)
def parse_ctest_sleep(ctx, tokens, breakstack): """ :: ctest_sleep(<seconds>) ctest_sleep(<time1> <duration> <time2>) :see: https://cmake.org/cmake/help/latest/command/ctest_sleep.html """ semantic_tokens = list(iter_semantic_tokens(tokens)) if len(semantic_tokens) == 1: return StandardArgTree.parse(ctx, tokens, 1, {}, [], breakstack) return StandardArgTree.parse(ctx, tokens, 3, {}, [], breakstack)
def parse_file_lock(ctx, 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 StandardArgTree.parse(ctx, 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_install_files(ctx, 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 StandardArgTree.parse( ctx, 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_ctest_build(ctx, tokens, breakstack): """ :: ctest_build([BUILD <build-dir>] [APPEND] [CONFIGURATION <config>] [FLAGS <flags>] [PROJECT_NAME <project-name>] [TARGET <target-name>] [NUMBER_ERRORS <num-err-var>] [NUMBER_WARNINGS <num-warn-var>] [RETURN_VALUE <result-var>] [CAPTURE_CMAKE_ERROR <result-var>] ) :see: https://cmake.org/cmake/help/latest/command/ctest_build.html """ kwargs = { "BUILD": PositionalParser(1), "CONFIGURATION": PositionalParser(1), "FLAGS": PositionalParser(1), "PROJECT_NAME": PositionalParser(1), "TARGET": PositionalParser(1), "NUMBER_ERRORS": PositionalParser(1), "NUMBER_WARNINGS": PositionalParser(1), "RETURN_VALUE": PositionalParser(1), "CAPTURE_CMAKE_ERROR": PositionalParser(1) } return StandardArgTree.parse(ctx, tokens, "+", kwargs, ["APPEND"], 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_ctest_submit(ctx, tokens, breakstack): """ :: ctest_submit([PARTS <part>...] [FILES <file>...] [SUBMIT_URL <url>] [BUILD_ID <result-var>] [HTTPHEADER <header>] [RETRY_COUNT <count>] [RETRY_DELAY <delay>] [RETURN_VALUE <result-var>] [CAPTURE_CMAKE_ERROR <result-var>] [QUIET] ) :see: https://cmake.org/cmake/help/latest/command/ctest_submit.html """ kwargs = { "PARTS": PositionalParser("+"), "FILES": PositionalParser("+"), "SUBMIT_URL": PositionalParser(1), "BUILD_ID": PositionalParser(1), "HTTPHEADER": PositionalParser(1), "RETRY_COUNT": PositionalParser(1), "RETRY_DELAY": PositionalParser(1), "RETURN_VALUE": PositionalParser(1), "CAPTURE_CMAKE_ERROR": PositionalParser(1), } flags = ["QUIET"] return StandardArgTree.parse(ctx, tokens, "+", kwargs, flags, breakstack)
def parse_fetchcontent_declare(ctx, tokens, breakstack): """ :: FetchContent_Declare(<name> <contentOptions>...) :see: https://cmake.org/cmake/help/v3.14/module/FetchContent.html?highlight=fetchcontent#command:fetchcontent_declare """ return StandardArgTree.parse( ctx, tokens, npargs=1, kwargs={ # 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, }, flags=[], breakstack=breakstack)
def parse_ctest_empty_binary_directory(ctx, tokens, breakstack): """ :: ctest_empty_binary_directory( directory ) :see: https://cmake.org/cmake/help/latest/command/ctest_empty_binary_directory.html """ return StandardArgTree.parse(ctx, tokens, 1, {}, [], breakstack)
def parse_variable_watch(ctx, tokens, breakstack): """ :: variable_watch(<variable> [<command>]) :see: https://cmake.org/cmake/help/latest/command/variable_watch.html """ return StandardArgTree.parse(ctx, tokens, "+", {}, [], breakstack)
def parse_add_compile_options(ctx, tokens, breakstack): """ :: add_compile_options(<option> ...) :see: https://cmake.org/cmake/help/latest/command/add_compile_options.html """ return StandardArgTree.parse(ctx, tokens, "+", {}, [], breakstack)
def parse_include_guard(ctx, tokens, breakstack): """ :: include_guard([DIRECTORY|GLOBAL]) :see: https://cmake.org/cmake/help/latest/command/include_guard.html """ return StandardArgTree.parse(ctx, tokens, "*", {}, [], breakstack)
def parse_export_library_dependencies(ctx, tokens, breakstack): """ :: export_library_dependencies(<file> [APPEND]) :see: https://cmake.org/cmake/help/latest/command/export_library_dependencies.html """ return StandardArgTree.parse(ctx, tokens, "1+", {}, ["APPEND"], breakstack)
def parse_remove(ctx, tokens, breakstack): """ :: remove(VAR VALUE VALUE ...) :see: https://cmake.org/cmake/help/latest/command/remove.html """ return StandardArgTree.parse(ctx, tokens, "2+", {}, [], breakstack)
def parse_ctest_read_custom_files(ctx, tokens, breakstack): """ :: ctest_read_custom_files( directory ... ) :see: https://cmake.org/cmake/help/latest/command/ctest_read_custom_files.html """ return StandardArgTree.parse(ctx, tokens, "+", {}, [], breakstack)
def parse_site_name(ctx, tokens, breakstack): """ :: site_name(variable) :see: https://cmake.org/cmake/help/latest/command/site_name.html """ return StandardArgTree.parse(ctx, tokens, 1, {}, [], breakstack)
def parse_subdir_depends(ctx, tokens, breakstack): """ :: subdir_depends(subdir dep1 dep2 ...) :see: https://cmake.org/cmake/help/latest/command/subdir_depends.html """ return StandardArgTree.parse(ctx, tokens, "2+", {}, [], breakstack)
def parse_cmake_parse_arguments(ctx, tokens, breakstack): """ :: cmake_parse_arguments(<prefix> <options> <one_value_keywords> <multi_value_keywords> <args>...) cmake_parse_arguments(PARSE_ARGV <N> <prefix> <options> <one_value_keywords> <multi_value_keywords>) :see: https://cmake.org/cmake/help/latest/command/cmake_parse_arguments.html """ first_token = get_nth_semantic_token(tokens, 0) if first_token is not None and first_token.spelling.upper == "PARSE_ARGV": return StandardArgTree.parse(ctx, tokens, "6", {}, ["PARSE_ARGV"], breakstack) return StandardArgTree.parse(ctx, tokens, "5+", {}, [], breakstack)
def parse_qt_wrap_cpp(ctx, tokens, breakstack): """ :: qt_wrap_cpp(resultingLibraryName DestName SourceLists ...) :see: https://cmake.org/cmake/help/latest/command/qt_wrap_cpp.html """ return StandardArgTree.parse(ctx, tokens, "3+", {}, [], breakstack)
def parse_remove_definitions(ctx, tokens, breakstack): """ :: remove_definitions(-DFOO -DBAR ...) :see: https://cmake.org/cmake/help/latest/command/remove_definitions.html """ return StandardArgTree.parse(ctx, tokens, "+", {}, [], breakstack)
def parse_option(ctx, tokens, breakstack): """ :: option(<variable> "<help_text>" [value]) :see: https://cmake.org/cmake/help/latest/command/option.html """ return StandardArgTree.parse(ctx, tokens, "2+", {}, [], breakstack)
def parse_output_required_files(ctx, tokens, breakstack): """ :: output_required_files(srcfile outputfile) :see: https://cmake.org/cmake/help/latest/command/output_required_files.html """ return StandardArgTree.parse(ctx, tokens, 2, {}, [], breakstack)
def parse_include_regular_expression(ctx, tokens, breakstack): """ :: include_regular_expression(regex_match [regex_complain]) :see: https://cmake.org/cmake/help/latest/command/include_regular_expression.html """ return StandardArgTree.parse(ctx, tokens, "*", {}, [], breakstack)
def parse_write_file(ctx, tokens, breakstack): """ :: write_file(filename "message to write"... [APPEND]) :see: https://cmake.org/cmake/help/latest/command/write_file.html """ return StandardArgTree.parse(ctx, tokens, "2+", {}, ["APPEND"], breakstack)
def parse_get_test_property(ctx, tokens, breakstack): """ :: get_test_property(test property VAR) :see: https://cmake.org/cmake/help/latest/command/get_test_property.html """ return StandardArgTree.parse(ctx, tokens, 3, {}, [], breakstack)
def parse_use_mangled_mesa(ctx, tokens, breakstack): """ :: use_mangled_mesa(PATH_TO_MESA OUTPUT_DIRECTORY) :see: https://cmake.org/cmake/help/latest/command/use_mangled_mesa.html """ return StandardArgTree.parse(ctx, tokens, 2, {}, [], breakstack)
def parse_add_library(ctx, 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 StandardArgTree.parse(ctx, 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](ctx, 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(ctx, 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(ctx, tokens, breakstack, sortable)
def parse_separate_arguments(ctx, tokens, breakstack): """ :: separate_arguments(<variable> <mode> <args>) :see: https://cmake.org/cmake/help/latest/command/separate_arguments.html """ flags = ["UNIX_COMMAND", "WINDOWS_COMMAND", "NATIVE_COMMAND"] return StandardArgTree.parse(ctx, tokens, 3, {}, flags, breakstack)