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