blob: e4259b018ef54554a7b696caec69840bae89f2f6 [file] [log] [blame]
# swift_build_support/products/swift.py -------------------------*- python -*-
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
#
# ----------------------------------------------------------------------------
from . import product
from ..cmake import CMakeOptions
class Swift(product.Product):
def __init__(self, args, toolchain, source_dir, build_dir):
product.Product.__init__(self, args, toolchain, source_dir,
build_dir)
# Add any runtime sanitizer arguments.
self.cmake_options.extend(self._runtime_sanitizer_flags)
# Add any compiler vendor cmake flags.
self.cmake_options.extend(self._compiler_vendor_flags)
# Add any swift version related cmake flags.
self.cmake_options.extend(self._version_flags)
# Add benchmark specific flags.
self.cmake_options.extend(self._benchmark_flags)
# Generate the compile db.
self.cmake_options.extend(self._compile_db_flags)
# Add the flag if we are supposed to force the typechecker to compile
# with optimization.
self.cmake_options.extend(self._force_optimized_typechecker_flags)
# Add any exclusivity checking flags for stdlibcore.
self.cmake_options.extend(self._stdlibcore_exclusivity_checking_flags)
# Add experimental differentiable programming flag.
self.cmake_options.extend(
self._enable_experimental_differentiable_programming)
@property
def _runtime_sanitizer_flags(self):
sanitizer_list = []
if self.args.enable_tsan_runtime:
sanitizer_list += ['Thread']
if len(sanitizer_list) == 0:
return []
return [('SWIFT_RUNTIME_USE_SANITIZERS', ';'.join(sanitizer_list))]
@property
def _compiler_vendor_flags(self):
if self.args.compiler_vendor == "none":
return []
if self.args.compiler_vendor != "apple":
raise RuntimeError("Unknown compiler vendor?! Was build-script \
updated without updating swift.py?")
swift_compiler_version = ""
if self.args.swift_compiler_version is not None:
swift_compiler_version = self.args.swift_compiler_version
return [
('SWIFT_VENDOR', 'Apple'),
('SWIFT_VENDOR_UTI', 'com.apple.compilers.llvm.swift'),
# This has a default of 3.0, so it should be safe to use here.
('SWIFT_VERSION', str(self.args.swift_user_visible_version)),
# FIXME: We are matching build-script-impl here. But it seems like
# bit rot since this flag is specified in another place with the
# exact same value in build-script-impl.
('SWIFT_COMPILER_VERSION', str(swift_compiler_version)),
]
@property
def _version_flags(self):
r = CMakeOptions()
if self.args.swift_compiler_version is not None:
swift_compiler_version = self.args.swift_compiler_version
r.define('SWIFT_COMPILER_VERSION', str(swift_compiler_version))
if self.args.clang_compiler_version is not None:
clang_compiler_version = self.args.clang_compiler_version
r.define('CLANG_COMPILER_VERSION', str(clang_compiler_version))
return r
@property
def _benchmark_flags(self):
if not self.args.benchmark:
return []
onone_iters = self.args.benchmark_num_onone_iterations
o_iters = self.args.benchmark_num_o_iterations
return [
('SWIFT_BENCHMARK_NUM_ONONE_ITERATIONS', onone_iters),
('SWIFT_BENCHMARK_NUM_O_ITERATIONS', o_iters)
]
@property
def _compile_db_flags(self):
return [('CMAKE_EXPORT_COMPILE_COMMANDS', True)]
@property
def _force_optimized_typechecker_flags(self):
return [('SWIFT_FORCE_OPTIMIZED_TYPECHECKER:BOOL',
self.args.force_optimized_typechecker)]
@property
def _stdlibcore_exclusivity_checking_flags(self):
return [('SWIFT_STDLIB_ENABLE_STDLIBCORE_EXCLUSIVITY_CHECKING:BOOL',
self.args.enable_stdlibcore_exclusivity_checking)]
@property
def _enable_experimental_differentiable_programming(self):
return [('SWIFT_ENABLE_EXPERIMENTAL_DIFFERENTIABLE_PROGRAMMING:BOOL',
self.args.enable_experimental_differentiable_programming)]