Skip to content

Commit 1bb6b91

Browse files
authored
Use processstarter for launching tools (#790)
1 parent dbdfb70 commit 1bb6b91

File tree

10 files changed

+97
-169
lines changed

10 files changed

+97
-169
lines changed

build.gradle

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@ repositories {
1414
mavenLocal()
1515
}
1616

17+
configurations {
18+
processstarterDownload
19+
}
20+
21+
def processstarterToolVersion = "2025.3.2"
22+
1723
dependencies {
24+
1825
api 'com.google.code.gson:gson:2.13.1'
1926

2027
api 'edu.wpi.first:native-utils:2025.9.1'
@@ -27,6 +34,13 @@ dependencies {
2734
testImplementation("org.junit.jupiter:junit-jupiter-api:5.13.4")
2835
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
2936
testImplementation gradleTestKit()
37+
38+
processstarterDownload "edu.wpi.first.tools:processstarter:$processstarterToolVersion:windowsx86-64@zip"
39+
processstarterDownload "edu.wpi.first.tools:processstarter:$processstarterToolVersion:linuxx86-64@zip"
40+
processstarterDownload "edu.wpi.first.tools:processstarter:$processstarterToolVersion:linuxarm32@zip"
41+
processstarterDownload "edu.wpi.first.tools:processstarter:$processstarterToolVersion:linuxarm64@zip"
42+
processstarterDownload "edu.wpi.first.tools:processstarter:$processstarterToolVersion:osxuniversal@zip"
43+
processstarterDownload "edu.wpi.first.tools:processstarter:$processstarterToolVersion:windowsarm64@zip"
3044
}
3145

3246
tasks.withType(Test).configureEach {
@@ -112,6 +126,46 @@ examplesFolder.eachFile { File file ->
112126

113127
jar.finalizedBy zipExamples
114128

129+
task processprocessstarterDownload {
130+
inputs.files configurations.processstarterDownload
131+
doLast {
132+
configurations.processstarterDownload.each { downloadedFile ->
133+
def destinationDir = file("${buildDir}/resources/main")
134+
// Unzip and copy files
135+
copy {
136+
from(zipTree(downloadedFile)) {
137+
include 'processstarter*'
138+
}
139+
into destinationDir
140+
}
141+
142+
// Rename the extracted file to include the classifier
143+
destinationDir.eachFile { extractedFile ->
144+
145+
if (extractedFile.name.startsWith('processstarter') && !extractedFile.name.contains('-')) {
146+
def destinationFile = file("${buildDir}/resources/main/processstarter")
147+
if (downloadedFile.name.contains("linuxarm32")) {
148+
destinationFile = file("${buildDir}/resources/main/processstarter-linuxarm32")
149+
} else if (downloadedFile.name.contains("linuxarm64")) {
150+
destinationFile = file("${buildDir}/resources/main/processstarter-linuxarm64")
151+
} else if (downloadedFile.name.contains("linuxx86-64")) {
152+
destinationFile = file("${buildDir}/resources/main/processstarter-linuxx86-64")
153+
} else if (downloadedFile.name.contains("osxuniversal")) {
154+
destinationFile = file("${buildDir}/resources/main/processstarter-osxuniversal")
155+
} else if (downloadedFile.name.contains("windowsx86-64")) {
156+
destinationFile = file("${buildDir}/resources/main/processstarter-windowsx86-64.exe")
157+
} else if (downloadedFile.name.contains("windowsarm64")) {
158+
destinationFile = file("${buildDir}/resources/main/processstarter-windowsarm64.exe")
159+
}
160+
extractedFile.renameTo(destinationFile)
161+
}
162+
}
163+
}
164+
}
165+
}
166+
167+
jar.dependsOn processprocessstarterDownload
168+
115169
wrapper {
116170
gradleVersion = '8.11'
117171
distributionType = Wrapper.DistributionType.BIN

src/main/java/edu/wpi/first/gradlerio/wpi/WPIVersionsExtension.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public abstract class WPIVersionsExtension {
2525
private static final String roboRIOTeamNumberSetterVersion = "2025.3.2";
2626
private static final String dataLogToolVersion = "2025.3.2";
2727
private static final String wpicalToolVersion = "2025.3.2";
28+
private static final String processstarterToolVersion = "2025.3.2";
2829

2930

3031
public abstract Property<String> getWpilibVersion();
@@ -46,6 +47,7 @@ public abstract class WPIVersionsExtension {
4647
public abstract Property<String> getRoboRIOTeamNumberSetterVersion();
4748
public abstract Property<String> getDataLogToolVersion();
4849
public abstract Property<String> getwpicalToolVersion();
50+
public abstract Property<String> getprocessstarterToolVersion();
4951

5052
@Inject
5153
public WPIVersionsExtension() {
@@ -68,6 +70,7 @@ public WPIVersionsExtension() {
6870
getRoboRIOTeamNumberSetterVersion().convention(roboRIOTeamNumberSetterVersion);
6971
getDataLogToolVersion().convention(dataLogToolVersion);
7072
getwpicalToolVersion().convention(wpicalToolVersion);
73+
getprocessstarterToolVersion().convention(processstarterToolVersion);
7174
}
7275

7376
}

src/main/java/edu/wpi/first/gradlerio/wpi/dependencies/tools/CppToolRunTask.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ private String getArgumentPath(String toolNameLower) {
6060
private void runToolWindows() {
6161
Directory toolsFolder = this.toolsFolder.get();
6262
String toolName = this.toolName.get();
63-
File outputFile = toolsFolder.file(toolName + ".vbs").getAsFile();
64-
ProcessBuilder builder = new ProcessBuilder("wscript.exe", outputFile.getAbsolutePath(), "silent",
63+
File outputFile = toolsFolder.file(toolName + ".exe").getAsFile();
64+
ProcessBuilder builder = new ProcessBuilder(outputFile.getAbsolutePath(),
6565
getArgumentPath(toolName.toLowerCase()));
6666
try {
6767
Process proc = builder.start();
@@ -80,7 +80,7 @@ private void runToolWindows() {
8080
private void runToolUnix() {
8181
Directory toolsFolder = this.toolsFolder.get();
8282
String toolName = this.toolName.get();
83-
File outputFile = toolsFolder.file(toolName + ".sh").getAsFile();
83+
File outputFile = toolsFolder.file(toolName).getAsFile();
8484
operations.exec(spec -> {
8585
spec.setExecutable(outputFile.getAbsolutePath());
8686
spec.args(getArgumentPath(toolName.toLowerCase()));

src/main/java/edu/wpi/first/gradlerio/wpi/dependencies/tools/ToolInstallTask.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import com.google.gson.GsonBuilder;
1515
import com.google.gson.reflect.TypeToken;
1616

17+
import edu.wpi.first.toolchain.NativePlatforms;
18+
1719
import org.codehaus.groovy.runtime.IOGroovyMethods;
1820
import org.codehaus.groovy.runtime.ResourceGroovyMethods;
1921
import org.gradle.api.Action;
@@ -138,7 +140,7 @@ private static synchronized void setToolVersion(Directory toolsFolder, ToolConfi
138140
}
139141

140142
private static File getScriptFile(Directory toolsFolder, String toolName) {
141-
return toolsFolder.file(toolName + ".vbs").getAsFile();
143+
return toolsFolder.file(toolName + ".exe").getAsFile();
142144
}
143145

144146
private static Dependency getDependencyObject(Configuration configuration, String artifactName) {
@@ -218,18 +220,25 @@ public void execute(CopySpec cp) {
218220
}
219221

220222
private static void extractScriptWindows(Directory toolsFolder, String toolName) {
221-
File outputFile = toolsFolder.file(toolName + ".vbs").getAsFile();
222-
try (InputStream it = ToolInstallTask.class.getResourceAsStream("/ScriptBase.vbs")) {
223-
ResourceGroovyMethods.setText(outputFile, IOGroovyMethods.getText(it));
223+
File outputFile = toolsFolder.file(toolName + ".exe").getAsFile();
224+
String inputFileName = "/processstarter-" + NativePlatforms.desktopOS() + NativePlatforms.desktopArchDirect() + ".exe";
225+
try (InputStream it = ToolInstallTask.class.getResourceAsStream(inputFileName)) {
226+
ResourceGroovyMethods.setBytes(outputFile, IOGroovyMethods.getBytes(it));
224227
} catch (IOException e) {
225228
throw new RuntimeException(e);
226229
}
227230
}
228231

229232
private void extractScriptUnix(Project project, Directory toolsFolder, String toolName) {
230-
File outputFile = toolsFolder.file(toolName + ".sh").getAsFile();
231-
try (InputStream it = ToolInstallTask.class.getResourceAsStream("/ScriptBase.sh")) {
232-
ResourceGroovyMethods.setText(outputFile, IOGroovyMethods.getText(it));
233+
File outputFile = toolsFolder.file(toolName).getAsFile();
234+
String inputFileName = "/processstarter-";
235+
if (OperatingSystem.current().isMacOsX())
236+
inputFileName += "osxuniversal";
237+
else
238+
inputFileName += NativePlatforms.desktopOS() + NativePlatforms.desktopArchDirect();
239+
System.out.println("Extracting Unix: " + inputFileName + " to " + outputFile.getAbsolutePath());
240+
try (InputStream it = ToolInstallTask.class.getResourceAsStream(inputFileName)) {
241+
ResourceGroovyMethods.setBytes(outputFile, IOGroovyMethods.getBytes(it));
233242
} catch (IOException e) {
234243
throw new RuntimeException(e);
235244
}

src/main/java/edu/wpi/first/gradlerio/wpi/dependencies/tools/ToolRunTask.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ public void runTool() {
5959
private void runToolWindows() {
6060
Directory toolsFolder = this.toolsFolder.get();
6161
String toolName = this.toolName.get();
62-
File outputFile = toolsFolder.file(toolName + ".vbs").getAsFile();
63-
ProcessBuilder builder = new ProcessBuilder("wscript.exe", outputFile.getAbsolutePath(), "silent");
62+
File outputFile = toolsFolder.file(toolName + ".exe").getAsFile();
63+
ProcessBuilder builder = new ProcessBuilder(outputFile.getAbsolutePath());
6464
Process proc;
6565
try {
6666
proc = builder.start();
@@ -79,7 +79,7 @@ private void runToolWindows() {
7979
private void runToolUnix() {
8080
Directory toolsFolder = this.toolsFolder.get();
8181
String toolName = this.toolName.get();
82-
File outputFile = toolsFolder.file(toolName + ".sh").getAsFile();
82+
File outputFile = toolsFolder.file(toolName).getAsFile();
8383
operations.exec(spec -> {
8484
spec.setExecutable(outputFile.getAbsolutePath());
8585
});

src/main/java/edu/wpi/first/gradlerio/wpi/dependencies/tools/WPIToolsPlugin.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ public void apply(Project project) {
5656
"edu.wpi.first.tools:wpical", toolsFolder));
5757
}
5858

59+
cppTools.add(new WPICppTool(project, "processstarter", wpi.getVersions().getprocessstarterToolVersion(),
60+
"edu.wpi.first.tools:processstarter", toolsFolder));
61+
5962
project.getTasks().register("InstallAllTools", task -> {
6063
task.setGroup("GradleRIO");
6164
task.setDescription("Install All Tools");

src/main/resources/ScriptBase.py

Lines changed: 0 additions & 55 deletions
This file was deleted.

src/main/resources/ScriptBase.sh

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/main/resources/ScriptBase.vbs

Lines changed: 0 additions & 84 deletions
This file was deleted.

versionupdates.gradle

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def versionMap = [
1515
imguiVersion: 'edu.wpi.first.thirdparty.frc2024:imgui:+:headers',
1616
wpimathVersion: 'edu.wpi.first.wpimath:wpimath-java:+',
1717
wpicalToolVersion: 'edu.wpi.first.tools:wpical:+:windowsx86-64@zip',
18+
processstarterToolVersion: 'edu.wpi.first.tools:processstarter:+:windowsx86-64@zip',
1819
]
1920

2021
configurations {
@@ -39,6 +40,7 @@ dependencies {
3940
}
4041

4142
String regex = "String\\s+?placeholder\\s+?=\\s+?[\\\"|\\'].+?[\\\"|\\']"
43+
String buildRegex = "def\\s+?placeholder\\s+?=\\s+?[\\\"|\\'].+?[\\\"|\\']"
4244
String mavenDevRegex = "this\\.useDevelopment\\s*=\\s*(true|false)"
4345
String validVersionsRegex = "validImageVersions = List\\.of\\((.+)\\);"
4446

@@ -67,6 +69,19 @@ tasks.register('UpdateVersions') {
6769
}
6870
extFile.text = extText
6971

72+
def buildFile = file('build.gradle')
73+
def buildText = buildFile.text
74+
configurations.gradleRioVersions.resolvedConfiguration.resolvedArtifacts.each {
75+
versionMap.each { key, value ->
76+
def id = it.moduleVersion.id
77+
if (value.startsWith("${id.group}:${it.name}:+".toString())) {
78+
def localBuildRegex = buildRegex.replace('placeholder', key)
79+
buildText = buildText.replaceAll(localBuildRegex, "def ${key} = \"${id.version}\"".toString())
80+
}
81+
}
82+
}
83+
buildFile.text = buildText
84+
7085
def allowedVersions = ""
7186
def first = true
7287
configurations.gradleRioVersions.resolvedConfiguration.resolvedArtifacts.each {

0 commit comments

Comments
 (0)