39
39
import processing .app .debug .*;
40
40
import processing .app .helpers .PreferencesMap ;
41
41
import processing .app .helpers .PreferencesMapException ;
42
+ import processing .app .helpers .ProcessUtils ;
42
43
import processing .app .helpers .StringReplacer ;
43
44
import processing .app .legacy .PApplet ;
44
45
import processing .app .tools .DoubleQuotedArgumentsOnWindowsCommandLine ;
@@ -141,7 +142,7 @@ public String build(CompilerProgressListener progListener, boolean exportHex) th
141
142
MessageConsumerOutputStream out = new MessageConsumerOutputStream (new ProgressAwareMessageConsumer (new I18NAwareMessageConsumer (System .out , System .err ), progListener ), "\n " );
142
143
MessageConsumerOutputStream err = new MessageConsumerOutputStream (new I18NAwareMessageConsumer (System .err , Compiler .this ), "\n " );
143
144
144
- callArduinoBuilder (board , platform , aPackage , vidpid , BuilderAction .COMPILE , new PumpStreamHandler ( out , err ) );
145
+ callArduinoBuilder (board , platform , aPackage , vidpid , BuilderAction .COMPILE , out , err );
145
146
146
147
out .flush ();
147
148
err .flush ();
@@ -179,7 +180,7 @@ private PreferencesMap loadPreferences(TargetBoard board, TargetPlatform platfor
179
180
ByteArrayOutputStream stderr = new ByteArrayOutputStream ();
180
181
MessageConsumerOutputStream err = new MessageConsumerOutputStream (new I18NAwareMessageConsumer (new PrintStream (stderr ), Compiler .this ), "\n " );
181
182
try {
182
- callArduinoBuilder (board , platform , aPackage , vidpid , BuilderAction .DUMP_PREFS , new PumpStreamHandler ( stdout , err ) );
183
+ callArduinoBuilder (board , platform , aPackage , vidpid , BuilderAction .DUMP_PREFS , stdout , err );
183
184
} catch (RunnerException e ) {
184
185
System .err .println (new String (stderr .toByteArray ()));
185
186
throw e ;
@@ -189,90 +190,101 @@ private PreferencesMap loadPreferences(TargetBoard board, TargetPlatform platfor
189
190
return prefs ;
190
191
}
191
192
192
- private void callArduinoBuilder (TargetBoard board , TargetPlatform platform , TargetPackage aPackage , String vidpid , BuilderAction action , PumpStreamHandler streamHandler ) throws RunnerException {
193
- File executable = BaseNoGui . getContentFile ( "arduino-builder" );
194
- CommandLine commandLine = new CommandLine ( executable );
195
- commandLine . addArgument (action .value , false );
196
- commandLine . addArgument ("-logger=machine" , false );
193
+ private void callArduinoBuilder (TargetBoard board , TargetPlatform platform , TargetPackage aPackage , String vidpid , BuilderAction action , OutputStream outStream , OutputStream errStream ) throws RunnerException {
194
+ List < String > cmd = new ArrayList <>( );
195
+ cmd . add ( BaseNoGui . getContentFile ( "arduino-builder" ). getAbsolutePath () );
196
+ cmd . add (action .value );
197
+ cmd . add ("-logger=machine" );
197
198
198
199
Stream .of (BaseNoGui .getHardwarePath (), new File (BaseNoGui .getSettingsFolder (), "packages" ).getAbsolutePath (), BaseNoGui .getSketchbookHardwareFolder ().getAbsolutePath ())
199
200
.forEach (p -> {
200
201
if (Files .exists (Paths .get (p ))) {
201
- commandLine . addArgument ("-hardware" , false );
202
- commandLine . addArgument ( " \" " + p + " \" " , false );
202
+ cmd . add ("-hardware" );
203
+ cmd . add ( p );
203
204
}
204
205
});
205
206
206
207
Stream .of (BaseNoGui .getContentFile ("tools-builder" ).getAbsolutePath (), Paths .get (BaseNoGui .getHardwarePath (), "tools" , "avr" ).toAbsolutePath ().toString (), new File (BaseNoGui .getSettingsFolder (), "packages" ).getAbsolutePath ())
207
208
.forEach (p -> {
208
209
if (Files .exists (Paths .get (p ))) {
209
- commandLine . addArgument ("-tools" , false );
210
- commandLine . addArgument ( " \" " + p + " \" " , false );
210
+ cmd . add ("-tools" );
211
+ cmd . add ( p );
211
212
}
212
213
});
213
214
214
- commandLine . addArgument ("-built-in-libraries" , false );
215
- commandLine . addArgument ( " \" " + BaseNoGui .getContentFile ("libraries" ).getAbsolutePath () + " \" " , false );
216
- commandLine . addArgument ("-libraries" , false );
217
- commandLine . addArgument ( " \" " + BaseNoGui .getSketchbookLibrariesFolder ().getAbsolutePath () + " \" " , false );
215
+ cmd . add ("-built-in-libraries" );
216
+ cmd . add ( BaseNoGui .getContentFile ("libraries" ).getAbsolutePath ());
217
+ cmd . add ("-libraries" );
218
+ cmd . add ( BaseNoGui .getSketchbookLibrariesFolder ().getAbsolutePath ());
218
219
219
220
String fqbn = Stream .of (aPackage .getId (), platform .getId (), board .getId (), boardOptions (board )).filter (s -> !s .isEmpty ()).collect (Collectors .joining (":" ));
220
- commandLine . addArgument ("-fqbn=" + fqbn , false );
221
+ cmd . add ("-fqbn=" + fqbn );
221
222
222
223
if (!"" .equals (vidpid )) {
223
- commandLine . addArgument ("-vid-pid=" + vidpid , false );
224
+ cmd . add ("-vid-pid=" + vidpid );
224
225
}
225
226
226
- commandLine . addArgument ("-ide-version=" + BaseNoGui .REVISION , false );
227
- commandLine . addArgument ("-build-path" , false );
228
- commandLine . addArgument ( " \" " + buildPath + " \" " , false );
229
- commandLine . addArgument ("-warnings=" + PreferencesData .get ("compiler.warning_level" ), false );
227
+ cmd . add ("-ide-version=" + BaseNoGui .REVISION );
228
+ cmd . add ("-build-path" );
229
+ cmd . add ( buildPath );
230
+ cmd . add ("-warnings=" + PreferencesData .get ("compiler.warning_level" ));
230
231
231
232
PreferencesData .getMap ()
232
233
.subTree ("runtime.build_properties_custom" )
233
234
.entrySet ()
234
235
.stream ()
235
- .forEach (kv -> commandLine . addArgument ("-prefs=\" " + kv .getKey () + "=" + kv .getValue () + " \" " , false ));
236
+ .forEach (kv -> cmd . add ("-prefs=" + kv .getKey () + "=" + kv .getValue ()));
236
237
237
- commandLine . addArgument ("-prefs=build.warn_data_percentage=" + PreferencesData .get ("build.warn_data_percentage" ));
238
+ cmd . add ("-prefs=build.warn_data_percentage=" + PreferencesData .get ("build.warn_data_percentage" ));
238
239
239
240
for (Map .Entry <String , String > entry : BaseNoGui .getBoardPreferences ().entrySet ()) {
240
241
if (entry .getKey ().startsWith ("runtime.tools" )) {
241
- commandLine . addArgument ("-prefs=" + entry .getKey () + "=" + entry .getValue ());
242
+ cmd . add ("-prefs=" + entry .getKey () + "=" + entry .getValue ());
242
243
}
243
244
}
244
245
245
246
//commandLine.addArgument("-debug-level=10", false);
246
247
247
248
if (verbose ) {
248
- commandLine . addArgument ("-verbose" , false );
249
+ cmd . add ("-verbose" );
249
250
}
250
251
251
- commandLine . addArgument ( " \" " + pathToSketch + " \" " , false );
252
+ cmd . add ( pathToSketch );
252
253
253
254
if (verbose ) {
254
- System .out .println (commandLine );
255
+ System .out .println (StringUtils . join ( cmd , ' ' ) );
255
256
}
256
257
257
- DefaultExecutor executor = new DefaultExecutor ();
258
- executor .setStreamHandler (streamHandler );
259
-
260
258
int result ;
261
- executor .setExitValues (null );
262
259
try {
263
- result = executor .execute (commandLine );
264
- } catch (IOException e ) {
265
- RunnerException re = new RunnerException (e .getMessage ());
266
- re .hideStackTrace ();
267
- throw re ;
260
+ Process proc = ProcessUtils .exec (cmd .toArray (new String [0 ]));
261
+ MessageSiphon in = new MessageSiphon (proc .getInputStream (), (msg ) -> {
262
+ try {
263
+ outStream .write (msg .getBytes ());
264
+ } catch (Exception e ) {
265
+ exception = new RunnerException (e );
266
+ }
267
+ });
268
+ MessageSiphon err = new MessageSiphon (proc .getErrorStream (), (msg ) -> {
269
+ try {
270
+ errStream .write (msg .getBytes ());
271
+ } catch (Exception e ) {
272
+ exception = new RunnerException (e );
273
+ }
274
+ });
275
+
276
+ in .join ();
277
+ err .join ();
278
+ result = proc .waitFor ();
279
+ } catch (Exception e ) {
280
+ throw new RunnerException (e );
268
281
}
269
- executor .setExitValues (new int [0 ]);
270
282
271
283
if (exception != null )
272
284
throw exception ;
273
285
274
286
if (result > 1 ) {
275
- System .err .println (I18n .format (tr ("{0} returned {1}" ), executable . getName ( ), result ));
287
+ System .err .println (I18n .format (tr ("{0} returned {1}" ), cmd . get ( 0 ), result ));
276
288
}
277
289
278
290
if (result != 0 ) {
0 commit comments