Search in sources :

Example 1 with CppExecutable

use of org.gradle.language.cpp.CppExecutable 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();
        }
    });
}
Also used : OperatingSystemFamily(org.gradle.nativeplatform.OperatingSystemFamily) Usage(org.gradle.api.attributes.Usage) Set(java.util.Set) AttributeContainer(org.gradle.api.attributes.AttributeContainer) CppExecutable(org.gradle.language.cpp.CppExecutable) NativeVariantIdentity(org.gradle.language.cpp.internal.NativeVariantIdentity) Callable(java.util.concurrent.Callable) DefaultCppApplication(org.gradle.language.cpp.internal.DefaultCppApplication) Provider(org.gradle.api.provider.Provider) Project(org.gradle.api.Project) CppPlatform(org.gradle.language.cpp.CppPlatform) ObjectFactory(org.gradle.api.model.ObjectFactory) BuildType(org.gradle.language.nativeplatform.internal.BuildType) DefaultUsageContext(org.gradle.language.cpp.internal.DefaultUsageContext)

Example 2 with CppExecutable

use of org.gradle.language.cpp.CppExecutable in project gradle by gradle.

the class CppModelBuilder method binariesFor.

private List<DefaultCppBinaryModel> binariesFor(CppComponent component, Iterable<File> headerDirs, DefaultProjectIdentifier projectIdentifier, CompilerOutputFileNamingSchemeFactory namingSchemeFactory) {
    List<File> headerDirsCopy = ImmutableList.copyOf(headerDirs);
    List<DefaultCppBinaryModel> binaries = new ArrayList<DefaultCppBinaryModel>();
    for (CppBinary binary : component.getBinaries().get()) {
        DefaultCppBinary cppBinary = (DefaultCppBinary) binary;
        PlatformToolProvider platformToolProvider = cppBinary.getPlatformToolProvider();
        CppCompile compileTask = binary.getCompileTask().get();
        List<DefaultSourceFile> sourceFiles = sourceFiles(namingSchemeFactory, platformToolProvider, compileTask.getObjectFileDir().get().getAsFile(), binary.getCppSource().getFiles());
        List<File> systemIncludes = ImmutableList.copyOf(compileTask.getSystemIncludes().getFiles());
        List<File> userIncludes = ImmutableList.copyOf(compileTask.getIncludes().getFiles());
        List<DefaultMacroDirective> macroDefines = macroDefines(compileTask);
        List<String> additionalArgs = args(compileTask.getCompilerArgs().get());
        CommandLineToolSearchResult compilerLookup = platformToolProvider.locateTool(ToolType.CPP_COMPILER);
        File compilerExe = compilerLookup.isAvailable() ? compilerLookup.getTool() : null;
        LaunchableGradleTask compileTaskModel = ToolingModelBuilderSupport.buildFromTask(new LaunchableGradleTask(), projectIdentifier, compileTask);
        DefaultCompilationDetails compilationDetails = new DefaultCompilationDetails(compileTaskModel, compilerExe, compileTask.getObjectFileDir().get().getAsFile(), sourceFiles, headerDirsCopy, systemIncludes, userIncludes, macroDefines, additionalArgs);
        if (binary instanceof CppExecutable || binary instanceof CppTestExecutable) {
            ComponentWithExecutable componentWithExecutable = (ComponentWithExecutable) binary;
            LinkExecutable linkTask = componentWithExecutable.getLinkTask().get();
            LaunchableGradleTask linkTaskModel = ToolingModelBuilderSupport.buildFromTask(new LaunchableGradleTask(), projectIdentifier, componentWithExecutable.getExecutableFileProducer().get());
            DefaultLinkageDetails linkageDetails = new DefaultLinkageDetails(linkTaskModel, componentWithExecutable.getExecutableFile().get().getAsFile(), args(linkTask.getLinkerArgs().get()));
            binaries.add(new DefaultCppExecutableModel(binary.getName(), cppBinary.getIdentity().getName(), binary.getBaseName().get(), compilationDetails, linkageDetails));
        } else if (binary instanceof CppSharedLibrary) {
            CppSharedLibrary sharedLibrary = (CppSharedLibrary) binary;
            LinkSharedLibrary linkTask = sharedLibrary.getLinkTask().get();
            LaunchableGradleTask linkTaskModel = ToolingModelBuilderSupport.buildFromTask(new LaunchableGradleTask(), projectIdentifier, sharedLibrary.getLinkFileProducer().get());
            DefaultLinkageDetails linkageDetails = new DefaultLinkageDetails(linkTaskModel, sharedLibrary.getLinkFile().get().getAsFile(), args(linkTask.getLinkerArgs().get()));
            binaries.add(new DefaultCppSharedLibraryModel(binary.getName(), cppBinary.getIdentity().getName(), binary.getBaseName().get(), compilationDetails, linkageDetails));
        } else if (binary instanceof CppStaticLibrary) {
            CppStaticLibrary staticLibrary = (CppStaticLibrary) binary;
            LaunchableGradleTask createTaskModel = ToolingModelBuilderSupport.buildFromTask(new LaunchableGradleTask(), projectIdentifier, staticLibrary.getLinkFileProducer().get());
            DefaultLinkageDetails linkageDetails = new DefaultLinkageDetails(createTaskModel, staticLibrary.getLinkFile().get().getAsFile(), Collections.<String>emptyList());
            binaries.add(new DefaultCppStaticLibraryModel(binary.getName(), cppBinary.getIdentity().getName(), binary.getBaseName().get(), compilationDetails, linkageDetails));
        }
    }
    return binaries;
}
Also used : ArrayList(java.util.ArrayList) LinkSharedLibrary(org.gradle.nativeplatform.tasks.LinkSharedLibrary) CppStaticLibrary(org.gradle.language.cpp.CppStaticLibrary) CommandLineToolSearchResult(org.gradle.nativeplatform.toolchain.internal.tools.CommandLineToolSearchResult) CppSharedLibrary(org.gradle.language.cpp.CppSharedLibrary) ComponentWithExecutable(org.gradle.language.nativeplatform.ComponentWithExecutable) DefaultCppBinary(org.gradle.language.cpp.internal.DefaultCppBinary) CppBinary(org.gradle.language.cpp.CppBinary) CppExecutable(org.gradle.language.cpp.CppExecutable) DefaultCppBinary(org.gradle.language.cpp.internal.DefaultCppBinary) LaunchableGradleTask(org.gradle.plugins.ide.internal.tooling.model.LaunchableGradleTask) LinkExecutable(org.gradle.nativeplatform.tasks.LinkExecutable) PlatformToolProvider(org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider) CppCompile(org.gradle.language.cpp.tasks.CppCompile) File(java.io.File) CppTestExecutable(org.gradle.nativeplatform.test.cpp.CppTestExecutable)

