Search in sources :

Example 1 with Usage

use of org.gradle.api.attributes.Usage in project gradle by gradle.

the class XCTestConventionPlugin method apply.

@Override
public void apply(ProjectInternal project) {
    project.getPluginManager().apply(SwiftBasePlugin.class);
    project.getPluginManager().apply(NativeTestingBasePlugin.class);
    // Create test suite component
    final DefaultSwiftXCTestSuite testComponent = createTestSuite(project);
    project.afterEvaluate(new Action<Project>() {

        @Override
        public void execute(final Project project) {
            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);
            NativeVariantIdentity debugVariant = new NativeVariantIdentity("debug" + operatingSystemSuffix, testComponent.getModule(), group, version, true, false, operatingSystem, null, new DefaultUsageContext("debug" + operatingSystemSuffix + "-runtime", runtimeUsage, attributesDebug));
            ToolChainSelector.Result<SwiftPlatform> result = toolChainSelector.select(SwiftPlatform.class);
            // Create test suite executable
            DefaultSwiftXCTestBinary binary;
            if (result.getTargetPlatform().getOperatingSystem().isMacOsX()) {
                binary = (DefaultSwiftXCTestBinary) testComponent.addBundle("executable", debugVariant, result.getTargetPlatform(), result.getToolChain(), result.getPlatformToolProvider());
            } else {
                binary = (DefaultSwiftXCTestBinary) testComponent.addExecutable("executable", debugVariant, result.getTargetPlatform(), result.getToolChain(), result.getPlatformToolProvider());
            }
            testComponent.getTestBinary().set(binary);
            // TODO: Publishing for test executable?
            final ProductionSwiftComponent mainComponent = project.getComponents().withType(ProductionSwiftComponent.class).findByName("main");
            if (mainComponent != null) {
                testComponent.getTestedComponent().set(mainComponent);
                // Test configuration extends main configuration
                testComponent.getImplementationDependencies().extendsFrom(mainComponent.getImplementationDependencies());
                project.getDependencies().add(binary.getImportPathConfiguration().getName(), project);
            }
            testComponent.getBinaries().whenElementKnown(DefaultSwiftXCTestBinary.class, new Action<DefaultSwiftXCTestBinary>() {

                @Override
                public void execute(DefaultSwiftXCTestBinary binary) {
                    // Create test suite test task
                    XCTest testingTask = createTestingTask(project);
                    binary.getRunTask().set(testingTask);
                    // Configure tasks
                    configureTestingTask(binary, testingTask);
                    configureTestSuiteBuildingTasks((ProjectInternal) project, binary);
                    configureTestSuiteWithTestedComponentWhenAvailable(project, testComponent, binary);
                }
            });
            testComponent.getBinaries().realizeNow();
        }
    });
}
Also used : OperatingSystemFamily(org.gradle.nativeplatform.OperatingSystemFamily) Usage(org.gradle.api.attributes.Usage) Action(org.gradle.api.Action) ProductionSwiftComponent(org.gradle.language.swift.ProductionSwiftComponent) AttributeContainer(org.gradle.api.attributes.AttributeContainer) NativeVariantIdentity(org.gradle.language.cpp.internal.NativeVariantIdentity) Callable(java.util.concurrent.Callable) Provider(org.gradle.api.provider.Provider) PlatformToolProvider(org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider) Project(org.gradle.api.Project) DefaultSwiftXCTestBinary(org.gradle.nativeplatform.test.xctest.internal.DefaultSwiftXCTestBinary) DefaultUsageContext(org.gradle.language.cpp.internal.DefaultUsageContext) DefaultSwiftXCTestSuite(org.gradle.nativeplatform.test.xctest.internal.DefaultSwiftXCTestSuite) SwiftPlatform(org.gradle.language.swift.SwiftPlatform) XCTest(org.gradle.nativeplatform.test.xctest.tasks.XCTest)

Example 2 with Usage

use of org.gradle.api.attributes.Usage in project gradle by gradle.

the class CppLibraryPlugin method apply.

