/** * Returns the xcode version number corresponding to the {@code --xcode_version} flag, if there is * an available {@code xcode_version} target which recognizes the flag value as either an official * version or an alias. Returns null if no such target is found. */ @Nullable private DottedVersion resolveExplicitlyDefinedVersion(RuleContext ruleContext) { AppleConfiguration configuration = ruleContext.getFragment(AppleConfiguration.class); Optional<DottedVersion> versionOverrideFlag = configuration.getXcodeVersionOverrideFlag(); if (versionOverrideFlag.isPresent()) { // The version override flag is not necessarily an actual version - it may be a version // alias. DottedVersion explicitVerison = aliasesToVersionMap(ruleContext).get(versionOverrideFlag.get().toString()); if (explicitVerison != null) { return explicitVerison; } } else { // No override specified. Use default. XcodeVersionProvider defaultProvider = ruleContext.getPrerequisite( XcodeConfigRule.DEFAULT_ATTR_NAME, Mode.TARGET, XcodeVersionProvider.class); if (defaultProvider != null) { return defaultProvider.getVersion(); } } boolean requireDefinedVersions = ruleContext.attributes().get(XcodeConfigRule.REQUIRE_DEFINED_VERSIONS_ATTR_NAME, BOOLEAN); if (requireDefinedVersions) { ruleContext.ruleError( "xcode version config required an explicitly defined version, but none was available"); } return null; }
@Override public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { AppleConfiguration configuration = ruleContext.getFragment(AppleConfiguration.class); Optional<DottedVersion> versionOverrideFlag = configuration.getXcodeVersionOverrideFlag(); DottedVersion targetVersion = resolveExplicitlyDefinedVersion(ruleContext); XcodeConfigProvider xcodeConfigProvider; if (targetVersion == null) { if (versionOverrideFlag.isPresent()) { xcodeConfigProvider = new XcodeConfigProvider(versionOverrideFlag.get()); } else { xcodeConfigProvider = XcodeConfigProvider.hostSystemDefault(); } } else { xcodeConfigProvider = new XcodeConfigProvider(targetVersion); } return new RuleConfiguredTargetBuilder(ruleContext) .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY) .addProvider(XcodeConfigProvider.class, xcodeConfigProvider) .build(); }