Aggregations

CppExecutable (org.gradle.language.cpp.CppExecutable)2 File (java.io.File)1 ArrayList (java.util.ArrayList)1 Set (java.util.Set)1 Callable (java.util.concurrent.Callable)1 Project (org.gradle.api.Project)1 AttributeContainer (org.gradle.api.attributes.AttributeContainer)1 Usage (org.gradle.api.attributes.Usage)1 ObjectFactory (org.gradle.api.model.ObjectFactory)1 Provider (org.gradle.api.provider.Provider)1 CppBinary (org.gradle.language.cpp.CppBinary)1 CppPlatform (org.gradle.language.cpp.CppPlatform)1 CppSharedLibrary (org.gradle.language.cpp.CppSharedLibrary)1 CppStaticLibrary (org.gradle.language.cpp.CppStaticLibrary)1 DefaultCppApplication (org.gradle.language.cpp.internal.DefaultCppApplication)1 DefaultCppBinary (org.gradle.language.cpp.internal.DefaultCppBinary)1 DefaultUsageContext (org.gradle.language.cpp.internal.DefaultUsageContext)1 NativeVariantIdentity (org.gradle.language.cpp.internal.NativeVariantIdentity)1 CppCompile (org.gradle.language.cpp.tasks.CppCompile)1 ComponentWithExecutable (org.gradle.language.nativeplatform.ComponentWithExecutable)1