Add support for Solaris and illumos systems

Change-Id: I72406d16c0f15c909219a94dcf396e013a9501db
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/9560
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/build/gen.py b/build/gen.py
index 9353fb1..c4effa8 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -49,10 +49,12 @@
       self._platform = 'openbsd'
     elif self._platform.startswith('haiku'):
       self._platform = 'haiku'
+    elif self._platform.startswith('sunos'):
+      self._platform = 'solaris'
 
   @staticmethod
   def known_platforms():
-    return ['linux', 'darwin', 'mingw', 'msvc', 'aix', 'fuchsia', 'freebsd', 'openbsd', 'haiku']
+    return ['linux', 'darwin', 'mingw', 'msvc', 'aix', 'fuchsia', 'freebsd', 'openbsd', 'haiku', 'solaris']
 
   def platform(self):
     return self._platform
@@ -78,8 +80,11 @@
   def is_haiku(self):
     return self._platform == 'haiku'
 
+  def is_solaris(self):
+    return self._platform == 'solaris'
+
   def is_posix(self):
-    return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd', 'haiku']
+    return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd', 'haiku', 'solaris']
 
 
 def main(argv):
@@ -203,6 +208,7 @@
       'aix': 'build_aix.ninja.template',
       'openbsd': 'build_openbsd.ninja.template',
       'haiku': 'build_haiku.ninja.template',
+      'solaris': 'build_linux.ninja.template',
   }[platform.platform()])
 
   with open(template_filename) as f:
@@ -318,7 +324,7 @@
       ldflags.extend(['-fdata-sections', '-ffunction-sections'])
       if platform.is_darwin():
         ldflags.append('-Wl,-dead_strip')
-      elif not platform.is_aix():
+      elif not platform.is_aix() and not platform.is_solaris():
         # Garbage collection is done by default on aix.
         ldflags.append('-Wl,--gc-sections')
 
@@ -328,6 +334,8 @@
           ldflags.append('-Wl,-S')
         elif platform.is_aix():
           ldflags.append('-Wl,-s')
+        elif platform.is_solaris():
+          ldflags.append('-Wl,--strip-all')
         else:
           ldflags.append('-Wl,-strip-all')
 
diff --git a/src/gn/args.cc b/src/gn/args.cc
index 4d5a720..bba3eca 100644
--- a/src/gn/args.cc
+++ b/src/gn/args.cc
@@ -316,6 +316,8 @@
   os = "openbsd";
 #elif defined(OS_HAIKU)
   os = "haiku";
+#elif defined(OS_SOLARIS)
+  os = "solaris";
 #else
 #error Unknown OS type.
 #endif
diff --git a/src/gn/function_write_file_unittest.cc b/src/gn/function_write_file_unittest.cc
index 78eefc5..7113526 100644
--- a/src/gn/function_write_file_unittest.cc
+++ b/src/gn/function_write_file_unittest.cc
@@ -89,7 +89,7 @@
   FILETIME last_modified_filetime = {};
   ASSERT_TRUE(::SetFileTime(foo_file.GetPlatformFile(), nullptr,
                             &last_access_filetime, &last_modified_filetime));
-#elif defined(OS_AIX) || defined(OS_HAIKU)
+#elif defined(OS_AIX) || defined(OS_HAIKU) || defined(OS_SOLARIS)
   struct timeval times[2] = {};
   ASSERT_EQ(utimes(foo_name.value().c_str(), times), 0);
 #else
diff --git a/src/util/exe_path.cc b/src/util/exe_path.cc
index 3b66a7b..0a91bcc 100644
--- a/src/util/exe_path.cc
+++ b/src/util/exe_path.cc
@@ -22,6 +22,8 @@
 #elif defined(OS_HAIKU)
 #include <OS.h>
 #include <image.h>
+#elif defined(OS_SOLARIS)
+#include <stdlib.h>
 #endif
 
 #if defined(OS_MACOSX)
@@ -80,6 +82,16 @@
   return base::FilePath(std::string(i_info.name));
 }
 
+#elif defined(OS_SOLARIS)
+
+base::FilePath GetExePath() {
+  const char *raw = getexecname();
+  if (raw == NULL) {
+    return base::FilePath();
+  }
+  return base::FilePath(raw);
+}
+
 #else
 
 base::FilePath GetExePath() {
diff --git a/src/util/sys_info.cc b/src/util/sys_info.cc
index 5fefc9b..082d2d6 100644
--- a/src/util/sys_info.cc
+++ b/src/util/sys_info.cc
@@ -26,6 +26,11 @@
   std::string arch(info.machine);
   if (arch == "i386" || arch == "i486" || arch == "i586" || arch == "i686") {
     arch = "x86";
+  } else if (arch == "i86pc") {
+    // Solaris and illumos systems report 'i86pc' (an Intel x86 PC) as their
+    // machine for both 32-bit and 64-bit x86 systems.  Considering the rarity
+    // of 32-bit systems at this point, it is safe to assume 64-bit.
+    arch = "x86_64";
   } else if (arch == "amd64") {
     arch = "x86_64";
   } else if (std::string(info.sysname) == "AIX") {