@@ -321,23 +321,77 @@ static const char*my_tempfile(const char*str, FILE**fout)
321321 return pathbuf ;
322322}
323323
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+
324378static int t_version_only (void )
325379{
326380 int rc ;
327381 remove (source_path );
328382 free (source_path );
329383
330384 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 );
333387 if (rc != 0 ) {
334388 fprintf (stderr , "Unable to get version from \"%s\"\n" , tmp );
335389 }
336390
337391 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 ,
339393 iconfig_path , iconfig_common_path );
340- rc = system (tmp );
394+ rc = run_cmd (tmp );
341395 if (rc != 0 ) {
342396 fprintf (stderr , "Unable to get version from \"%s\"\n" , tmp );
343397 }
@@ -356,7 +410,7 @@ static int t_version_only(void)
356410
357411static void build_preprocess_command (int e_flag )
358412{
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" ,
360414 ivlpp_dir , sep ,
361415 verbose_flag ? " -v" : "" ,
362416 e_flag ? "" : " -L" ,
@@ -388,7 +442,7 @@ static int t_preprocess_only(void)
388442 if (verbose_flag )
389443 printf ("preprocess: %s\n" , cmd );
390444
391- rc = system (cmd );
445+ rc = run_cmd (cmd );
392446 remove (source_path );
393447 free (source_path );
394448
@@ -442,7 +496,7 @@ static int t_compile(void)
442496#endif
443497
444498 /* Build the ivl command. */
445- snprintf (tmp , sizeof tmp , "%s%civl" , base , sep );
499+ snprintf (tmp , sizeof tmp , "\" %s%civl\" " , base , sep );
446500 rc = strlen (tmp );
447501 cmd = realloc (cmd , ncmd + rc + 1 );
448502 strcpy (cmd + ncmd , tmp );
@@ -489,7 +543,7 @@ static int t_compile(void)
489543 printf ("translate: %s\n" , cmd );
490544
491545
492- rc = system (cmd );
546+ rc = run_cmd (cmd );
493547 if ( ! getenv ("IVERILOG_ICONFIG" )) {
494548 remove (source_path );
495549 free (source_path );
@@ -1420,7 +1474,7 @@ int main(int argc, char **argv)
14201474
14211475 if (vhdlpp_work == 0 )
14221476 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 );
14241478 fprintf (defines_file , "vhdlpp-work:%s\n" , vhdlpp_work );
14251479 for (unsigned idx = 0 ; idx < vhdlpp_libdir_cnt ; idx += 1 )
14261480 fprintf (defines_file , "vhdlpp-libdir:%s\n" , vhdlpp_libdir [idx ]);
@@ -1483,7 +1537,7 @@ int main(int argc, char **argv)
14831537 /* Write the preprocessor command needed to preprocess a
14841538 single file. This may be used to preprocess library
14851539 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" ,
14871541 ivlpp_dir , sep ,
14881542 strchr (warning_flags , 'r' ) ? "-Wredef-all" :
14891543 strchr (warning_flags , 'R' ) ? "-Wredef-chg" : "" ,
0 commit comments