/* * Copyright 2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gradle.nativeplatform.internal; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import org.gradle.api.file.FileCollection; import org.gradle.api.internal.file.FileCollectionFactory; import org.gradle.language.nativeplatform.DependentSourceSet; import org.gradle.language.nativeplatform.internal.DependentSourceSetInternal; import org.gradle.nativeplatform.*; import org.gradle.nativeplatform.internal.resolve.NativeBinaryRequirementResolveResult; import org.gradle.nativeplatform.internal.resolve.NativeBinaryResolveResult; import org.gradle.nativeplatform.internal.resolve.NativeDependencyResolver; import org.gradle.nativeplatform.platform.NativePlatform; import org.gradle.nativeplatform.platform.internal.NativePlatformInternal; import org.gradle.nativeplatform.tasks.ObjectFilesToBinary; import org.gradle.nativeplatform.toolchain.NativeToolChain; import org.gradle.nativeplatform.toolchain.internal.NativeToolChainInternal; import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider; import org.gradle.nativeplatform.toolchain.internal.PreCompiledHeader; import org.gradle.platform.base.binary.BaseBinarySpec; import org.gradle.platform.base.internal.BinaryBuildAbility; import org.gradle.platform.base.internal.ToolSearchBuildAbility; import java.io.File; import java.util.*; public abstract class AbstractNativeBinarySpec extends BaseBinarySpec implements NativeBinarySpecInternal { private final Set<? super Object> libs = new LinkedHashSet<Object>(); private final Tool linker = new DefaultTool(); private final Tool staticLibArchiver = new DefaultTool(); // TODO:HH Use managed views for this, only applied when the respective language is applied private final Tool assembler = new DefaultTool(); private final PreprocessingTool cCompiler = new DefaultPreprocessingTool(); private final PreprocessingTool cppCompiler = new DefaultPreprocessingTool(); private final PreprocessingTool objcCompiler = new DefaultPreprocessingTool(); private final PreprocessingTool objcppCompiler = new DefaultPreprocessingTool(); private final PreprocessingTool rcCompiler = new DefaultPreprocessingTool(); private final Map<String, Tool> toolsByName = ImmutableMap.<String, Tool>builder() .put("assembler", assembler) .put("cCompiler", cCompiler) .put("cppCompiler", cppCompiler) .put("objcCompiler", objcCompiler) .put("objcppCompiler", objcppCompiler) .put("rcCompiler", rcCompiler) .build(); private PlatformToolProvider toolProvider; private Flavor flavor; private NativeToolChain toolChain; private NativePlatform targetPlatform; private BuildType buildType; private NativeDependencyResolver resolver; private Map<File, PreCompiledHeader> prefixFileToPCH = Maps.newHashMap(); private FileCollectionFactory fileCollectionFactory; @Override public String getDisplayName() { return getNamingScheme().getDescription(); } @Override public NativeComponentSpec getComponent() { return getComponentAs(NativeComponentSpec.class); } @Override public Flavor getFlavor() { return flavor; } @Override public void setFlavor(Flavor flavor) { this.flavor = flavor; } @Override public NativeToolChain getToolChain() { return toolChain; } @Override public void setToolChain(NativeToolChain toolChain) { this.toolChain = toolChain; } @Override public NativePlatform getTargetPlatform() { return targetPlatform; } @Override public void setTargetPlatform(NativePlatform targetPlatform) { this.targetPlatform = targetPlatform; } @Override public BuildType getBuildType() { return buildType; } @Override public void setBuildType(BuildType buildType) { this.buildType = buildType; } @Override public Tool getLinker() { return linker; } @Override public Tool getStaticLibArchiver() { return staticLibArchiver; } @Override public Tool getAssembler() { return assembler; } @Override public PreprocessingTool getcCompiler() { return cCompiler; } @Override public PreprocessingTool getCppCompiler() { return cppCompiler; } @Override public PreprocessingTool getObjcCompiler() { return objcCompiler; } @Override public PreprocessingTool getObjcppCompiler() { return objcppCompiler; } @Override public PreprocessingTool getRcCompiler() { return rcCompiler; } @Override public Tool getToolByName(String name) { return toolsByName.get(name); } @Override public Collection<NativeDependencySet> getLibs() { return resolve(getInputs().withType(DependentSourceSet.class)).getAllResults(); } @Override public Collection<NativeDependencySet> getLibs(DependentSourceSet sourceSet) { return resolve(Collections.singleton(sourceSet)).getAllResults(); } @Override public void lib(Object notation) { libs.add(notation); } @Override public Collection<NativeLibraryBinary> getDependentBinaries() { return resolve(getInputs().withType(DependentSourceSet.class)).getAllLibraryBinaries(); } @Override public Collection<NativeBinaryRequirementResolveResult> getAllResolutions() { return resolve(getInputs().withType(DependentSourceSet.class)).getAllResolutions(); } @Override public Map<File, PreCompiledHeader> getPrefixFileToPCH() { return prefixFileToPCH; } @Override public void addPreCompiledHeaderFor(DependentSourceSet sourceSet) { prefixFileToPCH.put( ((DependentSourceSetInternal)sourceSet).getPrefixHeaderFile(), new PreCompiledHeader(getIdentifier().child("pch"))); } private NativeBinaryResolveResult resolve(Iterable<? extends DependentSourceSet> sourceSets) { Set<? super Object> allLibs = new LinkedHashSet<Object>(libs); for (DependentSourceSet dependentSourceSet : sourceSets) { allLibs.addAll(dependentSourceSet.getLibs()); } NativeBinaryResolveResult resolution = new NativeBinaryResolveResult(this, allLibs); resolver.resolve(resolution); return resolution; } @Override public PlatformToolProvider getPlatformToolProvider() { return toolProvider; } @Override public void setPlatformToolProvider(PlatformToolProvider toolProvider) { this.toolProvider = toolProvider; } @Override public void setResolver(NativeDependencyResolver resolver) { this.resolver = resolver; } protected FileCollectionFactory getFileCollectionFactory() { return fileCollectionFactory; } @Override public void setFileCollectionFactory(FileCollectionFactory fileCollectionFactory) { this.fileCollectionFactory = fileCollectionFactory; } @Override protected BinaryBuildAbility getBinaryBuildAbility() { NativeToolChainInternal toolChainInternal = (NativeToolChainInternal) getToolChain(); NativePlatformInternal platformInternal = (NativePlatformInternal) getTargetPlatform(); return new ToolSearchBuildAbility(toolChainInternal.select(platformInternal)); } @Override public void binaryInputs(FileCollection files) { // TODO - should split this up, so that the inputs are attached to an object that represents the binary, which is then later used to configure the link/assemble tasks getCreateOrLink().source(files); } protected abstract ObjectFilesToBinary getCreateOrLink(); }