use of org.gradle.language.nativeplatform.internal.Names in project gradle by gradle.
the class XCTestConventionPlugin method configureTestSuiteBuildingTasks.
private void configureTestSuiteBuildingTasks(ProjectInternal project, final DefaultSwiftXCTestBinary binary) {
if (binary instanceof SwiftXCTestBundle) {
TaskContainer tasks = project.getTasks();
final Names names = binary.getNames();
SwiftCompile compile = binary.getCompileTask().get();
// TODO - creating a bundle should be done by some general purpose plugin
// TODO - make this lazy
DefaultNativePlatform currentPlatform = new DefaultNativePlatform("current");
final ModelRegistry modelRegistry = project.getModelRegistry();
NativeToolChain toolChain = modelRegistry.realize("toolChains", NativeToolChainRegistryInternal.class).getForPlatform(currentPlatform);
// Platform specific arguments
compile.getCompilerArgs().addAll(project.provider(new Callable<List<String>>() {
@Override
public List<String> call() {
File frameworkDir = new File(sdkPlatformPathLocator.find(), "Developer/Library/Frameworks");
return Arrays.asList("-parse-as-library", "-F" + frameworkDir.getAbsolutePath());
}
}));
// Add a link task
final LinkMachOBundle link = tasks.create(names.getTaskName("link"), LinkMachOBundle.class);
link.getLinkerArgs().set(project.provider(new Callable<List<String>>() {
@Override
public List<String> call() {
File frameworkDir = new File(sdkPlatformPathLocator.find(), "Developer/Library/Frameworks");
return Lists.newArrayList("-F" + frameworkDir.getAbsolutePath(), "-framework", "XCTest", "-Xlinker", "-rpath", "-Xlinker", "@executable_path/../Frameworks", "-Xlinker", "-rpath", "-Xlinker", "@loader_path/../Frameworks");
}
}));
InstallXCTestBundle install = tasks.create(names.getTaskName("install"), InstallXCTestBundle.class);
install.getBundleBinaryFile().set(link.getLinkedFile());
install.getInstallDirectory().set(project.getLayout().getBuildDirectory().dir("install/" + names.getDirName()));
binary.getInstallDirectory().set(install.getInstallDirectory());
link.source(binary.getObjects());
link.lib(binary.getLinkLibraries());
final PlatformToolProvider toolProvider = ((NativeToolChainInternal) toolChain).select(currentPlatform);
Provider<RegularFile> exeLocation = project.getLayout().getBuildDirectory().file(project.getProviders().provider(new Callable<String>() {
@Override
public String call() {
return toolProvider.getExecutableName("exe/" + names.getDirName() + binary.getBaseName().get());
}
}));
link.getLinkedFile().set(exeLocation);
link.getTargetPlatform().set(currentPlatform);
link.getToolChain().set(toolChain);
link.getDebuggable().set(binary.isDebuggable());
binary.getExecutableFile().set(link.getLinkedFile());
DefaultSwiftXCTestBundle bundle = (DefaultSwiftXCTestBundle) binary;
bundle.getLinkTask().set(link);
bundle.getRunScriptFile().set(install.getRunScriptFile());
} else {
DefaultSwiftXCTestExecutable executable = (DefaultSwiftXCTestExecutable) binary;
executable.getRunScriptFile().set(executable.getInstallTask().get().getRunScriptFile());
}
}
use of org.gradle.language.nativeplatform.internal.Names in project gradle by gradle.
the class NativeBasePlugin method addLifecycleTasks.
private void addLifecycleTasks(final TaskContainer tasks, final SoftwareComponentContainer components) {
components.withType(ComponentWithBinaries.class, new Action<ComponentWithBinaries>() {
@Override
public void execute(final ComponentWithBinaries component) {
// Register each child of each component
component.getBinaries().whenElementKnown(new Action<SoftwareComponent>() {
@Override
public void execute(SoftwareComponent binary) {
components.add(binary);
}
});
if (component instanceof ProductionComponent) {
// Add an assemble task for each binary and also wire the development binary in to the `assemble` task
component.getBinaries().whenElementFinalized(ComponentWithOutputs.class, new Action<ComponentWithOutputs>() {
@Override
public void execute(ComponentWithOutputs binary) {
// Determine which output to produce at development time.
FileCollection outputs = binary.getOutputs();
Names names = ((ComponentWithNames) binary).getNames();
Task lifecycleTask = tasks.create(names.getTaskName("assemble"));
lifecycleTask.dependsOn(outputs);
if (binary == ((ProductionComponent) component).getDevelopmentBinary().get()) {
tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(outputs);
}
}
});
}
}
});
}
use of org.gradle.language.nativeplatform.internal.Names in project gradle by gradle.
the class SwiftApplicationPlugin method apply.
@Override
public void apply(final ProjectInternal project) {
project.getPluginManager().apply(SwiftBasePlugin.class);
final ConfigurationContainer configurations = project.getConfigurations();
// Add the application and extension
final DefaultSwiftApplication application = componentFactory.newInstance(SwiftApplication.class, DefaultSwiftApplication.class, "main");
project.getExtensions().add(SwiftApplication.class, "application", application);
project.getComponents().add(application);
// Setup component
application.getModule().set(GUtil.toCamelCase(project.getName()));
project.afterEvaluate(new Action<Project>() {
@Override
public void execute(final Project project) {
final ObjectFactory objectFactory = project.getObjects();
// Add outgoing APIs
// TODO - remove this
final Configuration implementation = application.getImplementationDependencies();
final Usage apiUsage = objectFactory.named(Usage.class, Usage.SWIFT_API);
application.getBinaries().whenElementKnown(SwiftExecutable.class, new Action<SwiftExecutable>() {
@Override
public void execute(SwiftExecutable executable) {
Names names = ((ComponentWithNames) executable).getNames();
Configuration apiElements = configurations.create(names.withSuffix("SwiftApiElements"));
apiElements.extendsFrom(implementation);
apiElements.setCanBeResolved(false);
apiElements.getAttributes().attribute(Usage.USAGE_ATTRIBUTE, apiUsage);
apiElements.getAttributes().attribute(DEBUGGABLE_ATTRIBUTE, executable.isDebuggable());
apiElements.getAttributes().attribute(OPTIMIZED_ATTRIBUTE, executable.isOptimized());
apiElements.getAttributes().attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objectFactory.named(OperatingSystemFamily.class, ((OperatingSystemInternal) executable.getTargetPlatform().getOperatingSystem()).toFamilyName()));
apiElements.getOutgoing().artifact(executable.getModuleFile());
}
});
Set<OperatingSystemFamily> operatingSystemFamilies = Collections.singleton(objectFactory.named(OperatingSystemFamily.class, DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName()));
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.getModule(), group, version, buildType.isDebuggable(), buildType.isOptimized(), operatingSystem, null, new DefaultUsageContext(variantName + "-runtime", runtimeUsage, runtimeAttributes));
if (DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName().equals(operatingSystem.getName())) {
ToolChainSelector.Result<SwiftPlatform> result = toolChainSelector.select(SwiftPlatform.class);
SwiftExecutable executable = application.addExecutable(variantIdentity, buildType == BuildType.DEBUG, result.getTargetPlatform(), result.getToolChain(), result.getPlatformToolProvider());
// Use the debug variant as the development binary
if (buildType == BuildType.DEBUG) {
application.getDevelopmentBinary().set(executable);
}
}
}
}
// Configure the binaries
application.getBinaries().realizeNow();
}
});
}
use of org.gradle.language.nativeplatform.internal.Names in project gradle by gradle.
the class NativeBasePlugin method addTasksForComponentWithExecutable.
private void addTasksForComponentWithExecutable(final TaskContainer tasks, final DirectoryProperty buildDirectory, SoftwareComponentContainer components) {
components.withType(ConfigurableComponentWithExecutable.class, executable -> {
final Names names = executable.getNames();
final NativeToolChain toolChain = executable.getToolChain();
final NativePlatform targetPlatform = executable.getNativePlatform();
final PlatformToolProvider toolProvider = executable.getPlatformToolProvider();
// Add a link task
TaskProvider<LinkExecutable> link = tasks.register(names.getTaskName("link"), LinkExecutable.class, task -> {
task.source(executable.getObjects());
task.lib(executable.getLinkLibraries());
task.getLinkedFile().set(buildDirectory.file(executable.getBaseName().map(baseName -> toolProvider.getExecutableName("exe/" + names.getDirName() + baseName))));
task.getTargetPlatform().set(targetPlatform);
task.getToolChain().set(toolChain);
task.getDebuggable().set(executable.isDebuggable());
});
executable.getLinkTask().set(link);
executable.getDebuggerExecutableFile().set(link.flatMap(linkExecutable -> linkExecutable.getLinkedFile()));
if (executable.isDebuggable() && executable.isOptimized() && toolProvider.requiresDebugBinaryStripping()) {
Provider<RegularFile> symbolLocation = buildDirectory.file(executable.getBaseName().map(baseName -> toolProvider.getExecutableSymbolFileName("exe/" + names.getDirName() + "stripped/" + baseName)));
Provider<RegularFile> strippedLocation = buildDirectory.file(executable.getBaseName().map(baseName -> toolProvider.getExecutableName("exe/" + names.getDirName() + "stripped/" + baseName)));
TaskProvider<StripSymbols> stripSymbols = stripSymbols(link, names, tasks, toolChain, targetPlatform, strippedLocation);
executable.getExecutableFile().set(stripSymbols.flatMap(task -> task.getOutputFile()));
TaskProvider<ExtractSymbols> extractSymbols = extractSymbols(link, names, tasks, toolChain, targetPlatform, symbolLocation);
executable.getOutputs().from(extractSymbols.flatMap(task -> task.getSymbolFile()));
executable.getExecutableFileProducer().set(stripSymbols);
} else {
executable.getExecutableFile().set(link.flatMap(task -> task.getLinkedFile()));
executable.getExecutableFileProducer().set(link);
}
// Add an install task
// TODO - should probably not add this for all executables?
// TODO - add stripped symbols to the installation
final TaskProvider<InstallExecutable> install = tasks.register(names.getTaskName("install"), InstallExecutable.class, task -> {
task.getTargetPlatform().set(targetPlatform);
task.getToolChain().set(toolChain);
task.getInstallDirectory().set(buildDirectory.dir("install/" + names.getDirName()));
task.getExecutableFile().set(executable.getExecutableFile());
task.lib(executable.getRuntimeLibraries());
});
executable.getInstallTask().set(install);
executable.getInstallDirectory().set(install.flatMap(task -> task.getInstallDirectory()));
executable.getOutputs().from(executable.getInstallDirectory());
executable.getDebuggerExecutableFile().set(install.flatMap(task -> task.getInstalledExecutable()));
});
}
use of org.gradle.language.nativeplatform.internal.Names in project gradle by gradle.
the class NativeBasePlugin method addOutgoingConfigurationForRuntimeUsage.
private void addOutgoingConfigurationForRuntimeUsage(SoftwareComponentContainer components, final ConfigurationContainer configurations) {
components.withType(ConfigurableComponentWithRuntimeUsage.class, component -> {
Names names = component.getNames();
Configuration runtimeElements = configurations.create(names.withSuffix("runtimeElements"));
runtimeElements.extendsFrom(component.getImplementationDependencies());
runtimeElements.setCanBeResolved(false);
AttributeContainer attributes = component.getRuntimeAttributes();
copyAttributesTo(attributes, runtimeElements);
if (component.hasRuntimeFile()) {
runtimeElements.getOutgoing().artifact(component.getRuntimeFile());
}
component.getRuntimeElements().set(runtimeElements);
});
}
Aggregations