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