@@ -321,23 +321,77 @@ static const char*my_tempfile(const char*str, FILE**fout)
321
321
return pathbuf ;
322
322
}
323
323
324
+ #ifdef __MINGW32__
325
+ /* system() on Windows is a bit special. It removes quotes at the begining and
326
+ * the end. Even if the quoted part is just part of the command.
327
+ * E.g. `"cmd" "arg"` would be executed as `cmd" "arg`. This prevents us from
328
+ * properly handling paths with spaces in it.
329
+ */
330
+ static int run_cmd (const char * cmd )
331
+ {
332
+ DWORD exit_code ;
333
+ char * cmd2 ;
334
+ size_t len ;
335
+ int rc ;
336
+
337
+ len = strlen (cmd ) + 13 ;
338
+ cmd2 = malloc (len );
339
+ rc = snprintf (cmd2 , len , "cmd /S /C \"%s\"" , cmd );
340
+ if (rc < 0 ) {
341
+ free (cmd2 );
342
+ return rc ;
343
+ }
344
+
345
+ if (verbose_flag )
346
+ fprintf (stderr , "Executing: %s" , cmd2 );
347
+
348
+ STARTUPINFO si ;
349
+ PROCESS_INFORMATION pi ;
350
+
351
+ memset (& si , 0x00 , sizeof (si ));
352
+ si .cb = sizeof (si );
353
+ memset (& pi , 0x00 , sizeof (pi ));
354
+
355
+ if (!CreateProcess (NULL , cmd2 , NULL , NULL , FALSE, 0 , NULL , NULL , & si , & pi )) {
356
+ fprintf (stderr , "CreateProcess failed (%lu).\n" , GetLastError ());
357
+ free (cmd2 );
358
+ return -1 ;
359
+ }
360
+
361
+ WaitForSingleObject (pi .hProcess , INFINITE );
362
+ GetExitCodeProcess (pi .hProcess , & exit_code );
363
+
364
+ CloseHandle (pi .hProcess );
365
+ CloseHandle (pi .hThread );
366
+
367
+ free (cmd2 );
368
+
369
+ return exit_code ;
370
+ }
371
+ #else
372
+ static int run_cmd (const char * cmd )
373
+ {
374
+ return system (cmd );
375
+ }
376
+ #endif
377
+
324
378
static int t_version_only (void )
325
379
{
326
380
int rc ;
327
381
remove (source_path );
328
382
free (source_path );
329
383
330
384
fflush (0 );
331
- snprintf (tmp , sizeof tmp , "%s%civlpp -V" , ivlpp_dir , sep );
332
- rc = system (tmp );
385
+ snprintf (tmp , sizeof tmp , "\" %s%civlpp\" -V" , ivlpp_dir , sep );
386
+ rc = run_cmd (tmp );
333
387
if (rc != 0 ) {
334
388
fprintf (stderr , "Unable to get version from \"%s\"\n" , tmp );
335
389
}
336
390
337
391
fflush (0 );
338
- snprintf (tmp , sizeof tmp , "%s%civl -V -C\"%s\" -C\"%s\"" , base , sep ,
392
+ snprintf (tmp , sizeof tmp , "\" %s%civl\" -V -C\"%s\" -C\"%s\"" , base , sep ,
339
393
iconfig_path , iconfig_common_path );
340
- rc = system (tmp );
394
+ rc = run_cmd (tmp );
341
395
if (rc != 0 ) {
342
396
fprintf (stderr , "Unable to get version from \"%s\"\n" , tmp );
343
397
}
@@ -356,7 +410,7 @@ static int t_version_only(void)
356
410
357
411
static void build_preprocess_command (int e_flag )
358
412
{
359
- snprintf (tmp , sizeof tmp , "%s%civlpp%s%s%s -F\"%s\" -f\"%s\" -p\"%s\"%s" ,
413
+ snprintf (tmp , sizeof tmp , "\" %s%civlpp\" %s%s%s -F\"%s\" -f\"%s\" -p\"%s\"%s" ,
360
414
ivlpp_dir , sep ,
361
415
verbose_flag ? " -v" : "" ,
362
416
e_flag ? "" : " -L" ,
@@ -388,7 +442,7 @@ static int t_preprocess_only(void)
388
442
if (verbose_flag )
389
443
printf ("preprocess: %s\n" , cmd );
390
444
391
- rc = system (cmd );
445
+ rc = run_cmd (cmd );
392
446
remove (source_path );
393
447
free (source_path );
394
448
@@ -442,7 +496,7 @@ static int t_compile(void)
442
496
#endif
443
497
444
498
/* Build the ivl command. */
445
- snprintf (tmp , sizeof tmp , "%s%civl" , base , sep );
499
+ snprintf (tmp , sizeof tmp , "\" %s%civl\" " , base , sep );
446
500
rc = strlen (tmp );
447
501
cmd = realloc (cmd , ncmd + rc + 1 );
448
502
strcpy (cmd + ncmd , tmp );
@@ -489,7 +543,7 @@ static int t_compile(void)
489
543
printf ("translate: %s\n" , cmd );
490
544
491
545
492
- rc = system (cmd );
546
+ rc = run_cmd (cmd );
493
547
if ( ! getenv ("IVERILOG_ICONFIG" )) {
494
548
remove (source_path );
495
549
free (source_path );
@@ -1420,7 +1474,7 @@ int main(int argc, char **argv)
1420
1474
1421
1475
if (vhdlpp_work == 0 )
1422
1476
vhdlpp_work = "ivl_vhdl_work" ;
1423
- fprintf (defines_file , "vhdlpp:%s%cvhdlpp\n" , vhdlpp_dir , sep );
1477
+ fprintf (defines_file , "vhdlpp:\" %s%cvhdlpp\" \n" , vhdlpp_dir , sep );
1424
1478
fprintf (defines_file , "vhdlpp-work:%s\n" , vhdlpp_work );
1425
1479
for (unsigned idx = 0 ; idx < vhdlpp_libdir_cnt ; idx += 1 )
1426
1480
fprintf (defines_file , "vhdlpp-libdir:%s\n" , vhdlpp_libdir [idx ]);
@@ -1483,7 +1537,7 @@ int main(int argc, char **argv)
1483
1537
/* Write the preprocessor command needed to preprocess a
1484
1538
single file. This may be used to preprocess library
1485
1539
files. */
1486
- fprintf (iconfig_file , "ivlpp:%s%civlpp %s -L -F\"%s\" -P\"%s\"\n" ,
1540
+ fprintf (iconfig_file , "ivlpp:\" %s%civlpp\" %s -L -F\"%s\" -P\"%s\"\n" ,
1487
1541
ivlpp_dir , sep ,
1488
1542
strchr (warning_flags , 'r' ) ? "-Wredef-all" :
1489
1543
strchr (warning_flags , 'R' ) ? "-Wredef-chg" : "" ,
0 commit comments