@Override
public void apply(final ProjectInternal project) {
    project.getPluginManager().apply(CppBasePlugin.class);
    final TaskContainer tasks = project.getTasks();
    final ObjectFactory objectFactory = project.getObjects();
    final ProviderFactory providers = project.getProviders();
    // Add the library and extension
    final DefaultCppLibrary library = componentFactory.newInstance(CppLibrary.class, DefaultCppLibrary.class, "main");
    project.getExtensions().add(CppLibrary.class, "library", library);
    project.getComponents().add(library);
    // Configure the component
    library.getBaseName().set(project.getName());
    project.afterEvaluate(new Action<Project>() {

        @Override
        public void execute(final Project project) {
            library.getOperatingSystems().lockNow();
            Set<OperatingSystemFamily> operatingSystemFamilies = library.getOperatingSystems().get();
            if (operatingSystemFamilies.isEmpty()) {
                throw new IllegalArgumentException("An operating system needs to be specified for the library.");
            }
            library.getLinkage().lockNow();
            Set<Linkage> linkages = library.getLinkage().get();
            if (linkages.isEmpty()) {
                throw new IllegalArgumentException("A linkage needs to be specified for the library.");
            }
            Usage runtimeUsage = objectFactory.named(Usage.class, Usage.NATIVE_RUNTIME);
            Usage linkUsage = objectFactory.named(Usage.class, Usage.NATIVE_LINK);
            for (BuildType buildType : BuildType.DEFAULT_BUILD_TYPES) {
                for (OperatingSystemFamily operatingSystem : operatingSystemFamilies) {
                    for (Linkage linkage : linkages) {
                        String operatingSystemSuffix = createDimensionSuffix(operatingSystem, operatingSystemFamilies);
                        String linkageSuffix = createDimensionSuffix(linkage, linkages);
                        String variantName = buildType.getName() + linkageSuffix + 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(LINKAGE_ATTRIBUTE, linkage);
                        runtimeAttributes.attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, operatingSystem);
                        AttributeContainer linkAttributes = attributesFactory.mutable();
                        linkAttributes.attribute(Usage.USAGE_ATTRIBUTE, linkUsage);
                        linkAttributes.attribute(DEBUGGABLE_ATTRIBUTE, buildType.isDebuggable());
                        linkAttributes.attribute(OPTIMIZED_ATTRIBUTE, buildType.isOptimized());
                        linkAttributes.attribute(LINKAGE_ATTRIBUTE, linkage);
                        linkAttributes.attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, operatingSystem);
                        NativeVariantIdentity variantIdentity = new NativeVariantIdentity(variantName, library.getBaseName(), group, version, buildType.isDebuggable(), buildType.isOptimized(), operatingSystem, new DefaultUsageContext(variantName + "Link", linkUsage, linkAttributes), new DefaultUsageContext(variantName + "Runtime", runtimeUsage, runtimeAttributes));
                        if (DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName().equals(operatingSystem.getName())) {
                            ToolChainSelector.Result<CppPlatform> result = toolChainSelector.select(CppPlatform.class);
                            if (linkage == Linkage.SHARED) {
                                CppSharedLibrary sharedLibrary = library.addSharedLibrary(variantIdentity, result.getTargetPlatform(), result.getToolChain(), result.getPlatformToolProvider());
                                library.getMainPublication().addVariant(sharedLibrary);
                                // Use the debug shared library as the development binary
                                if (buildType == BuildType.DEBUG) {
                                    library.getDevelopmentBinary().set(sharedLibrary);
                                }
                            } else {
                                CppStaticLibrary staticLibrary = library.addStaticLibrary(variantIdentity, result.getTargetPlatform(), result.getToolChain(), result.getPlatformToolProvider());
                                library.getMainPublication().addVariant(staticLibrary);
                                if (!linkages.contains(Linkage.SHARED) && buildType == BuildType.DEBUG) {
                                    // Use the debug static library as the development binary
                                    library.getDevelopmentBinary().set(staticLibrary);
                                }
                            }
                        } else {
                            // Known, but not buildable
                            library.getMainPublication().addVariant(variantIdentity);
                        }
                    }
                }
            }
            final MainLibraryVariant mainVariant = library.getMainPublication();
            final Configuration apiElements = library.getApiElements();
            // TODO - deal with more than one header dir, e.g. generated public headers
            Provider<File> publicHeaders = providers.provider(new Callable<File>() {

                @Override
                public File call() throws Exception {
                    Set<File> files = library.getPublicHeaderDirs().getFiles();
                    if (files.size() != 1) {
                        throw new UnsupportedOperationException(String.format("The C++ library plugin currently requires exactly one public header directory, however there are %d directories configured: %s", files.size(), files));
                    }
                    return files.iterator().next();
                }
            });
            apiElements.getOutgoing().artifact(publicHeaders);
            project.getPluginManager().withPlugin("maven-publish", new Action<AppliedPlugin>() {

                @Override
                public void execute(AppliedPlugin appliedPlugin) {
                    final Zip headersZip = tasks.create("cppHeaders", Zip.class);
                    headersZip.from(library.getPublicHeaderFiles());
                    // TODO - should track changes to build directory
                    headersZip.setDestinationDir(new File(project.getBuildDir(), "headers"));
                    headersZip.setClassifier("cpp-api-headers");
                    headersZip.setArchiveName("cpp-api-headers.zip");
                    mainVariant.addArtifact(new ArchivePublishArtifact(headersZip));
                }
            });
            library.getBinaries().realizeNow();
        }
    });
}
Also used : Zip(org.gradle.api.tasks.bundling.Zip) OperatingSystemFamily(org.gradle.nativeplatform.OperatingSystemFamily) Action(org.gradle.api.Action) Set(java.util.Set) Configuration(org.gradle.api.artifacts.Configuration) CppStaticLibrary(org.gradle.language.cpp.CppStaticLibrary) AttributeContainer(org.gradle.api.attributes.AttributeContainer) Callable(java.util.concurrent.Callable) CppPlatform(org.gradle.language.cpp.CppPlatform) ObjectFactory(org.gradle.api.model.ObjectFactory) ProviderFactory(org.gradle.api.provider.ProviderFactory) DefaultUsageContext(org.gradle.language.cpp.internal.DefaultUsageContext) MainLibraryVariant(org.gradle.language.cpp.internal.MainLibraryVariant) CppSharedLibrary(org.gradle.language.cpp.CppSharedLibrary) Usage(org.gradle.api.attributes.Usage) Linkage(org.gradle.nativeplatform.Linkage) NativeVariantIdentity(org.gradle.language.cpp.internal.NativeVariantIdentity) Provider(org.gradle.api.provider.Provider) Project(org.gradle.api.Project) TaskContainer(org.gradle.api.tasks.TaskContainer) ArchivePublishArtifact(org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact) DefaultCppLibrary(org.gradle.language.cpp.internal.DefaultCppLibrary) AppliedPlugin(org.gradle.api.plugins.AppliedPlugin) File(java.io.File)

