Add support for building on Haiku.
This commit adds support for building GN on Haiku.
All tests pass on 32 bit and 64 bit Haiku.
Change-Id: I010dc8aafe44c29b3e7e90cb3bf5d69e822825ea
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/5000
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/base/files/file.h b/base/files/file.h
index 3355030..838d0b8 100644
--- a/base/files/file.h
+++ b/base/files/file.h
@@ -22,8 +22,8 @@
namespace base {
-#if defined(OS_BSD) || defined(OS_MACOSX) || \
- defined(OS_ANDROID) && __ANDROID_API__ < 21
+#if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) || \
+ defined(OS_HAIKU) || defined(OS_ANDROID) && __ANDROID_API__ < 21
typedef struct stat stat_wrapper_t;
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
typedef struct stat64 stat_wrapper_t;
diff --git a/base/files/file_posix.cc b/base/files/file_posix.cc
index 90b80d0..2a73f7e 100644
--- a/base/files/file_posix.cc
+++ b/base/files/file_posix.cc
@@ -24,8 +24,8 @@
namespace {
-#if defined(OS_BSD) || defined(OS_MACOSX) || \
- defined(OS_ANDROID) && __ANDROID_API__ < 21
+#if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) || \
+ defined(OS_HAIKU) || defined(OS_ANDROID) && __ANDROID_API__ < 21
int CallFstat(int fd, stat_wrapper_t* sb) {
return fstat(fd, sb);
}
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc
index 3306004..87a38dd 100644
--- a/base/files/file_util_posix.cc
+++ b/base/files/file_util_posix.cc
@@ -57,8 +57,8 @@
namespace {
-#if defined(OS_BSD) || defined(OS_MACOSX) || \
- defined(OS_ANDROID) && __ANDROID_API__ < 21
+#if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL) || \
+ defined(OS_HAIKU) || defined(OS_ANDROID) && __ANDROID_API__ < 21
int CallStat(const char* path, stat_wrapper_t* sb) {
return stat(path, sb);
}
diff --git a/build/build_haiku.ninja.template b/build/build_haiku.ninja.template
new file mode 100644
index 0000000..e59854b
--- /dev/null
+++ b/build/build_haiku.ninja.template
@@ -0,0 +1,19 @@
+rule cc
+ command = $cc -MMD -MF $out.d $defines $includes $cflags $cflags_c -c $in -o $out
+ description = CC $out
+ depfile = $out.d
+ deps = gcc
+
+rule cxx
+ command = $cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc -c $in -o $out
+ description = CXX $out
+ depfile = $out.d
+ deps = gcc
+
+rule alink_thin
+ command = rm -f $out && $ar rcsT $out $in
+ description = AR $out
+
+rule link
+ command = $ld $ldflags -o $out -Wl,--start-group $in $libs -Wl,--end-group $solibs
+ description = LINK $out
diff --git a/build/gen.py b/build/gen.py
index 64e3f55..126b7d4 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -43,10 +43,12 @@
self._platform = 'freebsd'
elif self._platform.startswith('openbsd'):
self._platform = 'openbsd'
+ elif self._platform.startswith('haiku'):
+ self._platform = 'haiku'
@staticmethod
def known_platforms():
- return ['linux', 'darwin', 'msvc', 'aix', 'fuchsia', 'freebsd', 'openbsd']
+ return ['linux', 'darwin', 'msvc', 'aix', 'fuchsia', 'freebsd', 'openbsd', 'haiku']
def platform(self):
return self._platform
@@ -69,8 +71,11 @@
def is_aix(self):
return self._platform == 'aix'
+ def is_haiku(self):
+ return self._platform == 'haiku'
+
def is_posix(self):
- return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd']
+ return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd', 'haiku']
def main(argv):
@@ -179,6 +184,7 @@
'freebsd': 'build_linux.ninja.template',
'aix': 'build_aix.ninja.template',
'openbsd': 'build_openbsd.ninja.template',
+ 'haiku': 'build_haiku.ninja.template',
}[platform.platform()])
with open(template_filename) as f:
@@ -341,8 +347,11 @@
elif platform.is_aix():
cflags_cc.append('-maix64')
ldflags.append('-maix64')
+ elif platform.is_haiku():
+ cflags_cc.append('-fPIC')
+ cflags_cc.extend(['-D_BSD_SOURCE'])
- if platform.is_posix():
+ if platform.is_posix() and not platform.is_haiku():
ldflags.append('-pthread')
if options.use_lto:
diff --git a/tools/gn/args.cc b/tools/gn/args.cc
index e14adf6..4741ca4 100644
--- a/tools/gn/args.cc
+++ b/tools/gn/args.cc
@@ -314,6 +314,8 @@
os = "aix";
#elif defined(OS_OPENBSD)
os = "openbsd";
+#elif defined(OS_HAIKU)
+ os = "haiku";
#else
#error Unknown OS type.
#endif
@@ -334,7 +336,7 @@
// Set the host CPU architecture based on the underlying OS, not
// whatever the current bit-tedness of the GN binary is.
std::string os_arch = OperatingSystemArchitecture();
- if (os_arch == "x86")
+ if (os_arch == "x86" || os_arch == "BePC")
arch = kX86;
else if (os_arch == "x86_64")
arch = kX64;
diff --git a/tools/gn/exec_process.cc b/tools/gn/exec_process.cc
index e266d90..de7c945 100644
--- a/tools/gn/exec_process.cc
+++ b/tools/gn/exec_process.cc
@@ -22,7 +22,7 @@
#else
#include <errno.h>
#include <fcntl.h>
-#include <sys/signal.h>
+#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>
diff --git a/tools/gn/function_write_file_unittest.cc b/tools/gn/function_write_file_unittest.cc
index 4e317e1..a7fcd9b 100644
--- a/tools/gn/function_write_file_unittest.cc
+++ b/tools/gn/function_write_file_unittest.cc
@@ -13,7 +13,7 @@
#include "tools/gn/test_with_scope.h"
#include "util/test/test.h"
-#if defined(OS_LINUX) || defined(OS_MACOSX)
+#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_HAIKU)
#include <sys/time.h>
#endif
@@ -85,7 +85,7 @@
FILETIME last_modified_filetime = {};
ASSERT_TRUE(::SetFileTime(foo_file.GetPlatformFile(), nullptr,
&last_access_filetime, &last_modified_filetime));
-#elif defined(OS_AIX)
+#elif defined(OS_AIX) || defined(OS_HAIKU)
struct timeval times[2] = {};
ASSERT_EQ(utimes(foo_name.value().c_str(), times), 0);
#else
diff --git a/util/build_config.h b/util/build_config.h
index f98f044..f7cc991 100644
--- a/util/build_config.h
+++ b/util/build_config.h
@@ -51,7 +51,9 @@
#elif defined(_AIX)
#define OS_AIX 1
#elif defined(__asmjs__)
-#define OS_ASMJS
+#define OS_ASMJS 1
+#elif defined(__HAIKU__)
+#define OS_HAIKU 1
#else
#error Please add support for your platform in build_config.h
#endif
@@ -68,8 +70,8 @@
// more specific macro.
#if defined(OS_AIX) || defined(OS_ANDROID) || defined(OS_ASMJS) || \
defined(OS_FREEBSD) || defined(OS_LINUX) || defined(OS_MACOSX) || \
- defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_QNX) || \
- defined(OS_SOLARIS)
+ defined(OS_NACL) || defined(OS_NETBSD) || defined(OS_OPENBSD) || \
+ defined(OS_QNX) || defined(OS_SOLARIS) || defined(OS_HAIKU)
#define OS_POSIX 1
#endif
diff --git a/util/exe_path.cc b/util/exe_path.cc
index 4d487fa..3b66a7b 100644
--- a/util/exe_path.cc
+++ b/util/exe_path.cc
@@ -19,6 +19,9 @@
#include <limits.h>
#include <sys/sysctl.h>
#include <sys/types.h>
+#elif defined(OS_HAIKU)
+#include <OS.h>
+#include <image.h>
#endif
#if defined(OS_MACOSX)
@@ -64,6 +67,19 @@
return base::FilePath(buf);
}
+#elif defined(OS_HAIKU)
+
+base::FilePath GetExePath() {
+ image_info i_info;
+ int32 image_cookie = 0;
+ while (get_next_image_info(B_CURRENT_TEAM, &image_cookie, &i_info) == B_OK) {
+ if (i_info.type == B_APP_IMAGE) {
+ break;
+ }
+ }
+ return base::FilePath(std::string(i_info.name));
+}
+
#else
base::FilePath GetExePath() {