Browse Source

Merge pull request #3485 from pherl/mingw

Fix build on MinGW32
Jisi Liu 8 năm trước cách đây
mục cha
commit
eaeca0d42b

+ 1 - 1
src/google/protobuf/compiler/command_line_interface.cc

@@ -108,7 +108,7 @@ namespace compiler {
 #endif
 
 namespace {
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(_MSC_VER)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
 using google::protobuf::internal::win32::access;

+ 1 - 1
src/google/protobuf/compiler/command_line_interface_unittest.cc

@@ -69,7 +69,7 @@ namespace google {
 namespace protobuf {
 namespace compiler {
 
-#if defined(_WIN32)
+#if defined(_MSC_VER)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
 using google::protobuf::internal::win32::access;

+ 3 - 0
src/google/protobuf/compiler/importer.cc

@@ -59,6 +59,9 @@
 
 #ifdef _WIN32
 #include <ctype.h>
+#endif
+
+#ifdef _MSC_VER
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
 using google::protobuf::internal::win32::access;

+ 1 - 1
src/google/protobuf/compiler/objectivec/objectivec_helpers.cc

@@ -50,7 +50,7 @@
 #include <google/protobuf/stubs/io_win32.h>
 #include <google/protobuf/stubs/strutil.h>
 
-#if defined(_WIN32)
+#if defined(_MSC_VER)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
 using google::protobuf::internal::win32::open;

+ 1 - 1
src/google/protobuf/compiler/plugin.cc

@@ -49,7 +49,7 @@
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 
-#if defined(_WIN32)
+#if defined(_MSC_VER)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
 using google::protobuf::internal::win32::setmode;

+ 13 - 2
src/google/protobuf/compiler/subprocess.cc

@@ -33,6 +33,7 @@
 #include <google/protobuf/compiler/subprocess.h>
 
 #include <algorithm>
+#include <cstring>
 #include <iostream>
 
 #ifndef _WIN32
@@ -51,6 +52,16 @@ namespace google {
 namespace protobuf {
 namespace compiler {
 
+namespace {
+char* portable_strdup(const char* s) {
+  char* ns = (char*) malloc(strlen(s) + 1);
+  if (ns != NULL) {
+    strcpy(ns, s);
+  }
+  return ns;
+}
+}  // namespace
+
 #ifdef _WIN32
 
 static void CloseHandleOrDie(HANDLE handle) {
@@ -114,7 +125,7 @@ void Subprocess::Start(const string& program, SearchMode search_mode) {
   }
 
   // CreateProcess() mutates its second parameter.  WTF?
-  char* name_copy = strdup(program.c_str());
+  char* name_copy = portable_strdup(program.c_str());
 
   // Create the process.
   PROCESS_INFORMATION process_info;
@@ -298,7 +309,7 @@ void Subprocess::Start(const string& program, SearchMode search_mode) {
   GOOGLE_CHECK(pipe(stdin_pipe) != -1);
   GOOGLE_CHECK(pipe(stdout_pipe) != -1);
 
-  char* argv[2] = { strdup(program.c_str()), NULL };
+  char* argv[2] = { portable_strdup(program.c_str()), NULL };
 
   child_pid_ = fork();
   if (child_pid_ == -1) {

+ 3 - 0
src/google/protobuf/io/zero_copy_stream_impl.cc

@@ -56,6 +56,9 @@ namespace io {
 // Win32 lseek is broken:  If invoked on a non-seekable file descriptor, its
 // return value is undefined.  We re-define it to always produce an error.
 #define lseek(fd, offset, origin) ((off_t)-1)
+#endif
+
+#ifdef _MSC_VER
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
 using google::protobuf::internal::win32::access;

+ 3 - 0
src/google/protobuf/io/zero_copy_stream_unittest.cc

@@ -83,6 +83,9 @@ namespace {
 
 #ifdef _WIN32
 #define pipe(fds) _pipe(fds, 4096, O_BINARY)
+#endif
+
+#ifdef _MSC_VER
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
 using google::protobuf::internal::win32::access;

+ 1 - 1
src/google/protobuf/message_unittest.cc

@@ -63,7 +63,7 @@
 namespace google {
 namespace protobuf {
 
-#if defined(_WIN32)
+#if defined(_MSC_VER)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
 using google::protobuf::internal::win32::close;

+ 7 - 7
src/google/protobuf/stubs/io_win32.cc

@@ -39,7 +39,7 @@
 //
 // This file is only used on Windows, it's empty on other platforms.
 
-#if defined(_WIN32)
+#if defined(_MSC_VER)
 
 // Comment this out to fall back to using the ANSI versions (open, mkdir, ...)
 // instead of the Unicode ones (_wopen, _wmkdir, ...). Doing so can be useful to
@@ -105,15 +105,15 @@ bool has_longpath_prefix(const char_type* path) {
          path[3] == '\\';
 }
 
-// Returns true if the path starts with a drive specifier (e.g. "c:\").
 template <typename char_type>
-bool is_path_absolute(const char_type* path) {
-  return has_drive_letter(path) && is_separator(path[2]);
+bool is_separator(char_type c) {
+  return c == '/' || c == '\\';
 }
 
+// Returns true if the path starts with a drive specifier (e.g. "c:\").
 template <typename char_type>
-bool is_separator(char_type c) {
-  return c == '/' || c == '\\';
+bool is_path_absolute(const char_type* path) {
+  return has_drive_letter(path) && is_separator(path[2]);
 }
 
 template <typename char_type>
@@ -358,5 +358,5 @@ wstring testonly_path_to_winpath(const string& path) {
 }  // namespace protobuf
 }  // namespace google
 
-#endif  // defined(_WIN32)
+#endif  // defined(_MSC_VER)
 

+ 6 - 0
src/google/protobuf/stubs/io_win32.h

@@ -50,6 +50,9 @@
 #include <string>
 #include <google/protobuf/stubs/port.h>
 
+// Compilers on Windows other than MSVC (e.g. Cygwin, MinGW32) define the
+// following functions already, except for mkdir.
+#ifdef _MSC_VER
 namespace google {
 namespace protobuf {
 namespace internal {
@@ -74,6 +77,9 @@ LIBPROTOBUF_EXPORT std::wstring testonly_path_to_winpath(
 }  // namespace internal
 }  // namespace protobuf
 }  // namespace google
+#else  // _MSC_VER
+#define mkdir(name, mode) mkdir(name)
+#endif // !_MSC_VER
 
 #ifndef W_OK
 #define W_OK 02  // not defined by MSVC for whatever reason

+ 3 - 0
src/google/protobuf/testing/file.cc

@@ -55,6 +55,9 @@ namespace protobuf {
 #define lstat stat
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
+#endif
+
+#ifdef _MSC_VER
 using google::protobuf::internal::win32::access;
 using google::protobuf::internal::win32::chdir;
 using google::protobuf::internal::win32::fopen;

+ 1 - 1
src/google/protobuf/testing/googletest.cc

@@ -52,7 +52,7 @@
 namespace google {
 namespace protobuf {
 
-#ifdef _WIN32
+#ifdef _MSC_VER
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
 using google::protobuf::internal::win32::close;