use of org.gradle.api.attributes.Usage in project gradle by gradle.
the class CppUnitTestPlugin method apply.
@Override
public void apply(final ProjectInternal project) {
project.getPluginManager().apply(CppBasePlugin.class);
project.getPluginManager().apply(NativeTestingBasePlugin.class);
// Add the unit test and extension
final DefaultCppTestSuite testComponent = componentFactory.newInstance(CppTestSuite.class, DefaultCppTestSuite.class, "test");
project.getExtensions().add(CppTestSuite.class, "unitTest", testComponent);
project.getComponents().add(testComponent);
testComponent.getBaseName().set(project.getName() + "Test");
project.afterEvaluate(new Action<Project>() {
@Override
public void execute(final Project project) {
testComponent.getOperatingSystems().lockNow();
Set<OperatingSystemFamily> operatingSystemFamilies = testComponent.getOperatingSystems().get();
if (operatingSystemFamilies.isEmpty()) {
throw new IllegalArgumentException("An operating system needs to be specified for the unit test.");
}
boolean hasHostOperatingSystem = CollectionUtils.any(operatingSystemFamilies, new Spec<OperatingSystemFamily>() {
@Override
public boolean isSatisfiedBy(OperatingSystemFamily element) {
return DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName().equals(element.getName());
}
});
if (hasHostOperatingSystem) {
String operatingSystemSuffix = "";
OperatingSystemFamily operatingSystem = objectFactory.named(OperatingSystemFamily.class, DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName());
Usage runtimeUsage = objectFactory.named(Usage.class, Usage.NATIVE_RUNTIME);
Provider<String> group = project.provider(new Callable<String>() {
@Override
public String call() throws Exception {
return project.getGroup().toString();
}
});
Provider<String> version = project.provider(new Callable<String>() {
@Override
public String call() throws Exception {
return project.getVersion().toString();
}
});
AttributeContainer attributesDebug = attributesFactory.mutable();
attributesDebug.attribute(Usage.USAGE_ATTRIBUTE, runtimeUsage);
attributesDebug.attribute(DEBUGGABLE_ATTRIBUTE, true);
attributesDebug.attribute(OPTIMIZED_ATTRIBUTE, false);
// TODO: Fix this naming convention to follow C++ executable/library
NativeVariantIdentity debugVariant = new NativeVariantIdentity("debug" + operatingSystemSuffix, testComponent.getBaseName(), group, version, true, false, operatingSystem, null, new DefaultUsageContext("debug" + operatingSystemSuffix + "Runtime", runtimeUsage, attributesDebug));
ToolChainSelector.Result<CppPlatform> result = toolChainSelector.select(CppPlatform.class);
testComponent.addExecutable("executable", debugVariant, result.getTargetPlatform(), result.getToolChain(), result.getPlatformToolProvider());
// TODO: Publishing for test executable?
final TaskContainer tasks = project.getTasks();
final ProductionCppComponent mainComponent = project.getComponents().withType(ProductionCppComponent.class).findByName("main");
if (mainComponent != null) {
testComponent.getTestedComponent().set(mainComponent);
}
testComponent.getBinaries().whenElementKnown(DefaultCppTestExecutable.class, new Action<DefaultCppTestExecutable>() {
@Override
public void execute(final DefaultCppTestExecutable executable) {
if (mainComponent != null) {
// TODO: This should be modeled as a kind of dependency vs wiring binaries together directly.
mainComponent.getBinaries().whenElementFinalized(new Action<CppBinary>() {
@Override
public void execute(CppBinary cppBinary) {
if (cppBinary == mainComponent.getDevelopmentBinary().get()) {
AbstractLinkTask linkTest = executable.getLinkTask().get();
linkTest.source(cppBinary.getObjects());
}
}
});
}
// TODO: Replace with native test task
final RunTestExecutable testTask = tasks.create(executable.getNames().getTaskName("run"), RunTestExecutable.class);
testTask.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP);
testTask.setDescription("Executes C++ unit tests.");
final InstallExecutable installTask = executable.getInstallTask().get();
testTask.onlyIf(new Spec<Task>() {
@Override
public boolean isSatisfiedBy(Task element) {
return executable.getInstallDirectory().get().getAsFile().exists();
}
});
testTask.setExecutable(installTask.getRunScriptFile().get().getAsFile());
testTask.dependsOn(testComponent.getTestBinary().get().getInstallDirectory());
// TODO: Honor changes to build directory
testTask.setOutputDir(project.getLayout().getBuildDirectory().dir("test-results/" + executable.getNames().getDirName()).get().getAsFile());
executable.getRunTask().set(testTask);
}
});
}
testComponent.getBinaries().realizeNow();
}
});
}
use of org.gradle.api.attributes.Usage in project gradle by gradle.
the class CppApplicationPlugin method apply.
@Override
public void apply(final ProjectInternal project) {
project.getPluginManager().apply(CppBasePlugin.class);
final ObjectFactory objectFactory = project.getObjects();
// Add the application and extension
final DefaultCppApplication application = componentFactory.newInstance(CppApplication.class, DefaultCppApplication.class, "main");
project.getExtensions().add(CppApplication.class, "application", application);
project.getComponents().add(application);
// Configure the component
application.getBaseName().set(project.getName());
project.afterEvaluate(new Action<Project>() {
@Override
public void execute(final Project project) {
application.getOperatingSystems().lockNow();
Set<OperatingSystemFamily> operatingSystemFamilies = application.getOperatingSystems().get();
if (operatingSystemFamilies.isEmpty()) {
throw new IllegalArgumentException("An operating system needs to be specified for the application.");
}
Usage runtimeUsage = objectFactory.named(Usage.class, Usage.NATIVE_RUNTIME);
for (BuildType buildType : BuildType.DEFAULT_BUILD_TYPES) {
for (OperatingSystemFamily operatingSystem : operatingSystemFamilies) {
String operatingSystemSuffix = createDimensionSuffix(operatingSystem, operatingSystemFamilies);
String variantName = buildType.getName() + operatingSystemSuffix;
Provider<String> group = project.provider(new Callable<String>() {
@Override
public String call() throws Exception {
return project.getGroup().toString();
}
});
Provider<String> version = project.provider(new Callable<String>() {
@Override
public String call() throws Exception {
return project.getVersion().toString();
}
});
AttributeContainer runtimeAttributes = attributesFactory.mutable();
runtimeAttributes.attribute(Usage.USAGE_ATTRIBUTE, runtimeUsage);
runtimeAttributes.attribute(DEBUGGABLE_ATTRIBUTE, buildType.isDebuggable());
runtimeAttributes.attribute(OPTIMIZED_ATTRIBUTE, buildType.isOptimized());
runtimeAttributes.attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, operatingSystem);
NativeVariantIdentity variantIdentity = new NativeVariantIdentity(variantName, application.getBaseName(), group, version, buildType.isDebuggable(), buildType.isOptimized(), operatingSystem, null, new DefaultUsageContext(variantName + "Runtime", runtimeUsage, runtimeAttributes));
if (DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName().equals(operatingSystem.getName())) {
ToolChainSelector.Result<CppPlatform> result = toolChainSelector.select(CppPlatform.class);
CppExecutable executable = application.addExecutable(variantIdentity, result.getTargetPlatform(), result.getToolChain(), result.getPlatformToolProvider());
// Use the debug variant as the development binary
if (buildType == BuildType.DEBUG) {
application.getDevelopmentBinary().set(executable);
}
application.getMainPublication().addVariant(executable);
} else {
// Known, but not buildable
application.getMainPublication().addVariant(variantIdentity);
}
}
}
application.getBinaries().realizeNow();
}
});
}
use of org.gradle.api.attributes.Usage in project gradle by gradle.
the class ScalaBasePlugin method configureConfigurations.
private void configureConfigurations(final Project project, final Usage incrementalAnalysisUsage, ScalaPluginExtension scalaPluginExtension) {
DependencyHandler dependencyHandler = project.getDependencies();
ConfigurationInternal plugins = (ConfigurationInternal) project.getConfigurations().create(SCALA_COMPILER_PLUGINS_CONFIGURATION_NAME);
plugins.setTransitive(false);
plugins.setCanBeConsumed(false);
jvmEcosystemUtilities.configureAsRuntimeClasspath(plugins);
Configuration zinc = project.getConfigurations().create(ZINC_CONFIGURATION_NAME);
zinc.setVisible(false);
zinc.setDescription("The Zinc incremental compiler to be used for this Scala project.");
((DeprecatableConfiguration) zinc).deprecateForConsumption(deprecation -> deprecation.willBecomeAnErrorInGradle8().withUpgradeGuideSection(7, "plugin_configuration_consumption"));
zinc.getResolutionStrategy().eachDependency(rule -> {
if (rule.getRequested().getGroup().equals("com.typesafe.zinc") && rule.getRequested().getName().equals("zinc")) {
rule.useTarget("org.scala-sbt:zinc_" + DEFAULT_SCALA_ZINC_VERSION + ":" + DEFAULT_ZINC_VERSION);
rule.because("Typesafe Zinc is no longer maintained.");
}
});
zinc.defaultDependencies(dependencies -> {
dependencies.add(dependencyHandler.create("org.scala-sbt:zinc_" + DEFAULT_SCALA_ZINC_VERSION + ":" + scalaPluginExtension.getZincVersion().get()));
// Add safeguard and clear error if the user changed the scala version when using default zinc
zinc.getIncoming().afterResolve(resolvableDependencies -> {
resolvableDependencies.getResolutionResult().allComponents(component -> {
if (component.getModuleVersion() != null && component.getModuleVersion().getName().equals("scala-library")) {
if (!component.getModuleVersion().getVersion().startsWith(DEFAULT_SCALA_ZINC_VERSION)) {
throw new InvalidUserCodeException("The version of 'scala-library' was changed while using the default Zinc version. " + "Version " + component.getModuleVersion().getVersion() + " is not compatible with org.scala-sbt:zinc_" + DEFAULT_SCALA_ZINC_VERSION + ":" + DEFAULT_ZINC_VERSION);
}
}
});
});
});
zinc.getDependencyConstraints().add(dependencyHandler.getConstraints().create(Log4jBannedVersion.LOG4J2_CORE_COORDINATES, constraint -> constraint.version(version -> {
version.require(Log4jBannedVersion.LOG4J2_CORE_REQUIRED_VERSION);
version.reject(Log4jBannedVersion.LOG4J2_CORE_VULNERABLE_VERSION_RANGE);
})));
final Configuration incrementalAnalysisElements = project.getConfigurations().create("incrementalScalaAnalysisElements");
incrementalAnalysisElements.setVisible(false);
incrementalAnalysisElements.setDescription("Incremental compilation analysis files");
incrementalAnalysisElements.setCanBeResolved(false);
incrementalAnalysisElements.setCanBeConsumed(true);
incrementalAnalysisElements.getAttributes().attribute(USAGE_ATTRIBUTE, incrementalAnalysisUsage);
AttributeMatchingStrategy<Usage> matchingStrategy = dependencyHandler.getAttributesSchema().attribute(USAGE_ATTRIBUTE);
matchingStrategy.getDisambiguationRules().add(UsageDisambiguationRules.class, actionConfiguration -> {
actionConfiguration.params(incrementalAnalysisUsage);
actionConfiguration.params(objectFactory.named(Usage.class, Usage.JAVA_API));
actionConfiguration.params(objectFactory.named(Usage.class, Usage.JAVA_RUNTIME));
});
}
use of org.gradle.api.attributes.Usage in project gradle by gradle.
the class Dimensions method variants.
private static void variants(Provider<String> baseName, Collection<BuildType> buildTypes, Collection<TargetMachine> targetMachines, ObjectFactory objectFactory, ImmutableAttributesFactory attributesFactory, // TODO: These should come from somewhere else, probably
Provider<String> group, Provider<String> version, Action<NativeVariantIdentity> action) {
for (BuildType buildType : buildTypes) {
for (TargetMachine targetMachine : targetMachines) {
Usage runtimeUsage = objectFactory.named(Usage.class, Usage.NATIVE_RUNTIME);
List<String> variantNameToken = Lists.newArrayList();
// FIXME: Always build type name to keep parity with previous Gradle version in tooling API
variantNameToken.add(buildType.getName());
variantNameToken.add(createDimensionSuffix(targetMachine.getOperatingSystemFamily(), targetMachinesToOperatingSystems(targetMachines)));
variantNameToken.add(createDimensionSuffix(targetMachine.getArchitecture(), targetMachinesToArchitectures(targetMachines)));
String variantName = StringUtils.uncapitalize(String.join("", variantNameToken));
AttributeContainer runtimeAttributes = attributesFactory.mutable();
runtimeAttributes.attribute(Usage.USAGE_ATTRIBUTE, runtimeUsage);
addCommonAttributes(buildType, targetMachine, runtimeAttributes);
DefaultUsageContext runtimeUsageContext = new DefaultUsageContext(variantName + "Runtime", runtimeAttributes);
DefaultUsageContext linkUsageContext = null;
NativeVariantIdentity variantIdentity = new NativeVariantIdentity(variantName, baseName, group, version, buildType.isDebuggable(), buildType.isOptimized(), targetMachine, linkUsageContext, runtimeUsageContext, null);
action.execute(variantIdentity);
}
}
}
use of org.gradle.api.attributes.Usage in project gradle by gradle.
the class Dimensions method variants.
private static void variants(Provider<String> baseName, Collection<BuildType> buildTypes, Collection<Linkage> linkages, Collection<TargetMachine> targetMachines, ObjectFactory objectFactory, ImmutableAttributesFactory attributesFactory, // TODO: These should come from somewhere else, probably
Provider<String> group, Provider<String> version, Action<NativeVariantIdentity> action) {
for (BuildType buildType : buildTypes) {
for (Linkage linkage : linkages) {
for (TargetMachine targetMachine : targetMachines) {
Usage runtimeUsage = objectFactory.named(Usage.class, Usage.NATIVE_RUNTIME);
Usage linkUsage = objectFactory.named(Usage.class, Usage.NATIVE_LINK);
List<String> variantNameToken = Lists.newArrayList();
// FIXME: Always build type name to keep parity with previous Gradle version in tooling API
variantNameToken.add(buildType.getName());
variantNameToken.add(createDimensionSuffix(linkage, linkages));
variantNameToken.add(createDimensionSuffix(targetMachine.getOperatingSystemFamily(), targetMachinesToOperatingSystems(targetMachines)));
variantNameToken.add(createDimensionSuffix(targetMachine.getArchitecture(), targetMachinesToArchitectures(targetMachines)));
String variantName = StringUtils.uncapitalize(String.join("", variantNameToken));
AttributeContainer runtimeAttributes = attributesFactory.mutable();
runtimeAttributes.attribute(Usage.USAGE_ATTRIBUTE, runtimeUsage);
addCommonAttributes(buildType, targetMachine, runtimeAttributes);
runtimeAttributes.attribute(LINKAGE_ATTRIBUTE, linkage);
DefaultUsageContext runtimeUsageContext = new DefaultUsageContext(variantName + "Runtime", runtimeAttributes);
AttributeContainer linkAttributes = attributesFactory.mutable();
linkAttributes.attribute(Usage.USAGE_ATTRIBUTE, linkUsage);
addCommonAttributes(buildType, targetMachine, linkAttributes);
linkAttributes.attribute(LINKAGE_ATTRIBUTE, linkage);
DefaultUsageContext linkUsageContext = new DefaultUsageContext(variantName + "Link", linkAttributes);
NativeVariantIdentity variantIdentity = new NativeVariantIdentity(variantName, baseName, group, version, buildType.isDebuggable(), buildType.isOptimized(), targetMachine, linkUsageContext, runtimeUsageContext, linkage);
action.execute(variantIdentity);
}
}
}
}
Aggregations