blob: f37fc57719e9af94667813f2f5447a6adb3fe90b [file] [log] [blame]
Brian Silverman41cdd3e2019-01-19 19:48:58 -08001import java.io.ByteArrayOutputStream;
2import java.io.File;
3import java.io.IOException;
4import java.lang.reflect.Field;
5import java.nio.file.Files;
6import java.util.ArrayList;
7import java.util.List;
8
9import org.gradle.api.GradleException;
10import org.gradle.api.Plugin;
11import org.gradle.api.Project;
12import org.gradle.api.Task;
13import org.gradle.api.file.FileTree;
14import org.gradle.api.tasks.compile.JavaCompile;
15import org.gradle.language.base.internal.ProjectLayout;
16import org.gradle.language.base.plugins.ComponentModelBasePlugin;
17import org.gradle.language.nativeplatform.tasks.AbstractNativeSourceCompileTask;
18import org.gradle.model.ModelMap;
19import org.gradle.model.Mutate;
20import org.gradle.model.RuleSource;
21import org.gradle.model.Validate;
22import org.gradle.nativeplatform.NativeBinarySpec;
23import org.gradle.nativeplatform.NativeComponentSpec;
24import org.gradle.nativeplatform.NativeLibrarySpec;
25import org.gradle.nativeplatform.SharedLibraryBinarySpec;
26import org.gradle.nativeplatform.StaticLibraryBinarySpec;
27import org.gradle.nativeplatform.platform.internal.NativePlatformInternal;
28import org.gradle.nativeplatform.toolchain.NativeToolChain;
29import org.gradle.nativeplatform.toolchain.NativeToolChainRegistry;
30import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider;
31import org.gradle.nativeplatform.toolchain.internal.ToolType;
32import org.gradle.nativeplatform.toolchain.internal.gcc.AbstractGccCompatibleToolChain;
33import org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppToolChain;
34import org.gradle.nativeplatform.toolchain.internal.tools.ToolRegistry;
35import org.gradle.platform.base.BinarySpec;
36import org.gradle.platform.base.ComponentSpec;
37import org.gradle.platform.base.ComponentSpecContainer;
38import org.gradle.platform.base.BinaryContainer;
39import org.gradle.platform.base.ComponentType;
40import org.gradle.platform.base.TypeBuilder;
41import org.gradle.nativeplatform.tasks.ObjectFilesToBinary;
42import groovy.transform.CompileStatic;
43
44@CompileStatic
45class SingleNativeBuild implements Plugin<Project> {
46 @CompileStatic
47 public void apply(Project project) {
48
49 }
50
51 @CompileStatic
52 static class Rules extends RuleSource {
53 @Mutate
54 @CompileStatic
55 void setupSingleNativeBuild(ModelMap<Task> tasks, ComponentSpecContainer components, BinaryContainer binaryContainer, ProjectLayout projectLayout) {
56 Project project = (Project) projectLayout.projectIdentifier;
57
58 def nativeName = project.extensions.extraProperties.get('nativeName')
59
60 NativeLibrarySpec base = null
61 def subs = []
62 components.each { component ->
63 if (component.name == "${nativeName}Base") {
64 base = (NativeLibrarySpec) component
65 } else if (component.name == "${nativeName}" || component.name == "${nativeName}JNI") {
66 subs << component
67 }
68 }
69 subs.each {
70 ((NativeLibrarySpec) it).binaries.each { oBinary ->
71 if (oBinary.buildable == false) {
72 return
73 }
74 NativeBinarySpec binary = (NativeBinarySpec) oBinary
75 NativeBinarySpec baseBin = null
76 base.binaries.each { oTmpBaseBin ->
77 if (oTmpBaseBin.buildable == false) {
78 return
79 }
80 def tmpBaseBin = (NativeBinarySpec) oTmpBaseBin
81 if (tmpBaseBin.targetPlatform.operatingSystem.name == binary.targetPlatform.operatingSystem.name &&
82 tmpBaseBin.targetPlatform.architecture.name == binary.targetPlatform.architecture.name &&
83 tmpBaseBin.buildType == binary.buildType) {
84 baseBin = tmpBaseBin
85 }
86 }
87 baseBin.tasks.withType(AbstractNativeSourceCompileTask) { oCompileTask ->
88 def compileTask = (AbstractNativeSourceCompileTask) oCompileTask
89 if (binary instanceof SharedLibraryBinarySpec) {
90 def sBinary = (SharedLibraryBinarySpec) binary
91 ObjectFilesToBinary link = (ObjectFilesToBinary) sBinary.tasks.link
92 link.dependsOn compileTask
93 link.inputs.dir compileTask.objectFileDir
94 def tree = project.fileTree(compileTask.objectFileDir)
95 tree.include '**/*.o'
96 tree.include '**/*.obj'
97 link.source tree
98 } else if (binary instanceof StaticLibraryBinarySpec) {
99 def sBinary = (StaticLibraryBinarySpec) binary
100 ObjectFilesToBinary assemble = (ObjectFilesToBinary) sBinary.tasks.createStaticLib
101 assemble.dependsOn compileTask
102 assemble.inputs.dir compileTask.objectFileDir
103 def tree = project.fileTree(compileTask.objectFileDir)
104 tree.include '**/*.o'
105 tree.include '**/*.obj'
106 assemble.source tree
107 }
108 }
109 }
110 }
111 }
112 }
113}