From 5b168f3abe7eb1a85425bfa43e99994ed46eb4f0 Mon Sep 17 00:00:00 2001 From: Greg Estren Date: Wed, 20 May 2015 15:25:50 +0000 Subject: Have ConfiguredTargetFactory subclasses declare which FragmentOptions they need to create their fragments. This is prerequisite work for fragment-limited configurations (configurations that only include the fragments needed by their rules' transitive closures). Given a set of desired fragment classes, we need to know which FragmentOptions are needed to instantiate those fragments. Note that we can't map this relationship the other way (given a set of FragmentOptions, which fragment classes do they load?). That's because different fragment loaders may consume overlapping options. A good example is CppOptions, which is, e.g., used by both the C++ and Python configuration loaders. At some point, we're probably going to want to force configuration loaders to only understand options from their own "domain" (or have well-defined hierarchies). But that's not the reality of today. -- MOS_MIGRATED_REVID=94091093 --- .../build/lib/analysis/config/ConfigurationFragmentFactory.java | 6 ++++++ .../google/devtools/build/lib/bazel/rules/BazelConfiguration.java | 7 +++++++ .../devtools/build/lib/rules/android/AndroidConfiguration.java | 5 +++++ .../devtools/build/lib/rules/cpp/CppConfigurationLoader.java | 7 +++++++ .../devtools/build/lib/rules/java/JavaConfigurationLoader.java | 8 ++++++++ .../devtools/build/lib/rules/java/JvmConfigurationLoader.java | 7 +++++++ .../google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java | 6 ++++++ .../devtools/build/lib/rules/objc/ObjcConfigurationLoader.java | 7 +++++++ .../build/lib/rules/python/PythonConfigurationLoader.java | 7 +++++++ 9 files changed, 60 insertions(+) (limited to 'src/main/java/com/google/devtools/build') diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java index 8ca8f1c328..3752af588f 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java @@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.analysis.config; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; import javax.annotation.Nullable; @@ -36,4 +37,9 @@ public interface ConfigurationFragmentFactory { * @return the exact type of the fragment this factory creates. */ Class creates(); + + /** + * Returns the option classes needed to load this fragment. + */ + ImmutableSet> requiredOptions(); } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfiguration.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfiguration.java index 63aa4e3d2e..7d34794194 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfiguration.java @@ -15,10 +15,12 @@ package com.google.devtools.build.lib.bazel.rules; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; 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.util.OS; import com.google.devtools.build.lib.vfs.PathFragment; @@ -41,6 +43,11 @@ public class BazelConfiguration extends Fragment { public Class creates() { return BazelConfiguration.class; } + + @Override + public ImmutableSet> requiredOptions() { + return ImmutableSet.of(); + } } public BazelConfiguration() { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java index ea420a754c..90da6e8f35 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java @@ -181,6 +181,11 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { public Class creates() { return AndroidConfiguration.class; } + + @Override + public ImmutableSet> requiredOptions() { + return ImmutableSet.>of(Options.class); + } } private final Label sdk; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java index de20283419..bf26f630f8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java @@ -15,12 +15,14 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.common.base.Function; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RedirectChaser; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; 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.packages.InputFile; import com.google.devtools.build.lib.packages.NoSuchPackageException; @@ -44,6 +46,11 @@ public class CppConfigurationLoader implements ConfigurationFragmentFactory { return CppConfiguration.class; } + @Override + public ImmutableSet> requiredOptions() { + return ImmutableSet.>of(CppOptions.class); + } + private final Function cpuTransformer; /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java index b1aa262676..3d83a926a4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java @@ -14,11 +14,13 @@ package com.google.devtools.build.lib.rules.java; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.RedirectChaser; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; 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.rules.java.JavaConfiguration.JavaClasspathMode; import com.google.devtools.build.lib.syntax.Label; @@ -34,6 +36,12 @@ public class JavaConfigurationLoader implements ConfigurationFragmentFactory { this.cpuSupplier = cpuSupplier; } + @Override + public ImmutableSet> requiredOptions() { + return ImmutableSet.>of(JavaOptions.class); + } + + @Override public JavaConfiguration create(ConfigurationEnvironment env, BuildOptions buildOptions) throws InvalidConfigurationException { diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java index d2f7c27d95..a19461ae7f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java @@ -15,11 +15,13 @@ package com.google.devtools.build.lib.rules.java; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.RedirectChaser; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; 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.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; @@ -82,6 +84,11 @@ public final class JvmConfigurationLoader implements ConfigurationFragmentFactor return Jvm.class; } + @Override + public ImmutableSet> requiredOptions() { + return ImmutableSet.>of(JavaOptions.class); + } + @Nullable private Jvm createDefault(ConfigurationEnvironment lookup, String javaHome, String cpu) throws InvalidConfigurationException { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java index 116030b2ab..185df22eae 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment 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.events.Event; import com.google.devtools.build.lib.events.EventHandler; @@ -65,6 +66,11 @@ public class J2ObjcConfiguration extends Fragment { public Class creates() { return J2ObjcConfiguration.class; } + + @Override + public ImmutableSet> requiredOptions() { + return ImmutableSet.>of(J2ObjcCommandLineOptions.class); + } } private final Set translationFlags; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java index e877aa63cc..e92c236900 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java @@ -14,11 +14,13 @@ package com.google.devtools.build.lib.rules.objc; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options; 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; /** @@ -39,4 +41,9 @@ public class ObjcConfigurationLoader implements ConfigurationFragmentFactory { public Class creates() { return ObjcConfiguration.class; } + + @Override + public ImmutableSet> requiredOptions() { + return ImmutableSet.>of(ObjcCommandLineOptions.class); + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfigurationLoader.java index 2acfe17981..79e26b2708 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfigurationLoader.java +++ b/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfigurationLoader.java @@ -14,10 +14,12 @@ package com.google.devtools.build.lib.rules.python; import com.google.common.base.Function; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; 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.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.cpp.CppOptions; @@ -37,6 +39,11 @@ public class PythonConfigurationLoader implements ConfigurationFragmentFactory { this.cpuTransformer = cpuTransformer; } + @Override + public ImmutableSet> requiredOptions() { + return ImmutableSet.of(PythonOptions.class, CppOptions.class); + } + @Nullable private CrosstoolConfig.CToolchain getToolchain( ConfigurationEnvironment env, BuildOptions buildOptions, Label crosstoolTop) -- cgit v1.2.3