---
title: 'XcodeVersionConfig'
---

The set of Apple versions computed from command line options and the xcode\_config rule.

## Members

* [XcodeVersionConfig](#XcodeVersionConfig)
* [availability](#availability)
* [execution\_info](#execution_info)
* [minimum\_os\_for\_platform\_type](#minimum_os_for_platform_type)
* [sdk\_version\_for\_platform](#sdk_version_for_platform)
* [to\_json](#to_json)
* [to\_proto](#to_proto)
* [xcode\_version](#xcode_version)

## XcodeVersionConfig

```
XcodeVersionConfig XcodeVersionConfig(iosSdkVersion, iosMinimumOsVersion, visionosSdkVersion, visionosMinimumOsVersion, watchosSdkVersion, watchosMinimumOsVersion, tvosSdkVersion, tvosMinimumOsVersion, macosSdkVersion, macosMinimumOsVersion, xcodeVersion)
```

Returns the Xcode info that is associated with this target

### Parameters

| Parameter | Description |
| --- | --- |
| `iosSdkVersion` | required  The ios SDK version. |
| `iosMinimumOsVersion` | required  The ios minimum os version. |
| `visionosSdkVersion` | required  The visionOS SDK version. |
| `visionosMinimumOsVersion` | required  The visionOS minimum os version. |
| `watchosSdkVersion` | required  The watchos SDK version. |
| `watchosMinimumOsVersion` | required  The watchos minimum os version. |
| `tvosSdkVersion` | required  The tvos SDK version. |
| `tvosMinimumOsVersion` | required  The tvos minimum os version. |
| `macosSdkVersion` | required  The macos SDK version. |
| `macosMinimumOsVersion` | required  The macos minimum os version. |
| `xcodeVersion` | required  The selected Xcode version from this config. |

## availability

```
string XcodeVersionConfig.availability()
```

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.

## execution\_info

```
dict XcodeVersionConfig.execution_info()
```

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

## minimum\_os\_for\_platform\_type

```
DottedVersion XcodeVersionConfig.minimum_os_for_platform_type(platform_type)
```

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

### Parameters

| Parameter | Description |
| --- | --- |
| `platform_type` | required  The apple platform type. |

## sdk\_version\_for\_platform

```
DottedVersion XcodeVersionConfig.sdk_version_for_platform(platform)
```

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

### Parameters

| Parameter | Description |
| --- | --- |
| `platform` | required  The apple platform. |

## to\_json

```
string XcodeVersionConfig.to_json()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
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:

```
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"}}}
```

.

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.

## to\_proto

```
string XcodeVersionConfig.to_proto()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
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:

```
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
# }
```

Deprecated: use proto.encode\_text(x) instead.

## xcode\_version

```
DottedVersion XcodeVersionConfig.xcode_version()
```

Returns the Xcode version that is being used to build.

This will return `None` if no Xcode versions are available.
May return `None`.