diff options
author | 2016-04-19 21:38:35 +0000 | |
---|---|---|
committer | 2016-04-20 11:17:10 +0000 | |
commit | 9b35d8a81b0d5cb92a22e7d9c7bf30a834711d7f (patch) | |
tree | 914756f930a4c41f91ee8bfe04507af0d85d67f6 /src/main | |
parent | 44daf782269f039367adef7828494af047a198be (diff) |
Refactor CompilationSupport and IntermediateArtifacts to optionally take a BuildConfiguration that is not the current rule context's configuration.
--
MOS_MIGRATED_REVID=120271518
Diffstat (limited to 'src/main')
3 files changed, 86 insertions, 52 deletions
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 7661970157..8fe7df3365 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 @@ -68,6 +68,7 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.FileWriteAction; import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction; import com.google.devtools.build.lib.analysis.actions.SpawnAction; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; @@ -219,16 +220,32 @@ public final class CompilationSupport { } private final RuleContext ruleContext; + private final BuildConfiguration buildConfiguration; + private final ObjcConfiguration objcConfiguration; + private final AppleConfiguration appleConfiguration; private final CompilationAttributes attributes; private final IntermediateArtifacts intermediateArtifacts; /** - * Creates a new compilation support for the given rule. + * Creates a new compilation support for the given rule. All actions will be created under + * the given build configuration, which may be different than the current rule context + * configuration. */ - public CompilationSupport(RuleContext ruleContext) { + public CompilationSupport(RuleContext ruleContext, BuildConfiguration buildConfiguration) { this.ruleContext = ruleContext; + this.buildConfiguration = buildConfiguration; + this.objcConfiguration = buildConfiguration.getFragment(ObjcConfiguration.class); + this.appleConfiguration = buildConfiguration.getFragment(AppleConfiguration.class); this.attributes = new CompilationAttributes(ruleContext); - this.intermediateArtifacts = ObjcRuleClasses.intermediateArtifacts(ruleContext); + this.intermediateArtifacts = + ObjcRuleClasses.intermediateArtifacts(ruleContext, buildConfiguration); + } + + /** + * Creates a new compilation support for the given rule. + */ + public CompilationSupport(RuleContext ruleContext) { + this(ruleContext, ruleContext.getConfiguration()); } /** @@ -242,7 +259,7 @@ public final class CompilationSupport { if (common.getCompilationArtifacts().isPresent()) { registerGenerateModuleMapAction(common.getCompilationArtifacts()); Optional<CppModuleMap> moduleMap; - if (ObjcRuleClasses.objcConfiguration(ruleContext).moduleMapsEnabled()) { + if (objcConfiguration.moduleMapsEnabled()) { moduleMap = Optional.of(intermediateArtifacts.moduleMap()); } else { moduleMap = Optional.absent(); @@ -251,7 +268,7 @@ public final class CompilationSupport { common.getCompilationArtifacts().get(), common.getObjcProvider(), moduleMap, - ruleContext.getConfiguration().isCodeCoverageEnabled(), + buildConfiguration.isCodeCoverageEnabled(), true); } return this; @@ -316,7 +333,7 @@ public final class CompilationSupport { * Adds a source file to a command line, honoring the useAbsolutePathForActions flag. */ private CustomCommandLine.Builder addSource(CustomCommandLine.Builder commandLine, - ObjcConfiguration objcConfiguration, Artifact sourceFile) { + Artifact sourceFile) { PathFragment sourceExecPathFragment = sourceFile.getExecPath(); String sourcePath = sourceExecPathFragment.getPathString(); if (!sourceExecPathFragment.isAbsolute() && objcConfiguration.getUseAbsolutePathsForActions()) { @@ -327,9 +344,9 @@ public final class CompilationSupport { } private CustomCommandLine.Builder addSource(String argName, CustomCommandLine.Builder commandLine, - ObjcConfiguration objcConfiguration, Artifact sourceFile) { + Artifact sourceFile) { commandLine.add(argName); - return addSource(commandLine, objcConfiguration, sourceFile); + return addSource(commandLine, sourceFile); } private void registerCompileAction( @@ -340,8 +357,6 @@ public final class CompilationSupport { CompilationArtifacts compilationArtifacts, Iterable<String> otherFlags, boolean isCodeCoverageEnabled) { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); - AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); ImmutableList.Builder<String> coverageFlags = new ImmutableList.Builder<>(); ImmutableList.Builder<Artifact> gcnoFiles = new ImmutableList.Builder<>(); ImmutableList.Builder<Artifact> additionalInputs = new ImmutableList.Builder<>(); @@ -374,7 +389,7 @@ public final class CompilationSupport { .add(commonLinkAndCompileFlagsForClang(objcProvider, objcConfiguration, appleConfiguration)) .add(objcConfiguration.getCoptsForCompilationMode()) .addBeforeEachPath( - "-iquote", ObjcCommon.userHeaderSearchPaths(ruleContext.getConfiguration())) + "-iquote", ObjcCommon.userHeaderSearchPaths(buildConfiguration)) .addBeforeEachExecPath("-include", compilationArtifacts.getPchFile().asSet()) .addBeforeEachPath("-I", objcProvider.get(INCLUDE)) .addBeforeEachPath("-isystem", objcProvider.get(INCLUDE_SYSTEM)) @@ -415,7 +430,8 @@ public final class CompilationSupport { } // TODO(bazel-team): Remote private headers from inputs once they're added to the provider. - ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext) + ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder( + ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("ObjcCompile") .setExecutable(xcrunwrapper(ruleContext)) .setCommandLine(commandLine.build()) @@ -437,7 +453,6 @@ public final class CompilationSupport { * of the rule's "copts" attribute as well as the current configuration copts). */ private Iterable<String> getCompileRuleCopts() { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); List<String> copts = Lists.newArrayList( Iterables.concat(objcConfiguration.getCopts(), attributes.copts())); @@ -459,7 +474,7 @@ public final class CompilationSupport { // Unfortunately, this cache contains non-hermetic information, thus we avoid declaring it as // an implicit output (as outputs must be hermetic). String cachePath = - ruleContext.getConfiguration().getGenfilesFragment() + "/" + OBJC_MODULE_CACHE_DIR_NAME; + buildConfiguration.getGenfilesFragment() + "/" + OBJC_MODULE_CACHE_DIR_NAME; copts.add("-fmodules-cache-path=" + cachePath); } return copts; @@ -476,8 +491,6 @@ public final class CompilationSupport { Artifact sourceFile, Artifact objFile, ObjcProvider objcProvider) { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); - AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); // Compiling a single swift file requires knowledge of all of the other // swift files in the same module. The primary file ({@code sourceFile}) is @@ -508,7 +521,7 @@ public final class CompilationSupport { .add("-Onone") .add("-module-name").add(getModuleName()) .add("-parse-as-library"); - addSource("-primary-file", commandLine, objcConfiguration, sourceFile) + addSource("-primary-file", commandLine, sourceFile) .addExecPaths(otherSwiftSources) .addExecPath("-o", objFile) .addExecPath("-emit-module-path", intermediateArtifacts.swiftModuleFile(sourceFile)) @@ -546,7 +559,8 @@ public final class CompilationSupport { commandLine.add(commonFrameworkFlags(objcProvider, appleConfiguration)); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("SwiftCompile") .setExecutable(xcrunwrapper(ruleContext)) .setCommandLine(commandLine.build()) @@ -567,9 +581,6 @@ public final class CompilationSupport { private void registerSwiftModuleMergeAction( CompilationArtifacts compilationArtifacts, ObjcProvider objcProvider) { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); - AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); - ImmutableList.Builder<Artifact> moduleFiles = new ImmutableList.Builder<>(); for (Artifact src : compilationArtifacts.getSrcs()) { if (ObjcRuleClasses.SWIFT_SOURCES.matches(src.getFilename())) { @@ -617,7 +628,8 @@ public final class CompilationSupport { commandLine.add(commonFrameworkFlags(objcProvider, appleConfiguration)); - ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext) + ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder( + ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("SwiftModuleMerge") .setExecutable(xcrunwrapper(ruleContext)) .setCommandLine(commandLine.build()) @@ -630,9 +642,8 @@ public final class CompilationSupport { } private void registerArchiveActions(ImmutableList.Builder<Artifact> objFiles, Artifact archive) { - for (Action action : archiveActions(ruleContext, objFiles.build(), archive, - ruleContext.getFragment(AppleConfiguration.class), - intermediateArtifacts.objList())) { + for (Action action : + archiveActions(ruleContext, objFiles.build(), archive, intermediateArtifacts.objList())) { ruleContext.registerAction(action); } } @@ -641,7 +652,6 @@ public final class CompilationSupport { ActionConstructionContext context, Iterable<Artifact> objFiles, Artifact archive, - AppleConfiguration appleConfiguration, Artifact objList) { ImmutableList.Builder<Action> actions = new ImmutableList.Builder<>(); @@ -652,7 +662,8 @@ public final class CompilationSupport { Artifact.joinExecPaths("\n", objFiles), /*makeExecutable=*/ false)); - actions.add(ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext) + actions.add(ObjcRuleClasses.spawnAppleEnvActionBuilder( + ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("ObjcLink") .setExecutable(xcrunwrapper(ruleContext)) .setCommandLine(new CustomCommandLine.Builder() @@ -672,11 +683,11 @@ public final class CompilationSupport { } private void registerFullyLinkAction(ObjcProvider objcProvider) throws InterruptedException { - AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); Artifact archive = ruleContext.getImplicitOutputArtifact(FULLY_LINKED_LIB); ImmutableList<Artifact> ccLibraries = ccLibraries(objcProvider); - ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext) + ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder( + ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("ObjcLink") .setExecutable(xcrunwrapper(ruleContext)) .setCommandLine(new CustomCommandLine.Builder() @@ -746,7 +757,7 @@ public final class CompilationSupport { DsymOutputType dsymOutputType) { Optional<Artifact> dsymBundleZip; Optional<Artifact> linkmap; - if (ObjcRuleClasses.objcConfiguration(ruleContext).generateDebugSymbols()) { + if (objcConfiguration.generateDebugSymbols()) { registerDsymActions(dsymOutputType); dsymBundleZip = Optional.of(intermediateArtifacts.tempDsymBundleZip(dsymOutputType)); } else { @@ -760,7 +771,7 @@ public final class CompilationSupport { prunedJ2ObjcArchives = j2objcPrunedLibraries(objcProvider); } - if (ObjcRuleClasses.objcConfiguration(ruleContext).generateLinkmap()) { + if (objcConfiguration.generateLinkmap()) { linkmap = Optional.of(intermediateArtifacts.linkmap()); } else { linkmap = Optional.absent(); @@ -778,7 +789,8 @@ public final class CompilationSupport { private boolean stripJ2ObjcDeadCode() { J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext); - J2ObjcConfiguration j2objcConfiguration = ruleContext.getFragment(J2ObjcConfiguration.class); + J2ObjcConfiguration j2objcConfiguration = + buildConfiguration.getFragment(J2ObjcConfiguration.class); // Only perform J2ObjC dead code stripping if flag --j2objc_dead_code_removal is specified and // users have specified entry classes. return j2objcConfiguration.removeDeadCode() && !provider.getEntryClasses().isEmpty(); @@ -790,7 +802,7 @@ public final class CompilationSupport { */ CompilationSupport registerGenerateModuleMapAction( Optional<CompilationArtifacts> compilationArtifacts) { - if (ObjcRuleClasses.objcConfiguration(ruleContext).moduleMapsEnabled()) { + if (objcConfiguration.moduleMapsEnabled()) { // TODO(bazel-team): Include textual headers in the module map when Xcode 6 support is // dropped. Iterable<Artifact> publicHeaders = attributes.hdrs(); @@ -845,8 +857,6 @@ public final class CompilationSupport { Optional<Artifact> dsymBundleZip, Iterable<Artifact> prunedJ2ObjcArchives, Optional<Artifact> linkmap) { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); - // When compilation_mode=opt and objc_enable_binary_stripping are specified, the unstripped // binary containing debug symbols is generated by the linker, which also needs the debug // symbols for dead-code removal. The binary is also used to generate dSYM bundle if @@ -870,7 +880,8 @@ public final class CompilationSupport { bazelBuiltLibraries, linkmap); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("ObjcLink") .setShellCommand(ImmutableList.of("/bin/bash", "-c")) .setCommandLine(new SingleArgCommandLine(commandLine)) @@ -902,7 +913,8 @@ public final class CompilationSupport { Artifact strippedBinary = intermediateArtifacts.strippedSingleArchitectureBinary(); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("ObjcBinarySymbolStrip") .setExecutable(xcrunwrapper(ruleContext)) .setCommandLine(symbolStripCommandLine(stripArgs, binaryToLink, strippedBinary)) @@ -966,8 +978,6 @@ public final class CompilationSupport { Iterable<Artifact> ccLibraries, Iterable<Artifact> bazelBuiltLibraries, Optional<Artifact> linkmap) { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); - AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); Iterable<String> libraryNames = libraryNames(objcProvider); CustomCommandLine.Builder commandLine = CustomCommandLine.builder() @@ -1019,7 +1029,7 @@ public final class CompilationSupport { .add(extraLinkArgs) .add(objcProvider.get(ObjcProvider.LINKOPT)); - if (ruleContext.getConfiguration().isCodeCoverageEnabled()) { + if (buildConfiguration.isCodeCoverageEnabled()) { commandLine.add(LINKER_COVERAGE_FLAGS); } @@ -1155,7 +1165,8 @@ public final class CompilationSupport { paramFile, commandLine, ParameterFile.ParameterFileType.UNQUOTED, ISO_8859_1)); - ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext) + ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder( + ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("DummyPruner") .setExecutable(pruner) .addInput(dummyArchive) @@ -1181,7 +1192,6 @@ public final class CompilationSupport { * @return this compilation support */ CompilationSupport addXcodeSettings(Builder xcodeProviderBuilder, ObjcCommon common) { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); for (CompilationArtifacts artifacts : common.getCompilationArtifacts().asSet()) { xcodeProviderBuilder.setCompilationArtifacts(artifacts); } @@ -1205,7 +1215,7 @@ public final class CompilationSupport { xcodeProviderBuilder .addHeaders(attributes.hdrs()) .addHeaders(attributes.textualHdrs()) - .addUserHeaderSearchPaths(ObjcCommon.userHeaderSearchPaths(ruleContext.getConfiguration())) + .addUserHeaderSearchPaths(ObjcCommon.userHeaderSearchPaths(buildConfiguration)) .addHeaderSearchPaths("$(WORKSPACE_ROOT)", attributes.headerSearchPaths()) .addHeaderSearchPaths("$(WORKSPACE_ROOT)", includeSystemPaths) .addHeaderSearchPaths("$(SDKROOT)/usr/include", attributes.sdkIncludes()) @@ -1255,8 +1265,6 @@ public final class CompilationSupport { } private CompilationSupport registerDsymActions(DsymOutputType dsymOutputType) { - ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); - Artifact tempDsymBundleZip = intermediateArtifacts.tempDsymBundleZip(dsymOutputType); Artifact linkedBinary = objcConfiguration.shouldStripBinary() @@ -1327,7 +1335,7 @@ public final class CompilationSupport { private String getModuleName() { // If we have module maps support, we need to use the generated module name, this way // clang can properly load objc part of the module via -import-underlying-module command. - if (ObjcRuleClasses.objcConfiguration(ruleContext).moduleMapsEnabled()) { + if (objcConfiguration.moduleMapsEnabled()) { return intermediateArtifacts.moduleMap().getName(); } // Otherwise, just use target name, it doesn't matter. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java index 9da81f83c4..b86f124d87 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.rules.cpp.CppModuleMap; import com.google.devtools.build.lib.util.Preconditions; @@ -41,16 +42,23 @@ public final class IntermediateArtifacts { static final String DSYM_ZIP_EXTENSION = ".temp.zip"; private final RuleContext ruleContext; + private final BuildConfiguration buildConfiguration; private final String archiveFileNameSuffix; private final String outputPrefix; + IntermediateArtifacts(RuleContext ruleContext, String archiveFileNameSuffix, + String outputPrefix) { + this(ruleContext, archiveFileNameSuffix, outputPrefix, ruleContext.getConfiguration()); + } + IntermediateArtifacts(RuleContext ruleContext, String archiveFileNameSuffix) { - this(ruleContext, archiveFileNameSuffix, ""); + this(ruleContext, archiveFileNameSuffix, "", ruleContext.getConfiguration()); } IntermediateArtifacts(RuleContext ruleContext, String archiveFileNameSuffix, - String outputPrefix) { + String outputPrefix, BuildConfiguration buildConfiguration) { this.ruleContext = ruleContext; + this.buildConfiguration = buildConfiguration; this.archiveFileNameSuffix = Preconditions.checkNotNull(archiveFileNameSuffix); this.outputPrefix = Preconditions.checkNotNull(outputPrefix); } @@ -67,7 +75,7 @@ public final class IntermediateArtifacts { ruleContext.getDerivedArtifact( entitlementsDirectory.replaceName( addOutputPrefix(entitlementsDirectory.getBaseName(), extension)), - ruleContext.getConfiguration().getBinDirectory()); + buildConfiguration.getBinDirectory()); return artifact; } @@ -180,8 +188,8 @@ public final class IntermediateArtifacts { private Artifact scopedArtifact(PathFragment scopeRelative, boolean inGenfiles) { Root root = inGenfiles - ? ruleContext.getConfiguration().getGenfilesDirectory() - : ruleContext.getConfiguration().getBinDirectory(); + ? buildConfiguration.getGenfilesDirectory() + : buildConfiguration.getBinDirectory(); // The path of this artifact will be RULE_PACKAGE/SCOPERELATIVE return ruleContext.getPackageRelativeArtifact(scopeRelative, root); @@ -385,7 +393,7 @@ public final class IntermediateArtifacts { * {@link CppModuleMap} that provides the clang module map for this target. */ public CppModuleMap moduleMap() { - if (!ObjcRuleClasses.objcConfiguration(ruleContext).moduleMapsEnabled()) { + if (!buildConfiguration.getFragment(ObjcConfiguration.class).moduleMapsEnabled()) { throw new IllegalStateException(); } String moduleName = diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java index cb33acb6ec..3b7d8c0f29 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java @@ -74,6 +74,22 @@ public class ObjcRuleClasses { throw new UnsupportedOperationException("static-only"); } + /** + * Creates and returns an {@link IntermediateArtifacts} object, using the given rule context + * for fetching current-rule attributes, and using the given build configuration to determine + * the appropriate output directory in which to root artifacts. + */ + public static IntermediateArtifacts intermediateArtifacts(RuleContext ruleContext, + BuildConfiguration buildConfiguration) { + return new IntermediateArtifacts(ruleContext, /*archiveFileNameSuffix*/ "", + /*outputPrefix*/ "", buildConfiguration); + } + + /** + * Creates and returns an {@link IntermediateArtifacts} object, using the given rule context + * for fetching current-rule attributes and the current rule's configuration for determining the + * appropriate output output directory in which to root artifacts. + */ public static IntermediateArtifacts intermediateArtifacts(RuleContext ruleContext) { return new IntermediateArtifacts(ruleContext, /*archiveFileNameSuffix=*/ ""); } @@ -195,6 +211,8 @@ public class ObjcRuleClasses { * order to run, require both a darwin architecture and a collection of environment variables * which contain information about the target and host architectures. */ + // TODO(cparsons): Refactor this method to take the configuration fragment instead of + // retrieving it from the rule context. static SpawnAction.Builder spawnAppleEnvActionBuilder(RuleContext ruleContext, Platform targetPlatform) { AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); |