| # Copyright 2018 The Tulsi Authors. All rights reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| # | |
| # | |
| # Generated by Tulsi to resolve flags during builds. | |
| import sys | |
| def _StandardizeTargetLabel(label): | |
| """Convert labels of form //dir/target to //dir/target:target.""" | |
| if label is None: | |
| return label | |
| if not label.startswith('//') and not label.startswith('@'): | |
| sys.stderr.write('[WARNING] Target label "{0}" is not fully qualified. ' | |
| 'Labels should start with "@" or "//".\n\n'.format(label)) | |
| sys.stderr.flush() | |
| tokens = label.rsplit('/', 1) | |
| if len(tokens) <= 1: | |
| return label | |
| target_base = tokens[0] | |
| target = tokens[1] | |
| if '...' in target or ':' in target: | |
| return label | |
| return label + ':' + target | |
| class BazelFlags(object): | |
| """Represents Bazel flags.""" | |
| def __init__(self, startup = [], build = []): | |
| self.startup = startup | |
| self.build = build | |
| class BazelFlagsSet(object): | |
| """Represents a set of Bazel flags which can vary by compilation mode.""" | |
| def __init__(self, debug = None, release = None, flags = None): | |
| if debug is None: | |
| debug = flags or BazelFlags() | |
| if release is None: | |
| release = flags or BazelFlags() | |
| self.debug = debug | |
| self.release = release | |
| def flags(self, is_debug): | |
| """Returns the proper flags (either debug or release).""" | |
| return self.debug if is_debug else self.release | |
| class BazelBuildSettings(object): | |
| """Represents a Tulsi project's Bazel settings.""" | |
| def __init__(self, bazel, bazelExecRoot, | |
| defaultPlatformConfigId, platformConfigFlags, | |
| swiftTargets, | |
| cacheAffecting, cacheSafe, | |
| swiftOnly, nonSwiftOnly, | |
| swiftFeatures, nonSwiftFeatures, | |
| projDefault, projTargetMap): | |
| self.bazel = bazel | |
| self.bazelExecRoot = bazelExecRoot | |
| self.defaultPlatformConfigId = defaultPlatformConfigId | |
| self.platformConfigFlags = platformConfigFlags | |
| self.swiftTargets = swiftTargets | |
| self.cacheAffecting = cacheAffecting | |
| self.cacheSafe = cacheSafe | |
| self.swiftOnly = swiftOnly | |
| self.nonSwiftOnly = nonSwiftOnly | |
| self.swiftFeatures = swiftFeatures | |
| self.nonSwiftFeatures = nonSwiftFeatures | |
| self.projDefault = projDefault | |
| self.projTargetMap = projTargetMap | |
| def features_for_target(self, target, is_swift_override=None): | |
| """Returns an array of enabled features for the given target.""" | |
| target = _StandardizeTargetLabel(target) | |
| is_swift = target in self.swiftTargets | |
| if is_swift_override is not None: | |
| is_swift = is_swift_override | |
| return self.swiftFeatures if is_swift else self.nonSwiftFeatures | |
| def flags_for_target(self, target, is_debug, | |
| config, is_swift_override=None): | |
| """Returns (bazel, startup flags, build flags) for the given target.""" | |
| target = _StandardizeTargetLabel(target) | |
| target_flag_set = self.projTargetMap.get(target) | |
| if not target_flag_set: | |
| target_flag_set = self.projDefault | |
| is_swift = target in self.swiftTargets | |
| if is_swift_override is not None: | |
| is_swift = is_swift_override | |
| lang = self.swiftOnly if is_swift else self.nonSwiftOnly | |
| config_flags = self.platformConfigFlags[config] | |
| cache_affecting = self.cacheAffecting.flags(is_debug) | |
| cache_safe = self.cacheSafe.flags(is_debug) | |
| target = target_flag_set.flags(is_debug) | |
| lang = lang.flags(is_debug) | |
| startupFlags = [] | |
| startupFlags.extend(target.startup) | |
| startupFlags.extend(cache_safe.startup) | |
| startupFlags.extend(cache_affecting.startup) | |
| startupFlags.extend(lang.startup) | |
| buildFlags = [] | |
| buildFlags.extend(target.build) | |
| buildFlags.extend(config_flags) | |
| buildFlags.extend(cache_safe.build) | |
| buildFlags.extend(cache_affecting.build) | |
| buildFlags.extend(lang.build) | |
| return (self.bazel, startupFlags, buildFlags) | |
| # Default value in case the template does not behave as expected. | |
| BUILD_SETTINGS = None | |
| # <template> | |