diff options
author | 2017-01-11 16:38:23 +0000 | |
---|---|---|
committer | 2017-01-12 09:09:28 +0000 | |
commit | fca2d6ac839dd64c508510b708aea2b049bcc1a2 (patch) | |
tree | 60807a74a787fd5bd5d18b2ca36c83170c7a3d7c /src/main/java | |
parent | db7a9ea7f6b2af3c4c1f43ad4aa50cd4eca02921 (diff) |
Add SwiftConfiguration
* This new configuration allows for passthrough of Swift-specific options into Skylark for further consumption by swift_library. It also keeps things nicely isolated until we get a way to create configurations in Skylark directly.
--
PiperOrigin-RevId: 144210267
MOS_MIGRATED_REVID=144210267
Diffstat (limited to 'src/main/java')
7 files changed, 157 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/docgen/BUILD b/src/main/java/com/google/devtools/build/docgen/BUILD index 5041eb5c78..bf634329e4 100644 --- a/src/main/java/com/google/devtools/build/docgen/BUILD +++ b/src/main/java/com/google/devtools/build/docgen/BUILD @@ -17,6 +17,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib:skylarkinterface", "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/rules/apple", + "//src/main/java/com/google/devtools/build/lib/rules/apple/swift", "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//src/main/java/com/google/devtools/build/lib/rules/objc", "//src/main/java/com/google/devtools/common/options", diff --git a/src/main/java/com/google/devtools/build/docgen/SkylarkDocumentationCollector.java b/src/main/java/com/google/devtools/build/docgen/SkylarkDocumentationCollector.java index 7bff0c2a9f..a6f9bb67e6 100644 --- a/src/main/java/com/google/devtools/build/docgen/SkylarkDocumentationCollector.java +++ b/src/main/java/com/google/devtools/build/docgen/SkylarkDocumentationCollector.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.rules.SkylarkModules; import com.google.devtools.build.lib.rules.SkylarkRuleContext; import com.google.devtools.build.lib.rules.android.AndroidSkylarkApiProvider; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +import com.google.devtools.build.lib.rules.apple.swift.SwiftConfiguration; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.java.JavaConfiguration; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; @@ -39,7 +40,6 @@ import com.google.devtools.build.lib.syntax.BazelLibrary; import com.google.devtools.build.lib.syntax.FuncallExpression; import com.google.devtools.build.lib.syntax.MethodLibrary; import com.google.devtools.build.lib.syntax.Runtime; - import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Deque; @@ -199,6 +199,7 @@ final class SkylarkDocumentationCollector { collectBuiltinModule(modules, ObjcConfiguration.class); collectBuiltinModule(modules, CppConfiguration.class); collectBuiltinModule(modules, JavaConfiguration.class); + collectBuiltinModule(modules, SwiftConfiguration.class); collectBuiltinModule(modules, Jvm.class); collectBuiltinModule(modules, JavaSkylarkApiProvider.class); collectBuiltinModule(modules, JavaRuleOutputJarsProvider.OutputJar.class); diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 016313d93c..967ce84b79 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -28,6 +28,7 @@ filegroup( "//src/main/java/com/google/devtools/build/lib/remote:srcs", "//src/main/java/com/google/devtools/build/lib/rules/apple:srcs", "//src/main/java/com/google/devtools/build/lib/rules/apple/cpp:srcs", + "//src/main/java/com/google/devtools/build/lib/rules/apple/swift:srcs", "//src/main/java/com/google/devtools/build/lib/rules/cpp:srcs", "//src/main/java/com/google/devtools/build/lib/rules/cpp/proto:srcs", "//src/main/java/com/google/devtools/build/lib/rules/genquery:srcs", @@ -573,6 +574,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/query2:query-output", "//src/main/java/com/google/devtools/build/lib/rules/apple", "//src/main/java/com/google/devtools/build/lib/rules/apple/cpp", + "//src/main/java/com/google/devtools/build/lib/rules/apple/swift", "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//src/main/java/com/google/devtools/build/lib/rules/cpp/proto:CcProtoLibrary", "//src/main/java/com/google/devtools/build/lib/rules/genquery", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index ef1428d2ac..d89953d1bf 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -99,6 +99,8 @@ import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.XcodeConfigRule; import com.google.devtools.build.lib.rules.apple.XcodeVersionRule; import com.google.devtools.build.lib.rules.apple.cpp.AppleCcToolchainRule; +import com.google.devtools.build.lib.rules.apple.swift.SwiftCommandLineOptions; +import com.google.devtools.build.lib.rules.apple.swift.SwiftConfiguration; import com.google.devtools.build.lib.rules.cpp.CcIncLibraryRule; import com.google.devtools.build.lib.rules.cpp.CcToolchainRule; import com.google.devtools.build.lib.rules.cpp.CcToolchainSuiteRule; @@ -601,6 +603,7 @@ public class BazelRuleClassProvider { builder.addConfig(ObjcCommandLineOptions.class, new ObjcConfigurationLoader()); builder.addConfig(AppleCommandLineOptions.class, new AppleConfiguration.Loader()); + builder.addConfig(SwiftCommandLineOptions.class, new SwiftConfiguration.Loader()); // j2objc shouldn't be here! builder.addConfig(J2ObjcCommandLineOptions.class, new J2ObjcConfiguration.Loader()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/swift/BUILD b/src/main/java/com/google/devtools/build/lib/rules/apple/swift/BUILD new file mode 100644 index 0000000000..d8aaf10fc2 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/swift/BUILD @@ -0,0 +1,24 @@ +# Description: +# Support for building swift for Apple platform + +package( + default_visibility = ["//src:__subpackages__"], +) + +java_library( + name = "swift", + srcs = glob(["*.java"]), + deps = [ + "//src/main/java/com/google/devtools/build/lib:build-base", + "//src/main/java/com/google/devtools/build/lib:concurrent", + "//src/main/java/com/google/devtools/build/lib:skylarkinterface", + "//src/main/java/com/google/devtools/common/options", + "//third_party:guava", + ], +) + +filegroup( + name = "srcs", + testonly = 0, # All srcs should be not test only, overwrite package default. + srcs = glob(["**"]), +) diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftCommandLineOptions.java new file mode 100644 index 0000000000..95a3f52c6d --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftCommandLineOptions.java @@ -0,0 +1,40 @@ +// Copyright 2017 The Bazel 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. + +package com.google.devtools.build.lib.rules.apple.swift; + +import com.google.devtools.build.lib.analysis.config.FragmentOptions; +import com.google.devtools.common.options.Option; +import java.util.List; + +/** Command-line options for building with Swift tools. */ +public class SwiftCommandLineOptions extends FragmentOptions { + + @Option( + name = "swiftcopt", + allowMultiple = true, + defaultValue = "", + category = "flags", + help = "Additional options to pass to Swift compilation." + ) + public List<String> copts; + + @Option( + name = "swift_whole_module_optimization", + defaultValue = "false", + category = "flags", + help = "Whether to enable Whole Module Optimization" + ) + public boolean enableWholeModuleOptimization; +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftConfiguration.java new file mode 100644 index 0000000000..f10c0e4632 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftConfiguration.java @@ -0,0 +1,85 @@ +// Copyright 2017 The Bazel 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. + +package com.google.devtools.build.lib.rules.apple.swift; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.analysis.config.BuildOptions; +import com.google.devtools.build.lib.analysis.config.ConfigurationEnvironment; +import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory; +import com.google.devtools.build.lib.analysis.config.FragmentOptions; +import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; + +/** + * A configuration containing flags required for Swift tools. This is used primarily by swift_* + * family of rules written in Skylark. + */ +@SkylarkModule( + name = "swift", + doc = "A configuration fragment for Swift tools.", + category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT +) +@Immutable +public class SwiftConfiguration extends BuildConfiguration.Fragment { + + private final boolean enableWholeModuleOptimization; + private final ImmutableList<String> copts; + + public SwiftConfiguration(SwiftCommandLineOptions options) { + enableWholeModuleOptimization = options.enableWholeModuleOptimization; + copts = ImmutableList.copyOf(options.copts); + } + + /** Returns whether to enable Whole Module Optimization. */ + @SkylarkCallable( + name = "enable_whole_module_optimization", + doc = "Whether to enable Whole Module Optimization." + ) + public boolean enableWholeModuleOptimization() { + return enableWholeModuleOptimization; + } + + /** Returns a list of options to use for compiling Swift. */ + @SkylarkCallable(name = "copts", doc = "Returns a list of options to use for compiling Swift.") + public ImmutableList<String> getCopts() { + return copts; + } + + /** Loads {@link SwiftConfiguration} from build options. */ + public static class Loader implements ConfigurationFragmentFactory { + @Override + public SwiftConfiguration create(ConfigurationEnvironment env, BuildOptions buildOptions) + throws InvalidConfigurationException, InterruptedException { + SwiftCommandLineOptions options = buildOptions.get(SwiftCommandLineOptions.class); + + return new SwiftConfiguration(options); + } + + @Override + public Class<? extends BuildConfiguration.Fragment> creates() { + return SwiftConfiguration.class; + } + + @Override + public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() { + return ImmutableSet.<Class<? extends FragmentOptions>>of(SwiftCommandLineOptions.class); + } + } +} |