Rename our allwpilib (which is now 2020) to not have 2019 in the name

Change-Id: I3c07f85ed32ab8b97db765a9b43f2a6ce7da964a
diff --git a/buildSrc/src/main/groovy/DisableBuildingGTest.groovy b/buildSrc/src/main/groovy/DisableBuildingGTest.groovy
new file mode 100644
index 0000000..bdf46f7
--- /dev/null
+++ b/buildSrc/src/main/groovy/DisableBuildingGTest.groovy
@@ -0,0 +1,70 @@
+

+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 edu.wpi.first.toolchain.ToolchainExtension

+import org.gradle.model.Mutate;

+import org.gradle.api.plugins.ExtensionContainer;

+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 DisableBuildingGTest implements Plugin<Project> {

+  @CompileStatic

+  public void apply(Project project) {

+

+  }

+

+  @CompileStatic

+  static class Rules extends RuleSource {

+    @CompileDynamic

+    private static void setBuildableFalseDynamically(NativeBinarySpec binary) {

+        binary.buildable = false

+    }

+

+    @Validate

+    @CompileStatic

+    // TODO: Move this to tc plugin

+    void disableCrossTests(BinaryContainer binaries, ExtensionContainer extContainer) {

+        final ToolchainExtension ext = extContainer.getByType(ToolchainExtension.class);

+

+        for (GoogleTestTestSuiteBinarySpec binary : binaries.withType(GoogleTestTestSuiteBinarySpec.class)) {

+            if (ext.getCrossCompilers().findByName(binary.getTargetPlatform().getName()) != null) {

+              setBuildableFalseDynamically(binary)

+            }

+        }

+    }

+  }

+}

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/JREArtifact.groovy b/buildSrc/src/main/groovy/JREArtifact.groovy
new file mode 100644
index 0000000..e57249a
--- /dev/null
+++ b/buildSrc/src/main/groovy/JREArtifact.groovy
@@ -0,0 +1,48 @@
+import groovy.transform.CompileStatic

+import javax.inject.Inject

+import jaci.gradle.deploy.artifact.MavenArtifact

+import jaci.gradle.deploy.context.DeployContext

+import org.gradle.api.Project

+import jaci.gradle.ActionWrapper

+

+import java.util.function.Function

+

+@CompileStatic

+class JREArtifact extends MavenArtifact {

+    Function<DeployContext, Boolean> buildRequiresJre = (Function<DeployContext, Boolean>){ true }

+

+    void setJreDependency(String dep) {

+      dependency = project.dependencies.add(configuration(), dep)

+    }

+

+    @Inject

+    JREArtifact(String name, Project project) {

+        super(name, project)

+        configuration = project.configurations.create(configuration())

+

+        onlyIf = { DeployContext ctx ->

+            (buildRequiresJre.apply(ctx) && jreMissing(ctx)) || project.hasProperty("force-redeploy-jre")

+        }

+

+        predeploy << new ActionWrapper({ DeployContext ctx ->

+            ctx.logger.log('Deploying RoboRIO JRE (this will take a while)...')

+        })

+

+        directory = '/tmp'

+        filename = 'frcjre.ipk'

+

+        postdeploy << new ActionWrapper({ DeployContext ctx ->

+            ctx.logger.log('Installing JRE...')

+            ctx.execute('opkg remove frc2020-openjdk*; opkg install /tmp/frcjre.ipk; rm /tmp/frcjre.ipk')

+            ctx.logger.log('JRE Deployed!')

+        })

+    }

+

+    String configuration() {

+        return name + 'frcjre'

+    }

+

+    boolean jreMissing(DeployContext ctx) {

+        return ctx.execute('if [[ -f "/usr/local/frc/JRE/bin/java" ]]; then echo OK; else echo MISSING; fi').result.contains("MISSING")

+    }

+}

diff --git a/buildSrc/src/main/groovy/MultiBuilds.groovy b/buildSrc/src/main/groovy/MultiBuilds.groovy
new file mode 100644
index 0000000..31530b8
--- /dev/null
+++ b/buildSrc/src/main/groovy/MultiBuilds.groovy
@@ -0,0 +1,74 @@
+
+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 edu.wpi.first.toolchain.ToolchainExtension
+import org.gradle.model.Mutate;
+import org.gradle.api.plugins.ExtensionContainer;
+import org.gradle.nativeplatform.test.googletest.GoogleTestTestSuiteBinarySpec;
+import org.gradle.model.RuleSource;
+import org.gradle.model.Validate;
+import org.gradle.nativeplatform.test.tasks.RunTestExecutable
+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 {
+    @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)
+        }
+      }
+    }
+  }
+}
diff --git a/buildSrc/src/main/groovy/SingleNativeBuild.groovy b/buildSrc/src/main/groovy/SingleNativeBuild.groovy
new file mode 100644
index 0000000..2b7e087
--- /dev/null
+++ b/buildSrc/src/main/groovy/SingleNativeBuild.groovy
@@ -0,0 +1,133 @@
+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;
+import edu.wpi.first.nativeutils.tasks.ExportsGenerationTask
+
+@CompileStatic
+class SingleNativeBuild implements Plugin<Project> {
+    @CompileStatic
+    public void apply(Project project) {
+
+    }
+
+    @CompileStatic
+    static class Rules extends RuleSource {
+        @Mutate
+        @CompileStatic
+        void removeMacSystemIncludes(ModelMap<Task> tasks, BinaryContainer binaries) {
+            binaries.each {
+                if (!(it instanceof NativeBinarySpec)) {
+                    return
+                }
+                NativeBinarySpec nativeBin = (NativeBinarySpec)it
+                if (nativeBin.targetPlatform.operatingSystem.isMacOsX()) {
+                    nativeBin.tasks.withType(AbstractNativeSourceCompileTask) { AbstractNativeSourceCompileTask compileTask->
+                        compileTask.getSystemIncludes().setFrom()
+                    }
+                }
+            }
+        }
+
+        @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.name == binary.targetPlatform.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
+                            ExportsGenerationTask exportsTask = binary.tasks.withType(ExportsGenerationTask)[0]
+                            if (exportsTask != null) {
+                                exportsTask.dependsOn compileTask
+                            }
+                            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
+                        }
+                    }
+                }
+            }
+        }
+    }
+}