Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add SystemCore to supported platforms #233

Merged
merged 4 commits into from
Nov 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ jobs:
- name: InstallArm64Tc
run: ../../gradlew installArm64Toolchain
working-directory: testing/cpp
- name: InstallSystemCoreTc
run: ../../gradlew installSystemCoreToolchain
working-directory: testing/cpp
- name: Build Test
run: ../../gradlew build
working-directory: testing/cpp
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ nativeUtils.wpi.configureDependencies {
nativeUtils.wpi.platforms.roborio
nativeUtils.wpi.platforms.linuxarm32
nativeUtils.wpi.platforms.linuxarm64
nativeUtils.wpi.platforms.systemcore
nativeUtils.wpi.platforms.windowsx64
nativeUtils.wpi.platforms.osxuniversal
nativeUtils.wpi.platforms.linuxx64
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package edu.wpi.first.toolchain.roborio;
package edu.wpi.first.toolchain;

import org.gradle.internal.os.OperatingSystem;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
public class NativePlatforms {
public static final String desktop = desktopOS() + desktopArch();
public static final String roborio = "linuxathena";
public static final String systemcore = "linuxsystemcore";
public static final String linuxarm32 = "linuxarm32";
public static final String linuxarm64 = "linuxarm64";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import edu.wpi.first.toolchain.arm32.Arm32ToolchainPlugin;
import edu.wpi.first.toolchain.arm64.Arm64ToolchainPlugin;
import edu.wpi.first.toolchain.systemcore.SystemCoreToolchainPlugin;
import edu.wpi.first.toolchain.configurable.CrossCompilerConfiguration;
import edu.wpi.first.toolchain.roborio.RoboRioToolchainPlugin;

Expand Down Expand Up @@ -111,6 +112,10 @@ public void withCrossLinuxArm64() {
}
}

public void withCrossSystemCore() {
project.getPluginManager().apply(SystemCoreToolchainPlugin.class);
}

private boolean removeInvalidWindowsToolchains = true;

public void setRemoveInvalidWindowsToolchains(boolean remove) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import edu.wpi.first.toolchain.opensdk.OpenSdkToolchainExtension;

public abstract class Arm32ToolchainExtension extends OpenSdkToolchainExtension {
public static final String TOOLCHAIN_VERSION = "2024-10.2.0";
public static final String TOOLCHAIN_VERSION = "2025-10.2.0";
public static final String INSTALL_SUBDIR = "arm32";

@Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import edu.wpi.first.toolchain.opensdk.OpenSdkToolchainExtension;

public abstract class Arm64ToolchainExtension extends OpenSdkToolchainExtension {
public static final String TOOLCHAIN_VERSION = "2024-10.2.0";
public static final String TOOLCHAIN_VERSION = "2025-10.2.0";
public static final String INSTALL_SUBDIR = "arm64";

@Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ public abstract class OpenSdkToolchainExtension {

@Inject
public OpenSdkToolchainExtension() {
getToolchainTag().convention("v2024-1");
getToolchainTag().convention("v2025-1");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import edu.wpi.first.toolchain.opensdk.OpenSdkToolchainExtension;

public abstract class RoboRioToolchainExtension extends OpenSdkToolchainExtension {
public static final String TOOLCHAIN_VERSION = "2024-12.1.0";
public static final String TOOLCHAIN_VERSION = "2025-12.1.0";
public static final String INSTALL_SUBDIR = "roborio";

@Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.gradle.api.provider.Provider;
import org.gradle.process.ExecOperations;

import edu.wpi.first.toolchain.FrcHome;
import edu.wpi.first.toolchain.NativePlatforms;
import edu.wpi.first.toolchain.ToolchainDescriptor;
import edu.wpi.first.toolchain.ToolchainDiscoverer;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package edu.wpi.first.toolchain.systemcore;

import javax.inject.Inject;

import edu.wpi.first.toolchain.opensdk.OpenSdkToolchainExtension;

public abstract class SystemCoreToolchainExtension extends OpenSdkToolchainExtension {
public static final String TOOLCHAIN_VERSION = "2025-12.2.0";
public static final String INSTALL_SUBDIR = "systemcore";

@Inject
public SystemCoreToolchainExtension() {
super();
getVersionLow().convention("12.2.0");
getVersionHigh().convention("12.2.0");
getToolchainVersion().convention(TOOLCHAIN_VERSION);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package edu.wpi.first.toolchain.systemcore;

import java.io.File;

import javax.inject.Inject;

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.provider.Provider;
import org.gradle.process.ExecOperations;

import edu.wpi.first.toolchain.FrcHome;
import edu.wpi.first.toolchain.NativePlatforms;
import edu.wpi.first.toolchain.ToolchainDescriptor;
import edu.wpi.first.toolchain.ToolchainDiscoverer;
import edu.wpi.first.toolchain.ToolchainExtension;
import edu.wpi.first.toolchain.configurable.CrossCompilerConfiguration;
import edu.wpi.first.toolchain.opensdk.OpenSdkToolchainBase;

public class SystemCoreToolchainPlugin implements Plugin<Project> {

public static final String toolchainName = "systemCore";
public static final String baseToolchainName = "arm64-bookworm";

private SystemCoreToolchainExtension systemcoreExt;
private Project project;
private OpenSdkToolchainBase opensdk;
private ExecOperations operations;

@Inject
public SystemCoreToolchainPlugin(ExecOperations operations) {
this.operations = operations;
}

@Override
public void apply(Project project) {
this.project = project;

systemcoreExt = project.getExtensions().create("systemcoreToolchain", SystemCoreToolchainExtension.class);

ToolchainExtension toolchainExt = project.getExtensions().getByType(ToolchainExtension.class);

opensdk = new OpenSdkToolchainBase(baseToolchainName, systemcoreExt, project,
SystemCoreToolchainExtension.INSTALL_SUBDIR, "bookworm", project.provider(() -> "aarch64-bookworm-linux-gnu"), toolchainExt.getToolchainGraphService(), operations);

CrossCompilerConfiguration configuration = project.getObjects().newInstance(CrossCompilerConfiguration.class, NativePlatforms.systemcore);

configuration.getArchitecture().set("arm64");
configuration.getOperatingSystem().set("linux");
configuration.getCompilerPrefix().set("");
configuration.getOptional().convention(true);

ToolchainDescriptor descriptor = new ToolchainDescriptor(
project,
toolchainName,
toolchainName + "Gcc",
configuration.getOptional());
descriptor.getToolchainPlatform().set(NativePlatforms.roborio);
descriptor.getVersionLow().set(systemcoreExt.getVersionLow());
descriptor.getVersionHigh().set(systemcoreExt.getVersionHigh());
configuration.getToolchainDescriptor().set(descriptor);

toolchainExt.getCrossCompilers().add(configuration);

populateDescriptor(descriptor);
}

public void populateDescriptor(ToolchainDescriptor descriptor) {
Provider<File> fp = project.provider(() -> {
String year = systemcoreExt.getToolchainVersion().get().split("-")[0].toLowerCase();
File frcHomeLoc = new File(new FrcHome(year).get(), "systemcore");
return frcHomeLoc;
});

// Add FRC Home first, as we want it searched first
descriptor.getDiscoverers().add(ToolchainDiscoverer.createProperty("FRCHome", descriptor, fp, opensdk::composeTool, project));

opensdk.populatePathAndDownloadDescriptors(descriptor);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package edu.wpi.first.toolchain.systemcore

import org.gradle.testkit.runner.GradleRunner
import static org.gradle.testkit.runner.TaskOutcome.*
import edu.wpi.first.toolchain.opensdk.OpenSdkToolchainBase

import spock.lang.Shared
import spock.lang.TempDir
import spock.lang.Specification
import spock.lang.IgnoreIf

@IgnoreIf({ !Boolean.valueOf(env['SPOCK_RUN_TOOLCHAINS']) })
class Arm64DownloadTest extends Specification {
@TempDir File testProjectDir
File buildFile
@Shared File toolchainDir

def setup() {
buildFile = new File(testProjectDir, 'build.gradle')
}

def setupSpec() {
String year = SystemCoreToolchainExtension.TOOLCHAIN_VERSION.split("-")[0].toLowerCase();
toolchainDir = OpenSdkToolchainBase.toolchainInstallLoc(year, SystemCoreToolchainExtension.INSTALL_SUBDIR);
def result = toolchainDir.deleteDir() // Returns true if all goes well, false otherwise.
assert result
}

def "Toolchain Can Download"() {
given:
buildFile << """plugins {
id 'cpp'
id 'edu.wpi.first.Toolchain'
}

toolchainsPlugin.withCrossSystemCore()
"""
when:
def result = GradleRunner.create()
.withProjectDir(testProjectDir)
.withArguments('installSystemCoreToolchain', '--stacktrace')
.withPluginClasspath()
.build()

then:
result.task(':installSystemCoreToolchain').outcome == SUCCESS
}
}
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ java {

allprojects {
group = "edu.wpi.first"
version = "2025.6.0"
version = "2025.7.0"

if (project.hasProperty('publishVersion')) {
version = project.publishVersion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import edu.wpi.first.toolchain.arm64.Arm64ToolchainPlugin;
import edu.wpi.first.toolchain.configurable.CrossCompilerConfiguration;
import edu.wpi.first.toolchain.roborio.RoboRioToolchainPlugin;
import edu.wpi.first.toolchain.systemcore.SystemCoreToolchainPlugin;

public class NativeUtilsExtension {

Expand Down Expand Up @@ -366,6 +367,10 @@ public void withCrossRoboRIO() {
project.getPluginManager().apply(RoboRioToolchainPlugin.class);
}

public void withCrossSystemCore() {
project.getPluginManager().apply(SystemCoreToolchainPlugin.class);
}

public void withCrossLinuxArm32() {
if (!NativePlatforms.desktop.equals(NativePlatforms.linuxarm32)) {
project.getPluginManager().apply(Arm32ToolchainPlugin.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,15 @@ public static class DefaultArguments {

public static class Platforms {
public final String roborio = "linuxathena";
public final String systemcore = "linuxsystemcore";
public final String linuxarm32 = "linuxarm32";
public final String linuxarm64 = "linuxarm64";
public final String windowsx64 = "windowsx86-64";
public final String windowsx86 = "windowsx86";
public final String windowsarm64 = "windowsarm64";
public final String osxuniversal = "osxuniversal";
public final String linuxx64 = "linuxx86-64";
public final List<String> allPlatforms = List.of(roborio, linuxarm32, linuxarm64, windowsx64,
public final List<String> allPlatforms = List.of(roborio, systemcore, linuxarm32, linuxarm64, windowsx64,
windowsx86, windowsarm64, osxuniversal, linuxx64);
public final List<String> desktopPlatforms = List.of(windowsx64, windowsx86, windowsarm64, osxuniversal, linuxx64);
}
Expand Down Expand Up @@ -219,15 +220,20 @@ public WPINativeUtilsExtension(NativeUtilsExtension nativeExt, Project project)
PlatformConfig linuxathena = nativeExt.getPlatformConfigs().create(platforms.roborio);
PlatformConfig linuxarm32 = nativeExt.getPlatformConfigs().create(platforms.linuxarm32);
PlatformConfig linuxarm64 = nativeExt.getPlatformConfigs().create(platforms.linuxarm64);
PlatformConfig linuxsystemcore = nativeExt.getPlatformConfigs().create(platforms.systemcore);
unixPlatforms.put(platforms.linuxx64, linuxx86_64);
unixPlatforms.put(platforms.osxuniversal, osxuniversal);
unixPlatforms.put(platforms.linuxarm32, linuxarm32);
unixPlatforms.put(platforms.roborio, linuxathena);
unixPlatforms.put(platforms.linuxarm64, linuxarm64);
unixPlatforms.put(platforms.systemcore, linuxsystemcore);

linuxathena.getPlatformPath().set("linux/athena");
addLinuxCrossArgs(linuxathena, 12);

linuxsystemcore.getPlatformPath().set("linux/systemcore");
addLinuxCrossArgs(linuxsystemcore, 12);

linuxarm32.getPlatformPath().set("linux/arm32");
addLinuxCrossArgs(linuxarm32, 10);

Expand Down
4 changes: 3 additions & 1 deletion testing/cpp/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@ import edu.wpi.first.nativeutils.vendordeps.WPIVendorDepsPlugin

plugins {
id "cpp"
id "edu.wpi.first.NativeUtils" version "2025.6.0"
id "edu.wpi.first.NativeUtils" version "2025.7.0"
}

nativeUtils.addWpiNativeUtils()
nativeUtils.withCrossRoboRIO()
nativeUtils.withCrossLinuxArm32()
nativeUtils.withCrossLinuxArm64()
nativeUtils.withCrossSystemCore();

nativeUtils.crossCompilers.getByName(NativePlatforms.roborio).optional = false
nativeUtils.crossCompilers.getByName(NativePlatforms.linuxarm32).optional = false
nativeUtils.crossCompilers.getByName(NativePlatforms.linuxarm64).optional = false
nativeUtils.crossCompilers.getByName(NativePlatforms.systemcore).optional = false

project.getPlugins().apply(WPIVendorDepsPlugin.class)

Expand Down