/* * Copyright 2015 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.configure; import org.gradle.language.base.internal.ProjectLayout; import org.gradle.model.Defaults; import org.gradle.model.RuleSource; import org.gradle.nativeplatform.*; import org.gradle.nativeplatform.internal.NativeBinarySpecInternal; import org.gradle.nativeplatform.platform.internal.NativePlatformInternal; import org.gradle.nativeplatform.toolchain.internal.NativeToolChainInternal; import org.gradle.nativeplatform.toolchain.internal.NativeToolChainRegistryInternal; import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider; import java.io.File; public class NativeBinaryRules extends RuleSource { @Defaults public static void assignTools(NativeBinarySpec nativeBinarySpec, NativeToolChainRegistryInternal toolChains, ProjectLayout projectLayout) { assignTools(nativeBinarySpec, toolChains, projectLayout.getBuildDir()); } static void assignTools(NativeBinarySpec nativeBinarySpec, NativeToolChainRegistryInternal toolChains, File buildDir) { NativeBinarySpecInternal nativeBinary = (NativeBinarySpecInternal) nativeBinarySpec; assignToolsToNativeBinary(nativeBinary, nativeBinarySpec, toolChains); assignToolsToNativeBinaryExtension(nativeBinary, buildDir); } private static void assignToolsToNativeBinary(NativeBinarySpecInternal nativeBinary, NativeBinarySpec nativeBinarySpec, NativeToolChainRegistryInternal toolChains) { NativeToolChainInternal toolChain = toolChainFor(nativeBinarySpec, toolChains); PlatformToolProvider toolProvider = toolChain.select((NativePlatformInternal) nativeBinarySpec.getTargetPlatform()); nativeBinary.setToolChain(toolChain); nativeBinary.setPlatformToolProvider(toolProvider); } private static void assignToolsToNativeBinaryExtension(NativeBinarySpecInternal nativeBinary, File buildDir) { if (nativeBinary instanceof NativeExecutableBinarySpec) { assignToolsToNativeExecutableBinary(nativeBinary, buildDir); } else if (nativeBinary instanceof SharedLibraryBinarySpec) { assignToolsToSharedLibraryBinary(nativeBinary, buildDir); } else if (nativeBinary instanceof StaticLibraryBinarySpec) { assignToolsToStaticLibraryBinary(buildDir, nativeBinary); } } private static void assignToolsToNativeExecutableBinary(NativeBinarySpecInternal nativeBinary, File buildDir) { NativeExecutableBinarySpec nativeExecutable = (NativeExecutableBinarySpec) nativeBinary; NativeExecutableFileSpec executable = nativeExecutable.getExecutable(); executable.setFile(executableFileFor(nativeBinary, buildDir)); executable.setToolChain(nativeBinary.getToolChain()); nativeExecutable.getInstallation().setDirectory(installationDirFor(nativeBinary, buildDir)); } private static void assignToolsToSharedLibraryBinary(NativeBinarySpecInternal nativeBinary, File buildDir) { SharedLibraryBinarySpec sharedLibrary = (SharedLibraryBinarySpec) nativeBinary; sharedLibrary.setSharedLibraryFile(sharedLibraryFileFor(nativeBinary, buildDir)); sharedLibrary.setSharedLibraryLinkFile(sharedLibraryLinkFileFor(nativeBinary, buildDir)); } private static void assignToolsToStaticLibraryBinary(File buildDir, NativeBinarySpecInternal nativeBinary) { StaticLibraryBinarySpec staticLibrary = (StaticLibraryBinarySpec) nativeBinary; staticLibrary.setStaticLibraryFile(staticLibraryFileFor(nativeBinary, buildDir)); } public static File executableFileFor(NativeBinarySpecInternal nativeBinary, File buildDir) { return new File(nativeBinary.getNamingScheme().getOutputDirectory(buildDir, "exe"), executableNameFor(nativeBinary)); } private static File sharedLibraryLinkFileFor(NativeBinarySpecInternal nativeBinary, File buildDir) { return new File(nativeBinary.getNamingScheme().getOutputDirectory(buildDir, "libs"), sharedLibraryLinkFileNameFor(nativeBinary)); } private static File sharedLibraryFileFor(NativeBinarySpecInternal nativeBinary, File buildDir) { return new File(nativeBinary.getNamingScheme().getOutputDirectory(buildDir, "libs"), sharedLibraryNameFor(nativeBinary)); } private static File staticLibraryFileFor(NativeBinarySpecInternal nativeBinary, File buildDir) { return new File(nativeBinary.getNamingScheme().getOutputDirectory(buildDir, "libs"), staticLibraryNameFor(nativeBinary)); } public static File installationDirFor(NativeBinarySpecInternal nativeBinary, File buildDir) { return nativeBinary.getNamingScheme().getOutputDirectory(buildDir, "install"); } private static String executableNameFor(NativeBinarySpecInternal nativeBinary) { return nativeBinary.getPlatformToolProvider().getExecutableName(baseNameOf(nativeBinary)); } private static String sharedLibraryLinkFileNameFor(NativeBinarySpecInternal nativeBinary) { return nativeBinary.getPlatformToolProvider().getSharedLibraryLinkFileName(baseNameOf(nativeBinary)); } private static String sharedLibraryNameFor(NativeBinarySpecInternal nativeBinary) { return nativeBinary.getPlatformToolProvider().getSharedLibraryName(baseNameOf(nativeBinary)); } private static String staticLibraryNameFor(NativeBinarySpecInternal nativeBinary) { return nativeBinary.getPlatformToolProvider().getStaticLibraryName(baseNameOf(nativeBinary)); } private static String baseNameOf(NativeBinarySpec nativeBinary) { return nativeBinary.getComponent().getBaseName(); } private static NativeToolChainInternal toolChainFor(NativeBinarySpec nativeBinary, NativeToolChainRegistryInternal toolChains) { return (NativeToolChainInternal) toolChains.getForPlatform(nativeBinary.getTargetPlatform()); } }