<html devsite>
<head>
  <meta name="project_path" value="/_project.yaml">
  <meta name="book_path" value="/versions/7.0.0/_book.yaml">
</head>
<body>

<h1 class="page-title" id="modules.XcodeVersionConfig">XcodeVersionConfig</h1>

{% dynamic setvar source_file "src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodeConfigInfoApi.java" %}
{% dynamic setvar version "7.0.0" %}
{% dynamic setvar original_path "/rules/lib/providers/XcodeVersionConfig" %}
{% include "_buttons.html" %}
<!-- {% raw %} -->

The set of Apple versions computed from command line options and the xcode_config rule.

<h2>Members</h2>
<ul>
    <li>
    <a href="#XcodeVersionConfig">XcodeVersionConfig</a>
  </li>
      <li>
    <a href="#availability">availability</a>
  </li>
      <li>
    <a href="#execution_info">execution_info</a>
  </li>
      <li>
    <a href="#minimum_os_for_platform_type">minimum_os_for_platform_type</a>
  </li>
      <li>
    <a href="#sdk_version_for_platform">sdk_version_for_platform</a>
  </li>
      <li>
    <a href="#to_json">to_json</a>
  </li>
      <li>
    <a href="#to_proto">to_proto</a>
  </li>
      <li>
    <a href="#xcode_version">xcode_version</a>
  </li>
  </ul>

      <h2 id="XcodeVersionConfig">XcodeVersionConfig</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../providers/XcodeVersionConfig.html">XcodeVersionConfig</a> XcodeVersionConfig(iosSdkVersion, iosMinimumOsVersion, visionosSdkVersion, visionosMinimumOsVersion, watchosSdkVersion, watchosMinimumOsVersion, tvosSdkVersion, tvosMinimumOsVersion, macosSdkVersion, macosMinimumOsVersion, xcodeVersion)</pre></p>

    Returns the Xcode info that is associated with this target

          <!-- hide-from-toc is a class used by DevSite for the public Bazel site
      (https://developers.google.com/devsite/reference/styles/headings#hide_headings_from_the_toc) -->
      <h3 class="hide-from-toc">Parameters</h3>
      <table class="table table-bordered table-condensed table-params">
        <colgroup>
          <col class="col-param">
          <col class="param-description">
        </colgroup>
        <thead>
          <tr>
            <th>Parameter</th>
            <th>Description</th>
          </tr>
        </thead>
        <tbody>
                  <tr>
            <td id="XcodeVersionConfig.iosSdkVersion">
              <code>iosSdkVersion</code>
            </td>
            <td>
                                     required<br/>
                          The ios SDK version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.iosMinimumOsVersion">
              <code>iosMinimumOsVersion</code>
            </td>
            <td>
                                     required<br/>
                          The ios minimum os version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.visionosSdkVersion">
              <code>visionosSdkVersion</code>
            </td>
            <td>
                                     required<br/>
                          The visionOS SDK version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.visionosMinimumOsVersion">
              <code>visionosMinimumOsVersion</code>
            </td>
            <td>
                                     required<br/>
                          The visionOS minimum os version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.watchosSdkVersion">
              <code>watchosSdkVersion</code>
            </td>
            <td>
                                     required<br/>
                          The watchos SDK version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.watchosMinimumOsVersion">
              <code>watchosMinimumOsVersion</code>
            </td>
            <td>
                                     required<br/>
                          The watchos minimum os version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.tvosSdkVersion">
              <code>tvosSdkVersion</code>
            </td>
            <td>
                                     required<br/>
                          The tvos SDK version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.tvosMinimumOsVersion">
              <code>tvosMinimumOsVersion</code>
            </td>
            <td>
                                     required<br/>
                          The tvos minimum os version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.macosSdkVersion">
              <code>macosSdkVersion</code>
            </td>
            <td>
                                     required<br/>
                          The macos SDK version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.macosMinimumOsVersion">
              <code>macosMinimumOsVersion</code>
            </td>
            <td>
                                     required<br/>
                          The macos minimum os version.
            </td>
          </tr>
                  <tr>
            <td id="XcodeVersionConfig.xcodeVersion">
              <code>xcodeVersion</code>
            </td>
            <td>
                                     required<br/>
                          The selected Xcode version from this config.
            </td>
          </tr>
                </tbody>
      </table>

        <h2 id="availability">availability</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/string.html">string</a> XcodeVersionConfig.availability()</pre></p>

    Returns the availability of this Xcode version, 'remote' if the version is only available remotely, 'local' if the version is only available locally, 'both' if the version is available both locally and remotely, or 'unknown' if the availability could not be determined.


        <h2 id="execution_info">execution_info</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/dict.html">dict</a> XcodeVersionConfig.execution_info()</pre></p>

    Returns the execution requirements for actions that use this Xcode config.


        <h2 id="minimum_os_for_platform_type">minimum_os_for_platform_type</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/DottedVersion.html">DottedVersion</a> XcodeVersionConfig.minimum_os_for_platform_type(platform_type)</pre></p>

    The minimum compatible OS version for target simulator and devices for a particular platform type.

          <!-- hide-from-toc is a class used by DevSite for the public Bazel site
      (https://developers.google.com/devsite/reference/styles/headings#hide_headings_from_the_toc) -->
      <h3 class="hide-from-toc">Parameters</h3>
      <table class="table table-bordered table-condensed table-params">
        <colgroup>
          <col class="col-param">
          <col class="param-description">
        </colgroup>
        <thead>
          <tr>
            <th>Parameter</th>
            <th>Description</th>
          </tr>
        </thead>
        <tbody>
                  <tr>
            <td id="minimum_os_for_platform_type.platform_type">
              <code>platform_type</code>
            </td>
            <td>
                                     required<br/>
                          The apple platform type.
            </td>
          </tr>
                </tbody>
      </table>

        <h2 id="sdk_version_for_platform">sdk_version_for_platform</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/DottedVersion.html">DottedVersion</a> XcodeVersionConfig.sdk_version_for_platform(platform)</pre></p>

    The version of the platform SDK that will be used to build targets for the given platform.

          <!-- hide-from-toc is a class used by DevSite for the public Bazel site
      (https://developers.google.com/devsite/reference/styles/headings#hide_headings_from_the_toc) -->
      <h3 class="hide-from-toc">Parameters</h3>
      <table class="table table-bordered table-condensed table-params">
        <colgroup>
          <col class="col-param">
          <col class="param-description">
        </colgroup>
        <thead>
          <tr>
            <th>Parameter</th>
            <th>Description</th>
          </tr>
        </thead>
        <tbody>
                  <tr>
            <td id="sdk_version_for_platform.platform">
              <code>platform</code>
            </td>
            <td>
                                     required<br/>
                          The apple platform.
            </td>
          </tr>
                </tbody>
      </table>

        <h2 id="to_json">to_json</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/string.html">string</a> XcodeVersionConfig.to_json()</pre></p>

    <b>Deprecated</b>. This API is deprecated and will be removed soon. Please do not depend on it. It is <i>disabled</i> with <code>---incompatible_struct_has_no_methods</code>. Use this flag to verify your code is compatible with its imminent removal. <br>Creates a JSON string from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs, a list of these types or a dictionary with string keys and values of these types. Quotes and new lines in strings are escaped. Examples:<br><pre class=language-python>struct(key=123).to_json()
# {"key":123}

struct(key=True).to_json()
# {"key":true}

struct(key=[1, 2, 3]).to_json()
# {"key":[1,2,3]}

struct(key='text').to_json()
# {"key":"text"}

struct(key=struct(inner_key='text')).to_json()
# {"key":{"inner_key":"text"}}

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_json()
# {"key":[{"inner_key":1},{"inner_key":2}]}

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_json()
# {"key":{"inner_key":{"inner_inner_key":"text"}}}
</pre>.<p>Deprecated: instead, use json.encode(x) or json.encode_indent(x), which work for values other than structs and do not pollute the struct field namespace.


        <h2 id="to_proto">to_proto</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/string.html">string</a> XcodeVersionConfig.to_proto()</pre></p>

    <b>Deprecated</b>. This API is deprecated and will be removed soon. Please do not depend on it. It is <i>disabled</i> with <code>---incompatible_struct_has_no_methods</code>. Use this flag to verify your code is compatible with its imminent removal. <br>Creates a text message from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs or dicts or lists of these types. Quotes and new lines in strings are escaped. Struct keys are iterated in the sorted order. Examples:<br><pre class=language-python>struct(key=123).to_proto()
# key: 123

struct(key=True).to_proto()
# key: true

struct(key=[1, 2, 3]).to_proto()
# key: 1
# key: 2
# key: 3

struct(key='text').to_proto()
# key: "text"

struct(key=struct(inner_key='text')).to_proto()
# key {
#   inner_key: "text"
# }

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_proto()
# key {
#   inner_key: 1
# }
# key {
#   inner_key: 2
# }

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_proto()
# key {
#    inner_key {
#     inner_inner_key: "text"
#   }
# }

struct(foo={4: 3, 2: 1}).to_proto()
# foo: {
#   key: 4
#   value: 3
# }
# foo: {
#   key: 2
#   value: 1
# }
</pre><p>Deprecated: use proto.encode_text(x) instead.


        <h2 id="xcode_version">xcode_version</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/DottedVersion.html">DottedVersion</a> XcodeVersionConfig.xcode_version()</pre></p>

    Returns the Xcode version that is being used to build.<p>This will return <code>None</code> if no Xcode versions are available.

         May return <code>None</code>.


</body>
</html>

<!-- {% endraw %} -->
