lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 1 | # Copyright 2017 The Bazel Authors. All rights reserved. |
| 2 | # |
| 3 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | # you may not use this file except in compliance with the License. |
| 5 | # You may obtain a copy of the License at |
| 6 | # |
| 7 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | # |
| 9 | # Unless required by applicable law or agreed to in writing, software |
| 10 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | # See the License for the specific language governing permissions and |
| 13 | # limitations under the License. |
| 14 | |
| 15 | """Rules that allows select() to differentiate between Apple OS versions.""" |
| 16 | |
lberki | dc8b43c | 2017-10-19 19:58:04 +0200 | [diff] [blame] | 17 | def _strip_version(version): |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 18 | """Strip trailing characters that aren't digits or '.' from version names. |
lberki | dc8b43c | 2017-10-19 19:58:04 +0200 | [diff] [blame] | 19 | |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 20 | Some OS versions look like "9.0gm", which is not useful for select() |
| 21 | statements. Thus, we strip the trailing "gm" part. |
lberki | dc8b43c | 2017-10-19 19:58:04 +0200 | [diff] [blame] | 22 | |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 23 | Args: |
| 24 | version: the version string |
lberki | dc8b43c | 2017-10-19 19:58:04 +0200 | [diff] [blame] | 25 | |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 26 | Returns: |
| 27 | The version with trailing letters stripped. |
| 28 | """ |
| 29 | result = "" |
cushon | 2d4917c | 2018-07-06 03:19:54 -0700 | [diff] [blame] | 30 | string = str(version) |
| 31 | for i in range(len(string)): |
| 32 | ch = string[i] |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 33 | if not ch.isdigit() and ch != ".": |
| 34 | break |
lberki | dc8b43c | 2017-10-19 19:58:04 +0200 | [diff] [blame] | 35 | |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 36 | result += ch |
lberki | dc8b43c | 2017-10-19 19:58:04 +0200 | [diff] [blame] | 37 | |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 38 | return result |
lberki | dc8b43c | 2017-10-19 19:58:04 +0200 | [diff] [blame] | 39 | |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 40 | def _xcode_version_flag_impl(ctx): |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 41 | """A rule that allows select() to differentiate between Xcode versions.""" |
| 42 | xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig] |
cparsons | 3f87a95 | 2019-04-19 12:13:36 -0700 | [diff] [blame] | 43 | return config_common.FeatureFlagInfo(value = _strip_version( |
| 44 | xcode_config.xcode_version(), |
| 45 | )) |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 46 | |
| 47 | def _ios_sdk_version_flag_impl(ctx): |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 48 | """A rule that allows select() to select based on the iOS SDK version.""" |
| 49 | xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig] |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 50 | |
cparsons | 3f87a95 | 2019-04-19 12:13:36 -0700 | [diff] [blame] | 51 | return config_common.FeatureFlagInfo(value = _strip_version( |
| 52 | xcode_config.sdk_version_for_platform( |
| 53 | apple_common.platform.ios_device, |
| 54 | ), |
| 55 | )) |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 56 | |
| 57 | def _tvos_sdk_version_flag_impl(ctx): |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 58 | """A rule that allows select() to select based on the tvOS SDK version.""" |
| 59 | xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig] |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 60 | |
cparsons | 3f87a95 | 2019-04-19 12:13:36 -0700 | [diff] [blame] | 61 | return config_common.FeatureFlagInfo(value = _strip_version( |
| 62 | xcode_config.sdk_version_for_platform( |
| 63 | apple_common.platform.tvos_device, |
| 64 | ), |
| 65 | )) |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 66 | |
| 67 | def _watchos_sdk_version_flag_impl(ctx): |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 68 | """A rule that allows select() to select based on the watchOS SDK version.""" |
| 69 | xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig] |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 70 | |
cparsons | 3f87a95 | 2019-04-19 12:13:36 -0700 | [diff] [blame] | 71 | return config_common.FeatureFlagInfo(value = _strip_version( |
| 72 | xcode_config.sdk_version_for_platform( |
| 73 | apple_common.platform.watchos_device, |
| 74 | ), |
| 75 | )) |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 76 | |
| 77 | def _macos_sdk_version_flag_impl(ctx): |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 78 | """A rule that allows select() to select based on the macOS SDK version.""" |
| 79 | xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig] |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 80 | |
cparsons | 3f87a95 | 2019-04-19 12:13:36 -0700 | [diff] [blame] | 81 | return config_common.FeatureFlagInfo(value = _strip_version( |
| 82 | xcode_config.sdk_version_for_platform( |
| 83 | apple_common.platform.macos, |
| 84 | ), |
| 85 | )) |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 86 | |
| 87 | xcode_version_flag = rule( |
| 88 | implementation = _xcode_version_flag_impl, |
| 89 | attrs = { |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 90 | "_xcode_config": attr.label(default = configuration_field( |
| 91 | fragment = "apple", |
| 92 | name = "xcode_config_label", |
| 93 | )), |
| 94 | }, |
| 95 | ) |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 96 | |
| 97 | ios_sdk_version_flag = rule( |
| 98 | implementation = _ios_sdk_version_flag_impl, |
| 99 | attrs = { |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 100 | "_xcode_config": attr.label(default = configuration_field( |
| 101 | fragment = "apple", |
| 102 | name = "xcode_config_label", |
| 103 | )), |
| 104 | }, |
| 105 | ) |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 106 | |
| 107 | tvos_sdk_version_flag = rule( |
| 108 | implementation = _tvos_sdk_version_flag_impl, |
| 109 | attrs = { |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 110 | "_xcode_config": attr.label(default = configuration_field( |
| 111 | fragment = "apple", |
| 112 | name = "xcode_config_label", |
| 113 | )), |
| 114 | }, |
| 115 | ) |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 116 | |
| 117 | watchos_sdk_version_flag = rule( |
| 118 | implementation = _watchos_sdk_version_flag_impl, |
| 119 | attrs = { |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 120 | "_xcode_config": attr.label(default = configuration_field( |
| 121 | fragment = "apple", |
| 122 | name = "xcode_config_label", |
| 123 | )), |
| 124 | }, |
| 125 | ) |
lberki | 57a2ad7 | 2017-10-18 09:30:09 +0200 | [diff] [blame] | 126 | |
| 127 | macos_sdk_version_flag = rule( |
| 128 | implementation = _macos_sdk_version_flag_impl, |
| 129 | attrs = { |
vladmos | 20a042f | 2018-06-01 04:51:21 -0700 | [diff] [blame] | 130 | "_xcode_config": attr.label(default = configuration_field( |
| 131 | fragment = "apple", |
| 132 | name = "xcode_config_label", |
| 133 | )), |
| 134 | }, |
| 135 | ) |