Example 3 with Usage

use of org.gradle.api.attributes.Usage 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();
        }
    });
}
Also used : OperatingSystemFamily(org.gradle.nativeplatform.OperatingSystemFamily) Usage(org.gradle.api.attributes.Usage) Action(org.gradle.api.Action) Set(java.util.Set) Configuration(org.gradle.api.artifacts.Configuration) SwiftExecutable(org.gradle.language.swift.SwiftExecutable) DefaultSwiftApplication(org.gradle.language.swift.internal.DefaultSwiftApplication) AttributeContainer(org.gradle.api.attributes.AttributeContainer) ComponentWithNames(org.gradle.language.nativeplatform.internal.ComponentWithNames) NativeVariantIdentity(org.gradle.language.cpp.internal.NativeVariantIdentity) OperatingSystemInternal(org.gradle.nativeplatform.platform.internal.OperatingSystemInternal) Callable(java.util.concurrent.Callable) Provider(org.gradle.api.provider.Provider) ComponentWithNames(org.gradle.language.nativeplatform.internal.ComponentWithNames) Names(org.gradle.language.nativeplatform.internal.Names) Project(org.gradle.api.Project) ObjectFactory(org.gradle.api.model.ObjectFactory) ConfigurationContainer(org.gradle.api.artifacts.ConfigurationContainer) BuildType(org.gradle.language.nativeplatform.internal.BuildType) DefaultUsageContext(org.gradle.language.cpp.internal.DefaultUsageContext) SwiftPlatform(org.gradle.language.swift.SwiftPlatform)

Example 4 with Usage

use of org.gradle.api.attributes.Usage in project gradle by gradle.

the class ScalaBasePlugin method apply.

