blob: e485cad8bdbfc5764fb22db3e2258a00c7606382 [file] [log] [blame]
# 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>