Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)
Example #6
0
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)
Example #7
0
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)
Example #8
0
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)
Example #9
0
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)
Example #10
0
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)
Example #11
0
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)
Example #12
0
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)
Example #13
0
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)
Example #14
0
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)
Example #15
0
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)
Example #16
0
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)
Example #17
0
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)
Example #18
0
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)
Example #19
0
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)
Example #20
0
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)
Example #21
0
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)
Example #22
0
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)
Example #23
0
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)
Example #24
0
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)
Example #25
0
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)
Example #26
0
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)
Example #27
0
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)
Example #28
0
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)
Example #29
0
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)
Example #30
0
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)