blob: f316f13ca1da76126f14b55b18b213dcc5206873 [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
Austin Schuh812d0d12021-11-04 20:16:48 -07009import org.gradle.api.tasks.Delete
10
Brian Silverman8fce7482020-01-05 13:18:21 -080011import org.gradle.api.GradleException;
12import org.gradle.api.Plugin;
13import org.gradle.api.Project;
14import org.gradle.api.Task;
Austin Schuh1e69f942020-11-14 15:06:14 -080015import org.gradle.api.tasks.Copy;
16import org.gradle.api.file.CopySpec;
Brian Silverman8fce7482020-01-05 13:18:21 -080017import org.gradle.api.file.FileTree;
18import org.gradle.api.tasks.compile.JavaCompile;
19import org.gradle.language.base.internal.ProjectLayout;
20import org.gradle.language.base.plugins.ComponentModelBasePlugin;
21import org.gradle.language.nativeplatform.tasks.AbstractNativeSourceCompileTask;
22import org.gradle.model.ModelMap;
23import org.gradle.model.Mutate;
24import org.gradle.model.RuleSource;
25import org.gradle.model.Validate;
26import org.gradle.nativeplatform.NativeBinarySpec;
27import org.gradle.nativeplatform.NativeComponentSpec;
28import org.gradle.nativeplatform.NativeLibrarySpec;
29import org.gradle.nativeplatform.SharedLibraryBinarySpec;
30import org.gradle.nativeplatform.StaticLibraryBinarySpec;
31import org.gradle.nativeplatform.platform.internal.NativePlatformInternal;
32import org.gradle.nativeplatform.toolchain.NativeToolChain;
33import org.gradle.nativeplatform.toolchain.NativeToolChainRegistry;
34import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider;
35import org.gradle.nativeplatform.toolchain.internal.ToolType;
36import org.gradle.nativeplatform.toolchain.internal.gcc.AbstractGccCompatibleToolChain;
37import org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppToolChain;
38import org.gradle.nativeplatform.toolchain.internal.tools.ToolRegistry;
Austin Schuh1e69f942020-11-14 15:06:14 -080039import org.gradle.nativeplatform.tasks.CreateStaticLibrary;
40import org.gradle.nativeplatform.tasks.AbstractLinkTask;
Brian Silverman8fce7482020-01-05 13:18:21 -080041import org.gradle.platform.base.BinarySpec;
42import org.gradle.platform.base.ComponentSpec;
43import org.gradle.platform.base.ComponentSpecContainer;
44import org.gradle.platform.base.BinaryContainer;
45import org.gradle.platform.base.ComponentType;
46import org.gradle.platform.base.TypeBuilder;
47import org.gradle.nativeplatform.tasks.ObjectFilesToBinary;
48import groovy.transform.CompileStatic;
Austin Schuh812d0d12021-11-04 20:16:48 -070049import edu.wpi.first.nativeutils.exports.ExportsGenerationTask
Brian Silverman8fce7482020-01-05 13:18:21 -080050
51@CompileStatic
52class SingleNativeBuild implements Plugin<Project> {
53 @CompileStatic
54 public void apply(Project project) {
55
56 }
57
58 @CompileStatic
59 static class Rules extends RuleSource {
60 @Mutate
61 @CompileStatic
62 void removeMacSystemIncludes(ModelMap<Task> tasks, BinaryContainer binaries) {
63 binaries.each {
64 if (!(it instanceof NativeBinarySpec)) {
65 return
66 }
67 NativeBinarySpec nativeBin = (NativeBinarySpec)it
68 if (nativeBin.targetPlatform.operatingSystem.isMacOsX()) {
69 nativeBin.tasks.withType(AbstractNativeSourceCompileTask) { AbstractNativeSourceCompileTask compileTask->
70 compileTask.getSystemIncludes().setFrom()
71 }
72 }
73 }
74 }
75
76 @Mutate
77 @CompileStatic
78 void setupSingleNativeBuild(ModelMap<Task> tasks, ComponentSpecContainer components, BinaryContainer binaryContainer, ProjectLayout projectLayout) {
79 Project project = (Project) projectLayout.projectIdentifier;
80
81 def nativeName = project.extensions.extraProperties.get('nativeName')
82
83 NativeLibrarySpec base = null
84 def subs = []
85 components.each { component ->
86 if (component.name == "${nativeName}Base") {
87 base = (NativeLibrarySpec) component
Austin Schuh1e69f942020-11-14 15:06:14 -080088 } else if (component.name == "${nativeName}" || component.name == "${nativeName}JNI" || component.name == "${nativeName}JNICvStatic") {
Brian Silverman8fce7482020-01-05 13:18:21 -080089 subs << component
90 }
91 }
Austin Schuh812d0d12021-11-04 20:16:48 -070092 Delete deleteObjects = null
93 if (project.hasProperty('buildServer')) {
94 deleteObjects = project.tasks.create('deleteObjects', Delete)
95 project.tasks.named('build').configure { Task t ->
96 t.dependsOn deleteObjects
97 return
98 }
99 }
Brian Silverman8fce7482020-01-05 13:18:21 -0800100 subs.each {
101 ((NativeLibrarySpec) it).binaries.each { oBinary ->
102 if (oBinary.buildable == false) {
103 return
104 }
105 NativeBinarySpec binary = (NativeBinarySpec) oBinary
106 NativeBinarySpec baseBin = null
107 base.binaries.each { oTmpBaseBin ->
108 if (oTmpBaseBin.buildable == false) {
109 return
110 }
111 def tmpBaseBin = (NativeBinarySpec) oTmpBaseBin
112 if (tmpBaseBin.targetPlatform.name == binary.targetPlatform.name &&
113 tmpBaseBin.buildType == binary.buildType) {
114 baseBin = tmpBaseBin
115 }
116 }
Austin Schuh1e69f942020-11-14 15:06:14 -0800117
118 if (binary instanceof StaticLibraryBinarySpec) {
119 File intoDir = ((CreateStaticLibrary)((StaticLibraryBinarySpec)binary).tasks.createStaticLib).outputFile.get().asFile.parentFile
120 File fromDir = ((CreateStaticLibrary)((StaticLibraryBinarySpec)baseBin).tasks.createStaticLib).outputFile.get().asFile.parentFile
121
122 def copyBasePdbName = "copyBasePdbFor" + binary.buildTask.name
123 def copyTask = project.tasks.register(copyBasePdbName, Copy) { Copy t ->
124 t.from (fromDir)
125 t.include '*.pdb'
126 t.into intoDir
127
128 t.dependsOn (((StaticLibraryBinarySpec)baseBin).tasks.createStaticLib)
129 }
130 ((CreateStaticLibrary)((StaticLibraryBinarySpec)binary).tasks.createStaticLib).dependsOn(copyTask)
131
132 }
133
Brian Silverman8fce7482020-01-05 13:18:21 -0800134 baseBin.tasks.withType(AbstractNativeSourceCompileTask) { oCompileTask ->
135 def compileTask = (AbstractNativeSourceCompileTask) oCompileTask
136 if (binary instanceof SharedLibraryBinarySpec) {
137 def sBinary = (SharedLibraryBinarySpec) binary
138 ObjectFilesToBinary link = (ObjectFilesToBinary) sBinary.tasks.link
139 ExportsGenerationTask exportsTask = binary.tasks.withType(ExportsGenerationTask)[0]
140 if (exportsTask != null) {
141 exportsTask.dependsOn compileTask
142 }
143 link.dependsOn compileTask
144 link.inputs.dir compileTask.objectFileDir
145 def tree = project.fileTree(compileTask.objectFileDir)
146 tree.include '**/*.o'
147 tree.include '**/*.obj'
148 link.source tree
Austin Schuh812d0d12021-11-04 20:16:48 -0700149 if (project.hasProperty('buildServer')) {
150 deleteObjects.dependsOn link
151 deleteObjects.delete tree
152 }
Brian Silverman8fce7482020-01-05 13:18:21 -0800153 } else if (binary instanceof StaticLibraryBinarySpec) {
154 def sBinary = (StaticLibraryBinarySpec) binary
155 ObjectFilesToBinary assemble = (ObjectFilesToBinary) sBinary.tasks.createStaticLib
156 assemble.dependsOn compileTask
157 assemble.inputs.dir compileTask.objectFileDir
158 def tree = project.fileTree(compileTask.objectFileDir)
159 tree.include '**/*.o'
160 tree.include '**/*.obj'
161 assemble.source tree
Austin Schuh812d0d12021-11-04 20:16:48 -0700162 if (project.hasProperty('buildServer')) {
163 deleteObjects.dependsOn assemble
164 deleteObjects.delete tree
165 }
Brian Silverman8fce7482020-01-05 13:18:21 -0800166 }
167 }
168 }
169 }
170 }
171 }
172}