@Override
public void apply(final Project project) {
    project.getPluginManager().apply(JavaBasePlugin.class);
    ScalaRuntime scalaRuntime = project.getExtensions().create(SCALA_RUNTIME_EXTENSION_NAME, ScalaRuntime.class, project);
    ScalaPluginExtension scalaPluginExtension = project.getExtensions().create(ScalaPluginExtension.class, "scala", DefaultScalaPluginExtension.class);
    Usage incrementalAnalysisUsage = objectFactory.named(Usage.class, "incremental-analysis");
    configureConfigurations(project, incrementalAnalysisUsage, scalaPluginExtension);
    configureCompileDefaults(project, scalaRuntime);
    configureSourceSetDefaults(project, incrementalAnalysisUsage, objectFactory, scalaRuntime);
    configureScaladoc(project, scalaRuntime);
}
Also used : Usage(org.gradle.api.attributes.Usage) ScalaRuntime(org.gradle.api.tasks.ScalaRuntime) DefaultScalaPluginExtension(org.gradle.api.internal.tasks.scala.DefaultScalaPluginExtension)

Example 5 with Usage

use of org.gradle.api.attributes.Usage in project gradle by gradle.

the class DefaultIvyPublication method from.

public void from(SoftwareComponent component) {
    if (this.component != null) {
        throw new InvalidUserDataException(String.format("Ivy publication '%s' cannot include multiple components", name));
    }
    this.component = (SoftwareComponentInternal) component;
    configurations.maybeCreate("default");
    Set<PublishArtifact> seenArtifacts = Sets.newHashSet();
    Set<ModuleDependency> seenDependencies = Sets.newHashSet();
    for (UsageContext usageContext : getSortedUsageContexts()) {
        Usage usage = usageContext.getUsage();
        String conf = mapUsage(usage);
        configurations.maybeCreate(conf);
        configurations.getByName("default").extend(conf);
        for (PublishArtifact publishArtifact : usageContext.getArtifacts()) {
            if (!seenArtifacts.contains(publishArtifact)) {
                seenArtifacts.add(publishArtifact);
                artifact(publishArtifact).setConf(conf);
            }
        }
        for (ModuleDependency dependency : usageContext.getDependencies()) {
            if (seenDependencies.add(dependency)) {
                // TODO: When we support multiple components or configurable dependencies, we'll need to merge the confs of multiple dependencies with same id.
                String confMapping = String.format("%s->%s", conf, dependency.getTargetConfiguration() == null ? Dependency.DEFAULT_CONFIGURATION : dependency.getTargetConfiguration());
                if (dependency instanceof ProjectDependency) {
                    addProjectDependency((ProjectDependency) dependency, confMapping);
                } else {
                    addExternalDependency((ExternalDependency) dependency, confMapping);
                }
            }
        }
    }
}
Also used : Usage(org.gradle.api.attributes.Usage) ModuleDependency(org.gradle.api.artifacts.ModuleDependency) UsageContext(org.gradle.api.internal.component.UsageContext) InvalidUserDataException(org.gradle.api.InvalidUserDataException) PublishArtifact(org.gradle.api.artifacts.PublishArtifact) ProjectDependency(org.gradle.api.artifacts.ProjectDependency)

Aggregations

Usage (org.gradle.api.attributes.Usage)10 AttributeContainer (org.gradle.api.attributes.AttributeContainer)7 DefaultUsageContext (org.gradle.language.cpp.internal.DefaultUsageContext)7 NativeVariantIdentity (org.gradle.language.cpp.internal.NativeVariantIdentity)7 Callable (java.util.concurrent.Callable)6 Project (org.gradle.api.Project)6 Provider (org.gradle.api.provider.Provider)6 Action (org.gradle.api.Action)5 OperatingSystemFamily (org.gradle.nativeplatform.OperatingSystemFamily)5 Set (java.util.Set)4 ObjectFactory (org.gradle.api.model.ObjectFactory)4 Configuration (org.gradle.api.artifacts.Configuration)3 CppPlatform (org.gradle.language.cpp.CppPlatform)3 File (java.io.File)2 Task (org.gradle.api.Task)2 Spec (org.gradle.api.specs.Spec)2 SwiftPlatform (org.gradle.language.swift.SwiftPlatform)2 TargetMachine (org.gradle.nativeplatform.TargetMachine)2 VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 ImmutableSet (com.google.common.collect.ImmutableSet)1