use of org.gradle.api.provider.Provider in project gradle by gradle.
the class DefaultFileCollectionResolveContext method doResolve.
private <T> List<T> doResolve(Converter<? extends T> converter) {
List<T> result = new ArrayList<T>();
while (!queue.isEmpty()) {
Object element = queue.remove(0);
// TODO - need to sync with BuildDependenciesOnlyFileCollectionResolveContext
if (element instanceof DefaultFileCollectionResolveContext) {
DefaultFileCollectionResolveContext nestedContext = (DefaultFileCollectionResolveContext) element;
converter.convertInto(nestedContext, result, fileResolver);
} else if (element instanceof FileCollectionContainer) {
FileCollectionContainer fileCollection = (FileCollectionContainer) element;
resolveNested(fileCollection, result, converter);
} else if (element instanceof FileCollection || element instanceof MinimalFileCollection) {
converter.convertInto(element, result, fileResolver);
} else if (element instanceof Task) {
Task task = (Task) element;
queue.add(0, task.getOutputs().getFiles());
} else if (element instanceof TaskOutputs) {
TaskOutputs outputs = (TaskOutputs) element;
queue.add(0, outputs.getFiles());
} else if (element instanceof Callable) {
Callable callable = (Callable) element;
Object callableResult = uncheckedCall(callable);
if (callableResult != null) {
queue.add(0, callableResult);
}
} else if (element instanceof Provider) {
Provider provider = (Provider) element;
Object providerResult = provider.get();
queue.add(0, providerResult);
} else if (element instanceof Path) {
queue.add(0, ((Path) element).toFile());
} else if (element instanceof Iterable) {
Iterable<?> iterable = (Iterable) element;
GUtil.addToCollection(queue.subList(0, 0), iterable);
} else if (element instanceof Object[]) {
Object[] array = (Object[]) element;
GUtil.addToCollection(queue.subList(0, 0), Arrays.asList(array));
} else {
converter.convertInto(element, result, fileResolver);
}
}
return result;
}
use of org.gradle.api.provider.Provider 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.provider.Provider 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.provider.Provider in project gradle by gradle.
the class SwiftPackageManagerExportPlugin method apply.
@Override
public void apply(final Project project) {
final GenerateSwiftPackageManagerManifest manifestTask = project.getTasks().create("generateSwiftPmManifest", GenerateSwiftPackageManagerManifest.class);
manifestTask.getManifestFile().set(project.getLayout().getProjectDirectory().file("Package.swift"));
// Defer attaching the model until all components have been (most likely) configured
// TODO - make this relationship explicit to make this more reliable and offer better diagnostics
project.afterEvaluate(new Action<Project>() {
@Override
public void execute(Project project) {
Provider<Package> products = project.getProviders().provider(new MemoizingCallable(new PackageFactory(project)));
manifestTask.getPackage().set(products);
}
});
}
Aggregations