This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix compilation errors in win32.c with MinGW/gcc -xc++
authorSteve Hay <steve.m.hay@googlemail.com>
Sat, 20 Dec 2014 13:05:30 +0000 (13:05 +0000)
committerSteve Hay <steve.m.hay@googlemail.com>
Wed, 24 Dec 2014 13:20:06 +0000 (13:20 +0000)
In MinGW-w64 builds, there are warnings/errors like this (depending on the
compiler version used):

gcc-4.5.3:
warning: passing argument 2 of 'execv' from incompatible pointer type

gcc-4.8.0:
error: invalid conversion from 'const char* const*' to 'char* const*'

This happens because MinGW-w64's process.h declares execv/execvp's second
argument as 'char * const*' instead of 'const char * const*'.
The _execv/_execvp versions don't have this problem so use them instead.
MSDN says execv/execvp are deprecated POSIX functions; use the ISO C++
conformant _execv/_execvp instead anyway so it is not even worth sticking
with execv/execvp for those compilers (namely, MinGW and VC++) that have
the correct declarations.

Likewise with spawnv/spawnvp vs. _spawnv/_spawnvp.

win32/win32.c

index 21cdcc6..d388975 100644 (file)
@@ -3710,7 +3710,7 @@ DllExport int
 win32_spawnvp(int mode, const char *cmdname, const char *const *argv)
 {
 #ifdef USE_RTL_SPAWNVP
-    return spawnvp(mode, cmdname, (char * const *)argv);
+    return _spawnvp(mode, cmdname, (char * const *)argv);
 #else
     return do_spawnvp_handles(mode, cmdname, argv, NULL);
 #endif
@@ -3885,9 +3885,9 @@ win32_execv(const char *cmdname, const char *const *argv)
     /* if this is a pseudo-forked child, we just want to spawn
      * the new program, and return */
     if (w32_pseudo_id)
-       return spawnv(P_WAIT, cmdname, argv);
+       return _spawnv(P_WAIT, cmdname, argv);
 #endif
-    return execv(cmdname, argv);
+    return _execv(cmdname, argv);
 }
 
 DllExport int
@@ -3907,7 +3907,7 @@ win32_execvp(const char *cmdname, const char *const *argv)
            return status;
     }
 #endif
-    return execvp(cmdname, argv);
+    return _execvp(cmdname, argv);
 }
 
 DllExport void