aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2017-05-04 22:39:06 +0200
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2017-05-04 23:06:21 +0200
commit435f882fd36507ee7393cc9385e3460fdc166791 (patch)
tree898a0f82810627b91bd220e16117e80263e69fe9 /src/main/java/com/google/devtools/build/lib/rules/objc
parent3c56d6ac11378d57206550094f5fece0380d9c0b (diff)
Retire the experimental_objc_library rule and --experimental_objc_library flag.
Re-organize ObjcLibraryTest and ExperimentalObjcLibraryTest -> LegacyObjcLibraryTest and CrosstoolObjcLibraryTest, according to the pattern used in the other unit tests. PiperOrigin-RevId: 155120143
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java46
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java136
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibraryRule.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java31
7 files changed, 48 insertions, 229 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java
index 024956fc07..fc22d886d9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleCrosstoolTransition.java
@@ -90,7 +90,6 @@ public class AppleCrosstoolTransition implements PatchTransition {
*/
public static boolean appleCrosstoolTransitionIsAppliedForAllObjc(BuildOptions options) {
return (options.get(AppleCommandLineOptions.class).enableAppleCrosstoolTransition
- || options.get(ObjcCommandLineOptions.class).experimentalObjcLibrary
|| options.get(ObjcCommandLineOptions.class).objcCrosstoolMode != ObjcCrosstoolMode.OFF);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index 5f9ceb4053..56e4c70e47 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -352,6 +352,7 @@ public abstract class CompilationSupport {
private CompilationAttributes compilationAttributes;
private boolean useDeps = true;
private Map<String, NestedSet<Artifact>> outputGroupCollector;
+ private boolean isObjcLibrary = false;
/** Sets the {@link RuleContext} for the calling target. */
public Builder setRuleContext(RuleContext ruleContext) {
@@ -387,6 +388,15 @@ public abstract class CompilationSupport {
}
/**
+ * Indicates that this CompilationSupport is for use in an objc_library target. This will cause
+ * CrosstoolCompilationSupport to be used if --experimental_objc_crosstool=library
+ */
+ public Builder isObjcLibrary() {
+ this.isObjcLibrary = true;
+ return this;
+ }
+
+ /**
* Causes the provided map to be updated with output groups produced by compile action
* registration.
*
@@ -424,22 +434,26 @@ public abstract class CompilationSupport {
outputGroupCollector = new TreeMap<>();
}
- return buildConfiguration.getFragment(ObjcConfiguration.class).getObjcCrosstoolMode()
- == ObjcCrosstoolMode.ALL
- ? new CrosstoolCompilationSupport(
- ruleContext,
- buildConfiguration,
- intermediateArtifacts,
- compilationAttributes,
- useDeps,
- outputGroupCollector)
- : new LegacyCompilationSupport(
- ruleContext,
- buildConfiguration,
- intermediateArtifacts,
- compilationAttributes,
- useDeps,
- outputGroupCollector);
+ ObjcCrosstoolMode objcCrosstoolMode =
+ buildConfiguration.getFragment(ObjcConfiguration.class).getObjcCrosstoolMode();
+ if (objcCrosstoolMode == ObjcCrosstoolMode.ALL
+ || (isObjcLibrary && objcCrosstoolMode == ObjcCrosstoolMode.LIBRARY)) {
+ return new CrosstoolCompilationSupport(
+ ruleContext,
+ buildConfiguration,
+ intermediateArtifacts,
+ compilationAttributes,
+ useDeps,
+ outputGroupCollector);
+ } else {
+ return new LegacyCompilationSupport(
+ ruleContext,
+ buildConfiguration,
+ intermediateArtifacts,
+ compilationAttributes,
+ useDeps,
+ outputGroupCollector);
+ }
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java
deleted file mode 100644
index 06b8957f4e..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2016 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.objc;
-
-import static com.google.devtools.build.lib.rules.objc.XcodeProductType.LIBRARY_STATIC;
-
-import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
-import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
-import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
-import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
-import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
-import com.google.devtools.build.lib.syntax.Type;
-import java.util.Map;
-import java.util.TreeMap;
-
-/** Implementation for experimental_objc_library. */
-public class ExperimentalObjcLibrary implements RuleConfiguredTargetFactory {
-
- @Override
- public ConfiguredTarget create(RuleContext ruleContext)
- throws InterruptedException, RuleErrorException {
- return configureExperimentalObjcLibrary(ruleContext);
- }
-
- /**
- * Returns a configured target using the given context as an experimental_objc_library.
- *
- * <p>Implemented outside of {@link RuleClass.ConfiguredTargetFactory#create} so as to allow
- * experimental analysis of objc_library targets as experimental_objc_library.
- */
- public static ConfiguredTarget configureExperimentalObjcLibrary(RuleContext ruleContext)
- throws InterruptedException, RuleErrorException {
- validateAttributes(ruleContext);
-
- ObjcCommon common = common(ruleContext);
-
- Map<String, NestedSet<Artifact>> outputGroupCollector = new TreeMap<>();
- CompilationSupport compilationSupport =
- new CrosstoolCompilationSupport(ruleContext, outputGroupCollector)
- .registerCompileAndArchiveActions(common)
- .registerFullyLinkAction(
- common.getObjcProvider(),
- ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB));
-
- NestedSetBuilder<Artifact> filesToBuild =
- NestedSetBuilder.<Artifact>stableOrder().addAll(common.getCompiledArchive().asSet());
-
- XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder();
- compilationSupport.addXcodeSettings(xcodeProviderBuilder, common);
-
- new ResourceSupport(ruleContext)
- .validateAttributes()
- .addXcodeSettings(xcodeProviderBuilder);
-
- new XcodeSupport(ruleContext)
- .addFilesToBuild(filesToBuild)
- .addXcodeSettings(xcodeProviderBuilder, common.getObjcProvider(), LIBRARY_STATIC)
- .addDependencies(xcodeProviderBuilder, new Attribute("bundles", Mode.TARGET))
- .addDependencies(xcodeProviderBuilder, new Attribute("deps", Mode.TARGET))
- .addNonPropagatedDependencies(
- xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET))
- .registerActions(xcodeProviderBuilder.build());
-
- J2ObjcMappingFileProvider j2ObjcMappingFileProvider =
- J2ObjcMappingFileProvider.union(
- ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
- J2ObjcEntryClassProvider j2ObjcEntryClassProvider =
- new J2ObjcEntryClassProvider.Builder()
- .addTransitive(
- ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
- .build();
-
- return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
- .addProvider(ObjcProvider.class, common.getObjcProvider())
- .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
- .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
- .addProvider(
- InstrumentedFilesProvider.class,
- compilationSupport.getInstrumentedFilesProvider(common))
- .addProvider(
- CcLinkParamsProvider.class,
- new CcLinkParamsProvider(new ObjcLibraryCcLinkParamsStore(common)))
- .addProvider(ObjcProvider.class, common.getObjcProvider())
- .addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
- .addOutputGroups(outputGroupCollector)
- .build();
- }
-
- /** Throws errors or warnings for bad attribute state. */
- private static void validateAttributes(RuleContext ruleContext) {
- for (String copt : ObjcCommon.getNonCrosstoolCopts(ruleContext)) {
- if (copt.contains("-fmodules-cache-path")) {
- ruleContext.ruleWarning(CompilationSupport.MODULES_CACHE_PATH_WARNING);
- }
- }
- }
-
- /**
- * Constructs an {@link ObjcCommon} instance based on the attributes of the given rule context.
- */
- private static ObjcCommon common(RuleContext ruleContext) {
- return new ObjcCommon.Builder(ruleContext)
- .setCompilationAttributes(
- CompilationAttributes.Builder.fromRuleContext(ruleContext).build())
- .setResourceAttributes(new ResourceAttributes(ruleContext))
- .addDefines(ruleContext.getTokenizedStringListAttr("defines"))
- .setCompilationArtifacts(CompilationSupport.compilationArtifacts(ruleContext))
- .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET))
- .addRuntimeDeps(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET))
- .addDepObjcProviders(
- ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
- .addNonPropagatedDepObjcProviders(
- ruleContext.getPrerequisites("non_propagated_deps", Mode.TARGET, ObjcProvider.class))
- .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
- .setAlwayslink(ruleContext.attributes().get("alwayslink", Type.BOOLEAN))
- .setHasModuleMap()
- .build();
- }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibraryRule.java
deleted file mode 100644
index 6371e8d720..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibraryRule.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 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.objc;
-
-import com.google.devtools.build.lib.analysis.BaseRuleClasses;
-import com.google.devtools.build.lib.analysis.RuleDefinition;
-import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
-import com.google.devtools.build.lib.packages.RuleClass;
-import com.google.devtools.build.lib.packages.RuleClass.Builder;
-import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
-import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
-
-/**
- * Rule definition for experimental_objc_library.
- */
-public class ExperimentalObjcLibraryRule implements RuleDefinition {
- @Override
- public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
- return builder
- .requiresConfigurationFragments(
- ObjcConfiguration.class, AppleConfiguration.class, CppConfiguration.class)
- .setImplicitOutputsFunction(CompilationSupport.FULLY_LINKED_LIB)
- .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION)
- .build();
- }
-
- @Override
- public Metadata getMetadata() {
- return RuleDefinition.Metadata.builder()
- .name("experimental_objc_library")
- .factoryClass(ExperimentalObjcLibrary.class)
- .ancestors(
- BaseRuleClasses.BaseRule.class,
- ObjcRuleClasses.LinkingRule.class,
- ObjcRuleClasses.AlwaysLinkRule.class,
- ObjcRuleClasses.XcodegenRule.class)
- .build();
- }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
index 1e45d7b829..09b82e4a99 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
@@ -271,14 +271,6 @@ public class ObjcCommandLineOptions extends FragmentOptions {
)
public ObjcCrosstoolMode objcCrosstoolMode;
- // TODO(b/34260565): Remove in favor of --experimental_objc_crosstool
- @Option(
- name = "experimental_objc_library",
- defaultValue = "false",
- optionUsageRestrictions = OptionUsageRestrictions.UNDOCUMENTED
- )
- public boolean experimentalObjcLibrary;
-
@Option(
name = "objc_use_dotd_pruning",
defaultValue = "true",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java
index 6f3925e6c6..720f09cbb1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java
@@ -77,7 +77,6 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment {
@Nullable private final Label extraEntitlements;
private final boolean deviceDebugEntitlements;
private final ObjcCrosstoolMode objcCrosstoolMode;
- private final boolean experimentalObjcLibrary;
private final boolean enableAppleBinaryNativeProtos;
private final HeaderDiscovery.DotdPruningMode dotdPruningPlan;
private final boolean experimentalHeaderThinning;
@@ -117,7 +116,6 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment {
this.extraEntitlements = objcOptions.extraEntitlements;
this.deviceDebugEntitlements = objcOptions.deviceDebugEntitlements;
this.objcCrosstoolMode = objcOptions.objcCrosstoolMode;
- this.experimentalObjcLibrary = objcOptions.experimentalObjcLibrary;
this.enableAppleBinaryNativeProtos = objcOptions.enableAppleBinaryNativeProtos;
this.dotdPruningPlan =
objcOptions.useDotdPruning
@@ -344,7 +342,7 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment {
* CROSSTOOL is used for objc in this configuration.
*/
public ObjcCrosstoolMode getObjcCrosstoolMode() {
- return experimentalObjcLibrary ? ObjcCrosstoolMode.LIBRARY : objcCrosstoolMode;
+ return objcCrosstoolMode;
}
/** Returns true if apple_binary targets should generate and link Objc protos. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index 5fa8a59782..be85472195 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -24,7 +24,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
-import com.google.devtools.build.lib.rules.objc.ObjcCommandLineOptions.ObjcCrosstoolMode;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
import com.google.devtools.build.lib.syntax.Type;
@@ -61,14 +60,8 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
@Override
public ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
- // Support treating objc_library as experimental_objc_library
- // TODO(b/34260565): Deprecate ExperimentalObjcLibrary in favor of ObjcLibrary with
- // CrosstoolCompilationSupport.
- if (ruleContext.getFragment(ObjcConfiguration.class).getObjcCrosstoolMode()
- != ObjcCrosstoolMode.OFF) {
- return ExperimentalObjcLibrary.configureExperimentalObjcLibrary(ruleContext);
- }
-
+ validateAttributes(ruleContext);
+
ObjcCommon common = common(ruleContext);
XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder();
@@ -80,6 +73,7 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
new CompilationSupport.Builder()
.setRuleContext(ruleContext)
.setOutputGroupCollector(outputGroupCollector)
+ .isObjcLibrary()
.build();
compilationSupport
@@ -89,11 +83,11 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB))
.addXcodeSettings(xcodeProviderBuilder, common)
.validateAttributes();
-
+
new ResourceSupport(ruleContext)
.validateAttributes()
.addXcodeSettings(xcodeProviderBuilder);
-
+
new XcodeSupport(ruleContext)
.addFilesToBuild(filesToBuild)
.addXcodeSettings(xcodeProviderBuilder, common.getObjcProvider(), LIBRARY_STATIC)
@@ -104,10 +98,10 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
.registerActions(xcodeProviderBuilder.build());
J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
- ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
- .addTransitive(ruleContext.getPrerequisites("deps", Mode.TARGET,
- J2ObjcEntryClassProvider.class)).build();
+ .addTransitive(ruleContext.getPrerequisites("deps", Mode.TARGET,
+ J2ObjcEntryClassProvider.class)).build();
return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
.addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
@@ -123,4 +117,13 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
.addOutputGroups(outputGroupCollector)
.build();
}
+
+ /** Throws errors or warnings for bad attribute state. */
+ private static void validateAttributes(RuleContext ruleContext) {
+ for (String copt : ObjcCommon.getNonCrosstoolCopts(ruleContext)) {
+ if (copt.contains("-fmodules-cache-path")) {
+ ruleContext.ruleWarning(CompilationSupport.MODULES_CACHE_PATH_WARNING);
+ }
+ }
+ }
}