mirror of
https://github.com/arduino/Arduino.git
synced 2025-02-12 06:54:24 +01:00
Use plain exec methods on arduino-builder invocation
ApacheCommons do some command-line tweaking that doesnt fit well with argument passing to arduino-builder, in particular for -prefs arguments containing spaces.
This commit is contained in:
parent
b4ada94e44
commit
f19bf5cf4c
@ -39,6 +39,7 @@ import processing.app.*;
|
|||||||
import processing.app.debug.*;
|
import processing.app.debug.*;
|
||||||
import processing.app.helpers.PreferencesMap;
|
import processing.app.helpers.PreferencesMap;
|
||||||
import processing.app.helpers.PreferencesMapException;
|
import processing.app.helpers.PreferencesMapException;
|
||||||
|
import processing.app.helpers.ProcessUtils;
|
||||||
import processing.app.helpers.StringReplacer;
|
import processing.app.helpers.StringReplacer;
|
||||||
import processing.app.legacy.PApplet;
|
import processing.app.legacy.PApplet;
|
||||||
import processing.app.tools.DoubleQuotedArgumentsOnWindowsCommandLine;
|
import processing.app.tools.DoubleQuotedArgumentsOnWindowsCommandLine;
|
||||||
@ -141,7 +142,7 @@ public class Compiler implements MessageConsumer {
|
|||||||
MessageConsumerOutputStream out = new MessageConsumerOutputStream(new ProgressAwareMessageConsumer(new I18NAwareMessageConsumer(System.out, System.err), progListener), "\n");
|
MessageConsumerOutputStream out = new MessageConsumerOutputStream(new ProgressAwareMessageConsumer(new I18NAwareMessageConsumer(System.out, System.err), progListener), "\n");
|
||||||
MessageConsumerOutputStream err = new MessageConsumerOutputStream(new I18NAwareMessageConsumer(System.err, Compiler.this), "\n");
|
MessageConsumerOutputStream err = new MessageConsumerOutputStream(new I18NAwareMessageConsumer(System.err, Compiler.this), "\n");
|
||||||
|
|
||||||
callArduinoBuilder(board, platform, aPackage, vidpid, BuilderAction.COMPILE, new PumpStreamHandler(out, err));
|
callArduinoBuilder(board, platform, aPackage, vidpid, BuilderAction.COMPILE, out, err);
|
||||||
|
|
||||||
out.flush();
|
out.flush();
|
||||||
err.flush();
|
err.flush();
|
||||||
@ -179,7 +180,7 @@ public class Compiler implements MessageConsumer {
|
|||||||
ByteArrayOutputStream stderr = new ByteArrayOutputStream();
|
ByteArrayOutputStream stderr = new ByteArrayOutputStream();
|
||||||
MessageConsumerOutputStream err = new MessageConsumerOutputStream(new I18NAwareMessageConsumer(new PrintStream(stderr), Compiler.this), "\n");
|
MessageConsumerOutputStream err = new MessageConsumerOutputStream(new I18NAwareMessageConsumer(new PrintStream(stderr), Compiler.this), "\n");
|
||||||
try {
|
try {
|
||||||
callArduinoBuilder(board, platform, aPackage, vidpid, BuilderAction.DUMP_PREFS, new PumpStreamHandler(stdout, err));
|
callArduinoBuilder(board, platform, aPackage, vidpid, BuilderAction.DUMP_PREFS, stdout, err);
|
||||||
} catch (RunnerException e) {
|
} catch (RunnerException e) {
|
||||||
System.err.println(new String(stderr.toByteArray()));
|
System.err.println(new String(stderr.toByteArray()));
|
||||||
throw e;
|
throw e;
|
||||||
@ -189,90 +190,101 @@ public class Compiler implements MessageConsumer {
|
|||||||
return prefs;
|
return prefs;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void callArduinoBuilder(TargetBoard board, TargetPlatform platform, TargetPackage aPackage, String vidpid, BuilderAction action, PumpStreamHandler streamHandler) throws RunnerException {
|
private void callArduinoBuilder(TargetBoard board, TargetPlatform platform, TargetPackage aPackage, String vidpid, BuilderAction action, OutputStream outStream, OutputStream errStream) throws RunnerException {
|
||||||
File executable = BaseNoGui.getContentFile("arduino-builder");
|
List<String> cmd = new ArrayList<>();
|
||||||
CommandLine commandLine = new CommandLine(executable);
|
cmd.add(BaseNoGui.getContentFile("arduino-builder").getAbsolutePath());
|
||||||
commandLine.addArgument(action.value, false);
|
cmd.add(action.value);
|
||||||
commandLine.addArgument("-logger=machine", false);
|
cmd.add("-logger=machine");
|
||||||
|
|
||||||
Stream.of(BaseNoGui.getHardwarePath(), new File(BaseNoGui.getSettingsFolder(), "packages").getAbsolutePath(), BaseNoGui.getSketchbookHardwareFolder().getAbsolutePath())
|
Stream.of(BaseNoGui.getHardwarePath(), new File(BaseNoGui.getSettingsFolder(), "packages").getAbsolutePath(), BaseNoGui.getSketchbookHardwareFolder().getAbsolutePath())
|
||||||
.forEach(p -> {
|
.forEach(p -> {
|
||||||
if (Files.exists(Paths.get(p))) {
|
if (Files.exists(Paths.get(p))) {
|
||||||
commandLine.addArgument("-hardware", false);
|
cmd.add("-hardware");
|
||||||
commandLine.addArgument("\"" + p + "\"", false);
|
cmd.add(p);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Stream.of(BaseNoGui.getContentFile("tools-builder").getAbsolutePath(), Paths.get(BaseNoGui.getHardwarePath(), "tools", "avr").toAbsolutePath().toString(), new File(BaseNoGui.getSettingsFolder(), "packages").getAbsolutePath())
|
Stream.of(BaseNoGui.getContentFile("tools-builder").getAbsolutePath(), Paths.get(BaseNoGui.getHardwarePath(), "tools", "avr").toAbsolutePath().toString(), new File(BaseNoGui.getSettingsFolder(), "packages").getAbsolutePath())
|
||||||
.forEach(p -> {
|
.forEach(p -> {
|
||||||
if (Files.exists(Paths.get(p))) {
|
if (Files.exists(Paths.get(p))) {
|
||||||
commandLine.addArgument("-tools", false);
|
cmd.add("-tools");
|
||||||
commandLine.addArgument("\"" + p + "\"", false);
|
cmd.add(p);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
commandLine.addArgument("-built-in-libraries", false);
|
cmd.add("-built-in-libraries");
|
||||||
commandLine.addArgument("\"" + BaseNoGui.getContentFile("libraries").getAbsolutePath() + "\"", false);
|
cmd.add(BaseNoGui.getContentFile("libraries").getAbsolutePath());
|
||||||
commandLine.addArgument("-libraries", false);
|
cmd.add("-libraries");
|
||||||
commandLine.addArgument("\"" + BaseNoGui.getSketchbookLibrariesFolder().getAbsolutePath() + "\"", false);
|
cmd.add(BaseNoGui.getSketchbookLibrariesFolder().getAbsolutePath());
|
||||||
|
|
||||||
String fqbn = Stream.of(aPackage.getId(), platform.getId(), board.getId(), boardOptions(board)).filter(s -> !s.isEmpty()).collect(Collectors.joining(":"));
|
String fqbn = Stream.of(aPackage.getId(), platform.getId(), board.getId(), boardOptions(board)).filter(s -> !s.isEmpty()).collect(Collectors.joining(":"));
|
||||||
commandLine.addArgument("-fqbn=" + fqbn, false);
|
cmd.add("-fqbn=" + fqbn);
|
||||||
|
|
||||||
if (!"".equals(vidpid)) {
|
if (!"".equals(vidpid)) {
|
||||||
commandLine.addArgument("-vid-pid=" + vidpid, false);
|
cmd.add("-vid-pid=" + vidpid);
|
||||||
}
|
}
|
||||||
|
|
||||||
commandLine.addArgument("-ide-version=" + BaseNoGui.REVISION, false);
|
cmd.add("-ide-version=" + BaseNoGui.REVISION);
|
||||||
commandLine.addArgument("-build-path", false);
|
cmd.add("-build-path");
|
||||||
commandLine.addArgument("\"" + buildPath + "\"", false);
|
cmd.add(buildPath);
|
||||||
commandLine.addArgument("-warnings=" + PreferencesData.get("compiler.warning_level"), false);
|
cmd.add("-warnings=" + PreferencesData.get("compiler.warning_level"));
|
||||||
|
|
||||||
PreferencesData.getMap()
|
PreferencesData.getMap()
|
||||||
.subTree("runtime.build_properties_custom")
|
.subTree("runtime.build_properties_custom")
|
||||||
.entrySet()
|
.entrySet()
|
||||||
.stream()
|
.stream()
|
||||||
.forEach(kv -> commandLine.addArgument("-prefs=\"" + kv.getKey() + "=" + kv.getValue() + "\"", false));
|
.forEach(kv -> cmd.add("-prefs=" + kv.getKey() + "=" + kv.getValue()));
|
||||||
|
|
||||||
commandLine.addArgument("-prefs=build.warn_data_percentage=" + PreferencesData.get("build.warn_data_percentage"));
|
cmd.add("-prefs=build.warn_data_percentage=" + PreferencesData.get("build.warn_data_percentage"));
|
||||||
|
|
||||||
for (Map.Entry<String, String> entry : BaseNoGui.getBoardPreferences().entrySet()) {
|
for (Map.Entry<String, String> entry : BaseNoGui.getBoardPreferences().entrySet()) {
|
||||||
if (entry.getKey().startsWith("runtime.tools")) {
|
if (entry.getKey().startsWith("runtime.tools")) {
|
||||||
commandLine.addArgument("-prefs=" + entry.getKey() + "=" + entry.getValue());
|
cmd.add("-prefs=" + entry.getKey() + "=" + entry.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//commandLine.addArgument("-debug-level=10", false);
|
//commandLine.addArgument("-debug-level=10", false);
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
commandLine.addArgument("-verbose", false);
|
cmd.add("-verbose");
|
||||||
}
|
}
|
||||||
|
|
||||||
commandLine.addArgument("\"" + pathToSketch + "\"", false);
|
cmd.add(pathToSketch);
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
System.out.println(commandLine);
|
System.out.println(StringUtils.join(cmd, ' '));
|
||||||
}
|
}
|
||||||
|
|
||||||
DefaultExecutor executor = new DefaultExecutor();
|
|
||||||
executor.setStreamHandler(streamHandler);
|
|
||||||
|
|
||||||
int result;
|
int result;
|
||||||
executor.setExitValues(null);
|
|
||||||
try {
|
try {
|
||||||
result = executor.execute(commandLine);
|
Process proc = ProcessUtils.exec(cmd.toArray(new String[0]));
|
||||||
} catch (IOException e) {
|
MessageSiphon in = new MessageSiphon(proc.getInputStream(), (msg) -> {
|
||||||
RunnerException re = new RunnerException(e.getMessage());
|
try {
|
||||||
re.hideStackTrace();
|
outStream.write(msg.getBytes());
|
||||||
throw re;
|
} catch (Exception e) {
|
||||||
|
exception = new RunnerException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
MessageSiphon err = new MessageSiphon(proc.getErrorStream(), (msg) -> {
|
||||||
|
try {
|
||||||
|
errStream.write(msg.getBytes());
|
||||||
|
} catch (Exception e) {
|
||||||
|
exception = new RunnerException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
in.join();
|
||||||
|
err.join();
|
||||||
|
result = proc.waitFor();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RunnerException(e);
|
||||||
}
|
}
|
||||||
executor.setExitValues(new int[0]);
|
|
||||||
|
|
||||||
if (exception != null)
|
if (exception != null)
|
||||||
throw exception;
|
throw exception;
|
||||||
|
|
||||||
if (result > 1) {
|
if (result > 1) {
|
||||||
System.err.println(I18n.format(tr("{0} returned {1}"), executable.getName(), result));
|
System.err.println(I18n.format(tr("{0} returned {1}"), cmd.get(0), result));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user