aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar gregce <gregce@google.com>2017-05-04 16:57:07 +0200
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2017-05-04 17:01:09 +0200
commit9547eeb45854fc194aad20495d202c11f8e96b84 (patch)
treea75d141e506f152f80c587bfc108e0f5766f69d2 /src/main/java/com/google/devtools/build
parentdb13625aa123cd0b217fd70ba840b3685ffe0ecc (diff)
Add patch transitions for DATA -> TARGET and LIPO_COLLECTOR -> TARGET.
EnableLipoTransition provides the dynamic equivalent for LIPO_ON_DEMAND. ContextCollectorOwnerTransition provides the ability to get the "owner" configuration from the LIPO collector configuration. PiperOrigin-RevId: 155079187
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/ContextCollectorOwnerTransition.java58
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/EnableLipoTransition.java55
2 files changed, 113 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/ContextCollectorOwnerTransition.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/ContextCollectorOwnerTransition.java
new file mode 100644
index 0000000000..9b215e960d
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/ContextCollectorOwnerTransition.java
@@ -0,0 +1,58 @@
+// 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.cpp.transitions;
+
+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.PatchTransition;
+import com.google.devtools.build.lib.rules.cpp.CppOptions;
+import com.google.devtools.build.lib.rules.cpp.CppOptions.LipoConfigurationState;
+
+/**
+ * Configuration transition that creates the "artifact owner" configuration from the LIPO
+ * context collector configuration.
+ *
+ * <p>The context collector creates C++ output artifacts but doesn't create the actions that
+ * generate those artifacts (this is what {@link BuildConfiguration#isActionsEnabled()} means).
+ * Those actions are the responsibility of the target configuration. This transition produces that
+ * config so artifacts created by the context collector can be associated with the the right
+ * "owner". Also see {@link BuildConfiguration#getArtifactOwnerConfiguration()}.
+ *
+ * <p>This is a no-op for all configurations but the context collector.
+ */
+public class ContextCollectorOwnerTransition implements PatchTransition {
+ public static final ContextCollectorOwnerTransition INSTANCE =
+ new ContextCollectorOwnerTransition();
+
+ @Override
+ public BuildOptions apply(BuildOptions options) {
+ // If this target and its transitive closure don't have C++ options, there's no context
+ // collector configuration to change.
+ if (!options.contains(CppOptions.class)) {
+ return options;
+ }
+ if (!options.get(CppOptions.class).isLipoContextCollector()) {
+ return options;
+ }
+ BuildOptions ownerOptions = options.clone();
+ ownerOptions.get(CppOptions.class).lipoConfigurationState = LipoConfigurationState.APPLY_LIPO;
+ return ownerOptions;
+ }
+
+ @Override
+ public boolean defaultsToSelf() {
+ return false;
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/EnableLipoTransition.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/EnableLipoTransition.java
new file mode 100644
index 0000000000..3aacb5dd54
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/transitions/EnableLipoTransition.java
@@ -0,0 +1,55 @@
+// 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.cpp.transitions;
+
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.PatchTransition;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.rules.cpp.CppOptions;
+import com.google.devtools.build.lib.rules.cpp.CppOptions.LipoConfigurationState;
+
+/**
+ * Configuration transition that turns on LIPO/FDO settings for configurations that have them
+ * disabled.
+ */
+public class EnableLipoTransition implements PatchTransition {
+ private final Label ruleLabel;
+
+ /**
+ * Creates a new transition that only triggers on the given rule. This can be used for
+ * restricting this transition to the LIPO context binary.
+ */
+ public EnableLipoTransition(Label ruleLabel) {
+ this.ruleLabel = ruleLabel;
+ }
+
+ @Override
+ public BuildOptions apply(BuildOptions options) {
+ CppOptions cppOptions = options.get(CppOptions.class);
+ if (!cppOptions.isDataConfigurationForLipoOptimization()
+ || !ruleLabel.equals(cppOptions.getLipoContextForBuild())) {
+ return options;
+ }
+ BuildOptions lipoEnabledOptions = options.clone();
+ lipoEnabledOptions.get(CppOptions.class).lipoConfigurationState =
+ LipoConfigurationState.APPLY_LIPO;
+ return lipoEnabledOptions;
+ }
+
+ @Override
+ public boolean defaultsToSelf() {
+ return false;
+ }
+}