use of org.gradle.api.specs.Spec 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.specs.Spec in project gradle by gradle.
the class IvyPublishPlugin method disableGradleMetadataGenerationIfCustomLayout.
private void disableGradleMetadataGenerationIfCustomLayout(NamedDomainObjectList<IvyArtifactRepository> repositories, GenerateModuleMetadata generateTask) {
AtomicBoolean didWarn = new AtomicBoolean();
Spec<? super Task> checkStandardLayout = task -> {
boolean standard = repositories.stream().allMatch(this::hasStandardPattern);
if (!standard && !didWarn.getAndSet(true)) {
LOGGER.warn("Publication of Gradle Module Metadata is disabled because you have configured an Ivy repository with a non-standard layout");
}
return standard;
};
Spec<TaskInternal> spec = new AndSpec<TaskInternal>(generateTask.getOnlyIf(), checkStandardLayout);
generateTask.setOnlyIf(Cast.<Spec<? super Task>>uncheckedCast(spec));
}
use of org.gradle.api.specs.Spec in project gradle by gradle.
the class NativeSpecVisualStudioTargetBinary method getHeaderFiles.
@Override
public FileCollection getHeaderFiles() {
Spec<LanguageSourceSet> filter = new Spec<LanguageSourceSet>() {
@Override
public boolean isSatisfiedBy(LanguageSourceSet sourceSet) {
return sourceSet instanceof HeaderExportingSourceSet;
}
};
Transformer<FileCollection, LanguageSourceSet> transform = new Transformer<FileCollection, LanguageSourceSet>() {
@Override
public FileCollection transform(LanguageSourceSet sourceSet) {
HeaderExportingSourceSet exportingSourceSet = (HeaderExportingSourceSet) sourceSet;
return exportingSourceSet.getExportedHeaders().plus(exportingSourceSet.getImplicitHeaders());
}
};
return new LanguageSourceSetCollectionAdapter(getComponentName() + " header files", binary.getInputs(), filter, transform);
}
use of org.gradle.api.specs.Spec in project gradle by gradle.
the class DefaultTaskSelector method getFilter.
public Spec<Task> getFilter(String path) {
final ResolvedTaskPath taskPath = taskPathResolver.resolvePath(path, gradle.getDefaultProject());
if (!taskPath.isQualified()) {
ProjectInternal targetProject = taskPath.getProject();
configurer.configure(targetProject);
if (taskNameResolver.tryFindUnqualifiedTaskCheaply(taskPath.getTaskName(), taskPath.getProject())) {
// An exact match in the target project - can just filter tasks by path to avoid configuring sub-projects at this point
return new TaskPathSpec(targetProject, taskPath.getTaskName());
}
}
final Set<Task> selectedTasks = getSelection(path, gradle.getDefaultProject()).getTasks();
return new Spec<Task>() {
@Override
public boolean isSatisfiedBy(Task element) {
return !selectedTasks.contains(element);
}
};
}
use of org.gradle.api.specs.Spec in project gradle by gradle.
the class LocalTaskNodeExecutor method detectMissingDependencies.
private void detectMissingDependencies(LocalTaskNode node, boolean historyMaintained, ExecutionNodeAccessHierarchies.InputNodeAccessHierarchy inputHierarchy, TypeValidationContext validationContext) {
for (String outputPath : node.getMutationInfo().outputPaths) {
inputHierarchy.getNodesAccessing(outputPath).stream().filter(consumerNode -> hasNoSpecifiedOrder(node, consumerNode)).filter(LocalTaskNodeExecutor::isEnabled).forEach(consumerWithoutDependency -> collectValidationProblem(node, consumerWithoutDependency, validationContext, outputPath));
}
Set<String> taskInputs = new LinkedHashSet<>();
Set<FilteredTree> filteredFileTreeTaskInputs = new LinkedHashSet<>();
node.getTaskProperties().getInputFileProperties().forEach(spec -> {
try {
spec.getPropertyFiles().visitStructure(new FileCollectionStructureVisitor() {
@Override
public void visitCollection(FileCollectionInternal.Source source, Iterable<File> contents) {
contents.forEach(location -> taskInputs.add(location.getAbsolutePath()));
}
@Override
public void visitGenericFileTree(FileTreeInternal fileTree, FileSystemMirroringFileTree sourceTree) {
fileTree.forEach(location -> taskInputs.add(location.getAbsolutePath()));
}
@Override
public void visitFileTree(File root, PatternSet patterns, FileTreeInternal fileTree) {
if (patterns.isEmpty()) {
taskInputs.add(root.getAbsolutePath());
} else {
filteredFileTreeTaskInputs.add(new FilteredTree(root.getAbsolutePath(), patterns));
}
}
@Override
public void visitFileTreeBackedByFile(File file, FileTreeInternal fileTree, FileSystemMirroringFileTree sourceTree) {
taskInputs.add(file.getAbsolutePath());
}
});
} catch (Exception e) {
if (historyMaintained) {
// We would later try to snapshot the inputs anyway, no need to suppress the exception
throw e;
} else {
validationContext.visitPropertyProblem(problem -> problem.withId(ValidationProblemId.UNRESOLVABLE_INPUT).forProperty(spec.getPropertyName()).reportAs(Severity.WARNING).withDescription(() -> String.format("cannot be resolved:%n%s%n", TextUtil.indent(e.getMessage(), " "))).happensBecause("An input file collection couldn't be resolved, making it impossible to determine task inputs").addPossibleSolution("Consider using Task.dependsOn instead").documentedAt("validation_problems", "unresolvable_input"));
}
}
});
inputHierarchy.recordNodeAccessingLocations(node, taskInputs);
for (String locationConsumedByThisTask : taskInputs) {
collectValidationProblemsForConsumer(node, validationContext, locationConsumedByThisTask, outputHierarchy.getNodesAccessing(locationConsumedByThisTask));
}
for (FilteredTree filteredFileTreeInput : filteredFileTreeTaskInputs) {
Spec<FileTreeElement> spec = filteredFileTreeInput.getPatterns().getAsSpec();
inputHierarchy.recordNodeAccessingFileTree(node, filteredFileTreeInput.getRoot(), spec);
collectValidationProblemsForConsumer(node, validationContext, filteredFileTreeInput.getRoot(), outputHierarchy.getNodesAccessing(filteredFileTreeInput.getRoot(), spec));
}
}
Aggregations