blob: 2b7e087b241621b5cb476d07d26849733b9c7bcf [file] [log] [blame]
Brian Silverman8fce7482020-01-05 13:18:21 -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;
43import edu.wpi.first.nativeutils.tasks.ExportsGenerationTask
44
45@CompileStatic
46class SingleNativeBuild implements Plugin<Project> {
47 @CompileStatic
48 public void apply(Project project) {
49
50 }
51
52 @CompileStatic
53 static class Rules extends RuleSource {
54 @Mutate
55 @CompileStatic
56 void removeMacSystemIncludes(ModelMap<Task> tasks, BinaryContainer binaries) {
57 binaries.each {
58 if (!(it instanceof NativeBinarySpec)) {
59 return
60 }
61 NativeBinarySpec nativeBin = (NativeBinarySpec)it
62 if (nativeBin.targetPlatform.operatingSystem.isMacOsX()) {
63 nativeBin.tasks.withType(AbstractNativeSourceCompileTask) { AbstractNativeSourceCompileTask compileTask->
64 compileTask.getSystemIncludes().setFrom()
65 }
66 }
67 }
68 }
69
70 @Mutate
71 @CompileStatic
72 void setupSingleNativeBuild(ModelMap<Task> tasks, ComponentSpecContainer components, BinaryContainer binaryContainer, ProjectLayout projectLayout) {
73 Project project = (Project) projectLayout.projectIdentifier;
74
75 def nativeName = project.extensions.extraProperties.get('nativeName')
76
77 NativeLibrarySpec base = null
78 def subs = []
79 components.each { component ->
80 if (component.name == "${nativeName}Base") {
81 base = (NativeLibrarySpec) component
82 } else if (component.name == "${nativeName}" || component.name == "${nativeName}JNI") {
83 subs << component
84 }
85 }
86 subs.each {
87 ((NativeLibrarySpec) it).binaries.each { oBinary ->
88 if (oBinary.buildable == false) {
89 return
90 }
91 NativeBinarySpec binary = (NativeBinarySpec) oBinary
92 NativeBinarySpec baseBin = null
93 base.binaries.each { oTmpBaseBin ->
94 if (oTmpBaseBin.buildable == false) {
95 return
96 }
97 def tmpBaseBin = (NativeBinarySpec) oTmpBaseBin
98 if (tmpBaseBin.targetPlatform.name == binary.targetPlatform.name &&
99 tmpBaseBin.buildType == binary.buildType) {
100 baseBin = tmpBaseBin
101 }
102 }
103 baseBin.tasks.withType(AbstractNativeSourceCompileTask) { oCompileTask ->
104 def compileTask = (AbstractNativeSourceCompileTask) oCompileTask
105 if (binary instanceof SharedLibraryBinarySpec) {
106 def sBinary = (SharedLibraryBinarySpec) binary
107 ObjectFilesToBinary link = (ObjectFilesToBinary) sBinary.tasks.link
108 ExportsGenerationTask exportsTask = binary.tasks.withType(ExportsGenerationTask)[0]
109 if (exportsTask != null) {
110 exportsTask.dependsOn compileTask
111 }
112 link.dependsOn compileTask
113 link.inputs.dir compileTask.objectFileDir
114 def tree = project.fileTree(compileTask.objectFileDir)
115 tree.include '**/*.o'
116 tree.include '**/*.obj'
117 link.source tree
118 } else if (binary instanceof StaticLibraryBinarySpec) {
119 def sBinary = (StaticLibraryBinarySpec) binary
120 ObjectFilesToBinary assemble = (ObjectFilesToBinary) sBinary.tasks.createStaticLib
121 assemble.dependsOn compileTask
122 assemble.inputs.dir compileTask.objectFileDir
123 def tree = project.fileTree(compileTask.objectFileDir)
124 tree.include '**/*.o'
125 tree.include '**/*.obj'
126 assemble.source tree
127 }
128 }
129 }
130 }
131 }
132 }
133}