Squashed 'third_party/allwpilib_2019/' content from commit bd05dfa1c
Change-Id: I2b1c2250cdb9b055133780c33593292098c375b7
git-subtree-dir: third_party/allwpilib_2019
git-subtree-split: bd05dfa1c7cca74c4fac451e7b9d6a37e7b53447
diff --git a/buildSrc/src/main/groovy/ExtraTasks.groovy b/buildSrc/src/main/groovy/ExtraTasks.groovy
new file mode 100644
index 0000000..8b0b123
--- /dev/null
+++ b/buildSrc/src/main/groovy/ExtraTasks.groovy
@@ -0,0 +1,88 @@
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.gradle.api.GradleException;
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+import org.gradle.api.Task;
+import org.gradle.api.file.FileTree;
+import org.gradle.api.tasks.compile.JavaCompile;
+import org.gradle.language.base.internal.ProjectLayout;
+import org.gradle.language.base.plugins.ComponentModelBasePlugin;
+import org.gradle.language.nativeplatform.tasks.AbstractNativeSourceCompileTask;
+import org.gradle.model.ModelMap;
+import org.gradle.model.Mutate;
+import org.gradle.model.RuleSource;
+import org.gradle.model.Validate;
+import org.gradle.nativeplatform.NativeBinarySpec;
+import org.gradle.nativeplatform.NativeComponentSpec;
+import org.gradle.nativeplatform.NativeLibrarySpec;
+import org.gradle.nativeplatform.SharedLibraryBinarySpec;
+import org.gradle.nativeplatform.StaticLibraryBinarySpec;
+import org.gradle.nativeplatform.platform.internal.NativePlatformInternal;
+import org.gradle.nativeplatform.toolchain.NativeToolChain;
+import org.gradle.nativeplatform.toolchain.NativeToolChainRegistry;
+import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider;
+import org.gradle.nativeplatform.toolchain.internal.ToolType;
+import org.gradle.nativeplatform.toolchain.internal.gcc.AbstractGccCompatibleToolChain;
+import org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppToolChain;
+import org.gradle.nativeplatform.toolchain.internal.tools.ToolRegistry;
+import org.gradle.nativeplatform.test.googletest.GoogleTestTestSuiteBinarySpec;
+import org.gradle.platform.base.BinarySpec;
+import org.gradle.platform.base.ComponentSpec;
+import org.gradle.platform.base.ComponentSpecContainer;
+import org.gradle.platform.base.ComponentType;
+import org.gradle.platform.base.TypeBuilder;
+import org.gradle.nativeplatform.test.tasks.RunTestExecutable;
+import org.gradle.platform.base.BinaryContainer;
+import groovy.transform.CompileStatic;
+
+@CompileStatic
+class ExtraTasks implements Plugin<Project> {
+ @CompileStatic
+ public void apply(Project project) {
+
+ }
+
+ @CompileStatic
+ static class Rules extends RuleSource {
+ @Mutate
+ @CompileStatic
+ void createNativeCompileTask(ModelMap<Task> tasks, BinaryContainer binaries) {
+ tasks.create('compileCpp', Task) { oTask ->
+ def task = (Task) oTask
+ task.group = 'build'
+ task.description = 'Uber task to compile all native code for this project'
+ binaries.each { binary ->
+ if (binary instanceof NativeBinarySpec && binary.buildable) {
+ binary.tasks.withType(AbstractNativeSourceCompileTask) { compileTask ->
+ task.dependsOn compileTask
+ }
+ }
+ }
+ }
+ }
+
+ @Mutate
+ @CompileStatic
+ void createNativeTestTask(ModelMap<Task> tasks, BinaryContainer binaries) {
+ tasks.create('testCpp', Task) { oTask ->
+ def task = (Task) oTask
+ task.group = 'build'
+ task.description = 'Uber task to run all native tests for project'
+ binaries.each { binary ->
+ if (binary instanceof GoogleTestTestSuiteBinarySpec && binary.buildable) {
+ binary.tasks.withType(RunTestExecutable) { testTask ->
+ task.dependsOn testTask
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/buildSrc/src/main/groovy/MultiBuilds.groovy b/buildSrc/src/main/groovy/MultiBuilds.groovy
new file mode 100644
index 0000000..aa1a225
--- /dev/null
+++ b/buildSrc/src/main/groovy/MultiBuilds.groovy
@@ -0,0 +1,95 @@
+
+import org.gradle.api.GradleException;
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+import org.gradle.api.Task;
+import org.gradle.api.file.FileTree;
+import org.gradle.api.tasks.compile.JavaCompile;
+import org.gradle.language.base.internal.ProjectLayout;
+import org.gradle.language.base.plugins.ComponentModelBasePlugin;
+import org.gradle.language.nativeplatform.tasks.AbstractNativeSourceCompileTask;
+import org.gradle.model.ModelMap;
+import org.gradle.model.Mutate;
+import org.gradle.nativeplatform.test.googletest.GoogleTestTestSuiteBinarySpec;
+import org.gradle.model.RuleSource;
+import org.gradle.model.Validate;
+import org.gradle.nativeplatform.NativeExecutableBinarySpec
+import org.gradle.nativeplatform.NativeBinarySpec;
+import org.gradle.nativeplatform.NativeComponentSpec;
+import org.gradle.nativeplatform.NativeLibrarySpec;
+import org.gradle.nativeplatform.SharedLibraryBinarySpec;
+import org.gradle.nativeplatform.StaticLibraryBinarySpec;
+import org.gradle.nativeplatform.platform.internal.NativePlatformInternal;
+import org.gradle.nativeplatform.toolchain.NativeToolChain;
+import org.gradle.nativeplatform.toolchain.NativeToolChainRegistry;
+import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider;
+import org.gradle.nativeplatform.toolchain.internal.ToolType;
+import org.gradle.nativeplatform.toolchain.internal.gcc.AbstractGccCompatibleToolChain;
+import org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppToolChain;
+import org.gradle.nativeplatform.toolchain.internal.tools.ToolRegistry;
+import org.gradle.platform.base.BinarySpec;
+import org.gradle.platform.base.ComponentSpec;
+import org.gradle.platform.base.ComponentSpecContainer;
+import org.gradle.platform.base.BinaryContainer;
+import org.gradle.platform.base.ComponentType;
+import org.gradle.platform.base.TypeBuilder;
+import org.gradle.nativeplatform.tasks.ObjectFilesToBinary;
+import groovy.transform.CompileStatic;
+import groovy.transform.CompileDynamic
+import org.gradle.nativeplatform.BuildTypeContainer
+
+@CompileStatic
+class MultiBuilds implements Plugin<Project> {
+ @CompileStatic
+ public void apply(Project project) {
+
+ }
+
+ @CompileStatic
+ static class Rules extends RuleSource {
+ @Mutate
+ void setupBuildTypes(BuildTypeContainer buildTypes, ProjectLayout projectLayout) {
+ def project = (Project) projectLayout.projectIdentifier
+ if (project.hasProperty('releaseBuild')) {
+ buildTypes.create('debug')
+ } else {
+ buildTypes.create('release')
+ }
+ }
+
+ @CompileDynamic
+ private static void setBuildableFalseDynamically(NativeBinarySpec binary) {
+ binary.buildable = false
+ }
+
+ @Mutate
+ @CompileStatic
+ void disableReleaseGoogleTest(BinaryContainer binaries, ProjectLayout projectLayout) {
+ def project = (Project) projectLayout.projectIdentifier
+ if (project.hasProperty('testRelease')) {
+ return
+ }
+ binaries.withType(GoogleTestTestSuiteBinarySpec) { oSpec ->
+ GoogleTestTestSuiteBinarySpec spec = (GoogleTestTestSuiteBinarySpec) oSpec
+ if (spec.buildType.name == 'release') {
+ Rules.setBuildableFalseDynamically(spec)
+ }
+ }
+ // def crossCompileConfigs = []
+ // for (BuildConfig config : configs) {
+ // if (!BuildConfigRulesBase.isCrossCompile(config)) {
+ // continue
+ // }
+ // crossCompileConfigs << config.architecture
+ // }
+ // if (!crossCompileConfigs.empty) {
+ // binaries.withType(GoogleTestTestSuiteBinarySpec) { oSpec ->
+ // GoogleTestTestSuiteBinarySpec spec = (GoogleTestTestSuiteBinarySpec) oSpec
+ // if (crossCompileConfigs.contains(spec.targetPlatform.architecture.name)) {
+ // setBuildableFalseDynamically(spec)
+ // }
+ // }
+ // }
+ }
+ }
+}
diff --git a/buildSrc/src/main/groovy/SingleNativeBuild.groovy b/buildSrc/src/main/groovy/SingleNativeBuild.groovy
new file mode 100644
index 0000000..f37fc57
--- /dev/null
+++ b/buildSrc/src/main/groovy/SingleNativeBuild.groovy
@@ -0,0 +1,113 @@
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.gradle.api.GradleException;
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+import org.gradle.api.Task;
+import org.gradle.api.file.FileTree;
+import org.gradle.api.tasks.compile.JavaCompile;
+import org.gradle.language.base.internal.ProjectLayout;
+import org.gradle.language.base.plugins.ComponentModelBasePlugin;
+import org.gradle.language.nativeplatform.tasks.AbstractNativeSourceCompileTask;
+import org.gradle.model.ModelMap;
+import org.gradle.model.Mutate;
+import org.gradle.model.RuleSource;
+import org.gradle.model.Validate;
+import org.gradle.nativeplatform.NativeBinarySpec;
+import org.gradle.nativeplatform.NativeComponentSpec;
+import org.gradle.nativeplatform.NativeLibrarySpec;
+import org.gradle.nativeplatform.SharedLibraryBinarySpec;
+import org.gradle.nativeplatform.StaticLibraryBinarySpec;
+import org.gradle.nativeplatform.platform.internal.NativePlatformInternal;
+import org.gradle.nativeplatform.toolchain.NativeToolChain;
+import org.gradle.nativeplatform.toolchain.NativeToolChainRegistry;
+import org.gradle.nativeplatform.toolchain.internal.PlatformToolProvider;
+import org.gradle.nativeplatform.toolchain.internal.ToolType;
+import org.gradle.nativeplatform.toolchain.internal.gcc.AbstractGccCompatibleToolChain;
+import org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppToolChain;
+import org.gradle.nativeplatform.toolchain.internal.tools.ToolRegistry;
+import org.gradle.platform.base.BinarySpec;
+import org.gradle.platform.base.ComponentSpec;
+import org.gradle.platform.base.ComponentSpecContainer;
+import org.gradle.platform.base.BinaryContainer;
+import org.gradle.platform.base.ComponentType;
+import org.gradle.platform.base.TypeBuilder;
+import org.gradle.nativeplatform.tasks.ObjectFilesToBinary;
+import groovy.transform.CompileStatic;
+
+@CompileStatic
+class SingleNativeBuild implements Plugin<Project> {
+ @CompileStatic
+ public void apply(Project project) {
+
+ }
+
+ @CompileStatic
+ static class Rules extends RuleSource {
+ @Mutate
+ @CompileStatic
+ void setupSingleNativeBuild(ModelMap<Task> tasks, ComponentSpecContainer components, BinaryContainer binaryContainer, ProjectLayout projectLayout) {
+ Project project = (Project) projectLayout.projectIdentifier;
+
+ def nativeName = project.extensions.extraProperties.get('nativeName')
+
+ NativeLibrarySpec base = null
+ def subs = []
+ components.each { component ->
+ if (component.name == "${nativeName}Base") {
+ base = (NativeLibrarySpec) component
+ } else if (component.name == "${nativeName}" || component.name == "${nativeName}JNI") {
+ subs << component
+ }
+ }
+ subs.each {
+ ((NativeLibrarySpec) it).binaries.each { oBinary ->
+ if (oBinary.buildable == false) {
+ return
+ }
+ NativeBinarySpec binary = (NativeBinarySpec) oBinary
+ NativeBinarySpec baseBin = null
+ base.binaries.each { oTmpBaseBin ->
+ if (oTmpBaseBin.buildable == false) {
+ return
+ }
+ def tmpBaseBin = (NativeBinarySpec) oTmpBaseBin
+ if (tmpBaseBin.targetPlatform.operatingSystem.name == binary.targetPlatform.operatingSystem.name &&
+ tmpBaseBin.targetPlatform.architecture.name == binary.targetPlatform.architecture.name &&
+ tmpBaseBin.buildType == binary.buildType) {
+ baseBin = tmpBaseBin
+ }
+ }
+ baseBin.tasks.withType(AbstractNativeSourceCompileTask) { oCompileTask ->
+ def compileTask = (AbstractNativeSourceCompileTask) oCompileTask
+ if (binary instanceof SharedLibraryBinarySpec) {
+ def sBinary = (SharedLibraryBinarySpec) binary
+ ObjectFilesToBinary link = (ObjectFilesToBinary) sBinary.tasks.link
+ link.dependsOn compileTask
+ link.inputs.dir compileTask.objectFileDir
+ def tree = project.fileTree(compileTask.objectFileDir)
+ tree.include '**/*.o'
+ tree.include '**/*.obj'
+ link.source tree
+ } else if (binary instanceof StaticLibraryBinarySpec) {
+ def sBinary = (StaticLibraryBinarySpec) binary
+ ObjectFilesToBinary assemble = (ObjectFilesToBinary) sBinary.tasks.createStaticLib
+ assemble.dependsOn compileTask
+ assemble.inputs.dir compileTask.objectFileDir
+ def tree = project.fileTree(compileTask.objectFileDir)
+ tree.include '**/*.o'
+ tree.include '**/*.obj'
+ assemble.source tree
+ }
+ }
+ }
+ }
+ }
+ }
+}