[serenity] Add SerenityOS port

SerenityOS[0] is a moderately well-behaved hobbyist Unix-like operating
system. This CL adds the required macros and gen.py changes to both
cross-compile to Serenity and to build on-system.

The only non-OS macro change is ensuring that exec_process.cpp includes
sys/select.h in order to make the definition of select() available.

In local testing, only one test from gn_unittests failed, related to
futimes.

[0] https://github.com/SerenityOS/serenity

Change-Id: Id9840d06e86b31ce6e6010405dbd6ec79826006f
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/15660
Reviewed-by: Nico Weber <thakis@google.com>
Reviewed-by: Nico Weber <thakis@chromium.org>
Reviewed-by: Brett Wilson <brettw@google.com>
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Nico Weber <thakis@google.com>
diff --git a/build/gen.py b/build/gen.py
index dbf6035..adb622a 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -57,10 +57,12 @@
       self._platform = 'solaris'
     elif self._platform.startswith('zos'):
       self._platform = 'zos'
+    elif self._platform.startswith('serenity'):
+      self._platform = 'serenity'
 
   @staticmethod
   def known_platforms():
-    return ['linux', 'darwin', 'mingw', 'msys', 'msvc', 'aix', 'fuchsia', 'freebsd', 'netbsd', 'openbsd', 'haiku', 'solaris', 'zos']
+    return ['linux', 'darwin', 'mingw', 'msys', 'msvc', 'aix', 'fuchsia', 'freebsd', 'netbsd', 'openbsd', 'haiku', 'solaris', 'zos', 'serenity']
 
   def platform(self):
     return self._platform
@@ -93,11 +95,14 @@
     return self._platform == 'solaris'
 
   def is_posix(self):
-    return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd', 'haiku', 'solaris', 'msys', 'netbsd']
+    return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd', 'haiku', 'solaris', 'msys', 'netbsd', 'serenity']
 
   def is_zos(self):
     return self._platform == 'zos'
 
+  def is_serenity(self):
+    return self_.platform == 'serenity'
+
 class ArgumentsList:
   """Helper class to accumulate ArgumentParser argument definitions
   and be able to regenerate a corresponding command-line to be
@@ -288,6 +293,7 @@
       'solaris': 'build_linux.ninja.template',
       'netbsd': 'build_linux.ninja.template',
       'zos': 'build_zos.ninja.template',
+      'serenity': 'build_linux.ninja.template',
   }[platform.platform()])
 
   with open(template_filename) as f:
diff --git a/src/base/files/file.h b/src/base/files/file.h
index 419ba87..82c4f9e 100644
--- a/src/base/files/file.h
+++ b/src/base/files/file.h
@@ -23,7 +23,7 @@
 
 #if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) || \
     defined(OS_HAIKU) || defined(OS_MSYS) || defined(OS_ZOS) ||  \
-    defined(OS_ANDROID) && __ANDROID_API__ < 21
+    defined(OS_ANDROID) && __ANDROID_API__ < 21 || defined(OS_SERENITY)
 typedef struct stat stat_wrapper_t;
 #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
 typedef struct stat64 stat_wrapper_t;
diff --git a/src/base/files/file_posix.cc b/src/base/files/file_posix.cc
index a1d256c..e837b69 100644
--- a/src/base/files/file_posix.cc
+++ b/src/base/files/file_posix.cc
@@ -26,7 +26,7 @@
 
 #if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) || \
     defined(OS_HAIKU) || defined(OS_MSYS) || defined(OS_ZOS) || \
-    defined(OS_ANDROID) && __ANDROID_API__ < 21
+    defined(OS_ANDROID) && __ANDROID_API__ < 21 || defined(OS_SERENITY)
 int CallFstat(int fd, stat_wrapper_t* sb) {
   return fstat(fd, sb);
 }
diff --git a/src/base/files/file_util_posix.cc b/src/base/files/file_util_posix.cc
index b618151..08de845 100644
--- a/src/base/files/file_util_posix.cc
+++ b/src/base/files/file_util_posix.cc
@@ -61,7 +61,7 @@
 
 #if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) || \
     defined(OS_HAIKU) || defined(OS_MSYS) || defined(OS_ZOS) ||  \
-    defined(OS_ANDROID) && __ANDROID_API__ < 21
+    defined(OS_ANDROID) && __ANDROID_API__ < 21 || defined(OS_SERENITY)
 int CallStat(const char* path, stat_wrapper_t* sb) {
   return stat(path, sb);
 }
diff --git a/src/gn/args.cc b/src/gn/args.cc
index 5592d4a..6b5d25f 100644
--- a/src/gn/args.cc
+++ b/src/gn/args.cc
@@ -330,6 +330,8 @@
   os = "netbsd";
 #elif defined(OS_ZOS)
   os = "zos";
+#elif defined(OS_SERENITY)
+  os = "serenity";
 #else
 #error Unknown OS type.
 #endif
diff --git a/src/gn/exec_process.cc b/src/gn/exec_process.cc
index e1e123f..26c24e9 100644
--- a/src/gn/exec_process.cc
+++ b/src/gn/exec_process.cc
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <signal.h>
+#include <sys/select.h>
 #include <sys/time.h>
 #include <sys/wait.h>
 #include <unistd.h>
diff --git a/src/gn/function_write_file_unittest.cc b/src/gn/function_write_file_unittest.cc
index 8a8ef9a..ac83b19 100644
--- a/src/gn/function_write_file_unittest.cc
+++ b/src/gn/function_write_file_unittest.cc
@@ -13,7 +13,7 @@
 #include "gn/test_with_scope.h"
 #include "util/test/test.h"
 
-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_HAIKU) || defined(OS_MSYS)
+#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_HAIKU) || defined(OS_MSYS) || defined(OS_SERENITY)
 #include <sys/time.h>
 #elif defined(OS_ZOS)
 #include <utime.h>
diff --git a/src/util/build_config.h b/src/util/build_config.h
index 63ca16e..668518b 100644
--- a/src/util/build_config.h
+++ b/src/util/build_config.h
@@ -59,6 +59,8 @@
 #elif defined(__MVS__)
 #include "zos-base.h"
 #define OS_ZOS 1
+#elif defined(__serenity__)
+#define OS_SERENITY 1
 #else
 #error Please add support for your platform in build_config.h
 #endif
@@ -75,7 +77,7 @@
     defined(OS_FREEBSD) || defined(OS_LINUX) || defined(OS_MACOSX) || \
     defined(OS_NACL) || defined(OS_NETBSD) || defined(OS_OPENBSD) ||  \
     defined(OS_QNX) || defined(OS_SOLARIS) || defined(OS_HAIKU) || \
-    defined(OS_MSYS) || defined(OS_ZOS)
+    defined(OS_MSYS) || defined(OS_ZOS) || defined(OS_SERENITY)
 #define OS_POSIX 1
 #endif