/** Only works with thin binaries. */ private CxxPlatform getCxxPlatformForBuildTarget(BuildTarget target) { CxxPlatform cxxPlatform; try { cxxPlatform = cxxPlatformFlavorDomain.getValue(target.getFlavors()).or(defaultCxxPlatform); } catch (FlavorDomainException e) { throw new HumanReadableException(e, "%s: %s", target, e.getMessage()); } return cxxPlatform; }
@Override public <A extends Arg> BuildRule createBuildRule( TargetGraph targetGraph, BuildRuleParams params, BuildRuleResolver ruleResolver, A args) { // See if we're building a particular "type" of this library, and if so, extract // it as an enum. Optional<Map.Entry<Flavor, Type>> type; Optional<Map.Entry<Flavor, CxxPlatform>> platform; try { type = LIBRARY_TYPE.getFlavorAndValue(ImmutableSet.copyOf(params.getBuildTarget().getFlavors())); platform = cxxPlatforms.getFlavorAndValue(ImmutableSet.copyOf(params.getBuildTarget().getFlavors())); } catch (FlavorDomainException e) { throw new HumanReadableException("%s: %s", params.getBuildTarget(), e.getMessage()); } // If we *are* building a specific type of this lib, call into the type specific // rule builder methods. Currently, we only support building a shared lib from the // pre-existing static lib, which we do here. if (type.isPresent()) { Preconditions.checkState(type.get().getValue() == Type.EXTENSION); Preconditions.checkState(platform.isPresent()); return createExtensionBuildRule( targetGraph, params, ruleResolver, platform.get().getValue(), args); } // Otherwise, we return the generic placeholder of this library, that dependents can use // get the real build rules via querying the action graph. SourcePathResolver pathResolver = new SourcePathResolver(ruleResolver); Path baseModule = PythonUtil.getBasePath(params.getBuildTarget(), args.baseModule); return new CxxPythonExtension( params, ruleResolver, pathResolver, baseModule.resolve(getExtensionName(params.getBuildTarget()))); }