Port to FreeBSD.
This is mostly just moving code over to checking OS_POSIX where it's
using a POSIX interface. The only substantial FreeBSD-specific code
is the function for getting the path to the executable, which is
different on every platform.
Change-Id: I338d9bef9b0cbb7500f366352edb45e0cdb4d480
Reviewed-on: https://gn-review.googlesource.com/c/3920
Reviewed-by: Petr Hosek <phosek@google.com>
Commit-Queue: Petr Hosek <phosek@google.com>
diff --git a/base/files/file_posix.cc b/base/files/file_posix.cc
index 4faf77b..ed9a5e2 100644
--- a/base/files/file_posix.cc
+++ b/base/files/file_posix.cc
@@ -86,14 +86,7 @@
is_symbolic_link = S_ISLNK(stat_info.st_mode);
size = stat_info.st_size;
-#if defined(OS_LINUX)
- time_t last_modified_sec = stat_info.st_mtim.tv_sec;
- int64_t last_modified_nsec = stat_info.st_mtim.tv_nsec;
- time_t last_accessed_sec = stat_info.st_atim.tv_sec;
- int64_t last_accessed_nsec = stat_info.st_atim.tv_nsec;
- time_t creation_time_sec = stat_info.st_ctim.tv_sec;
- int64_t creation_time_nsec = stat_info.st_ctim.tv_nsec;
-#elif defined(OS_MACOSX)
+#if defined(OS_MACOSX)
time_t last_modified_sec = stat_info.st_mtimespec.tv_sec;
int64_t last_modified_nsec = stat_info.st_mtimespec.tv_nsec;
time_t last_accessed_sec = stat_info.st_atimespec.tv_sec;
@@ -107,6 +100,13 @@
int64_t last_accessed_nsec = 0;
time_t creation_time_sec = stat_info.st_ctime;
int64_t creation_time_nsec = 0;
+#elif defined(OS_POSIX)
+ time_t last_modified_sec = stat_info.st_mtim.tv_sec;
+ int64_t last_modified_nsec = stat_info.st_mtim.tv_nsec;
+ time_t last_accessed_sec = stat_info.st_atim.tv_sec;
+ int64_t last_accessed_nsec = stat_info.st_atim.tv_nsec;
+ time_t creation_time_sec = stat_info.st_ctim.tv_sec;
+ int64_t creation_time_nsec = stat_info.st_ctim.tv_nsec;
#else
#error
#endif
diff --git a/build/gen.py b/build/gen.py
index 77fe5b5..96dafb9 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -39,6 +39,8 @@
self._platform = 'aix'
elif self._platform.startswith('fuchsia'):
self._platform = 'fuchsia'
+ elif self._platform.startswith('freebsd'):
+ self._platform = 'freebsd'
@staticmethod
def known_platforms():
@@ -66,7 +68,7 @@
return self._platform == 'aix'
def is_posix(self):
- return self._platform in ['linux', 'darwin', 'aix']
+ return self._platform in ['linux', 'freebsd', 'darwin', 'aix']
def main(argv):
@@ -169,6 +171,7 @@
'msvc': 'build_win.ninja.template',
'darwin': 'build_mac.ninja.template',
'linux': 'build_linux.ninja.template',
+ 'freebsd': 'build_linux.ninja.template',
'aix': 'build_aix.ninja.template',
}[platform.platform()])
@@ -320,18 +323,18 @@
'-static-libstdc++',
'-Wl,--as-needed',
])
- libs.extend([
- # These are needed by libc++.
- '-ldl',
- '-lpthread',
- ])
+ # This is needed by libc++.
+ libs.append('-ldl')
elif platform.is_darwin():
min_mac_version_flag = '-mmacosx-version-min=10.9'
cflags.append(min_mac_version_flag)
ldflags.append(min_mac_version_flag)
elif platform.is_aix():
cflags_cc.append('-maix64')
- ldflags.extend(['-maix64', '-pthread'])
+ ldflags.append('-maix64')
+
+ if platform.is_posix():
+ ldflags.append('-pthread')
if options.use_lto:
cflags.extend(['-flto', '-fwhole-program-vtables'])
diff --git a/tools/gn/args.cc b/tools/gn/args.cc
index aa42ff3..5889c8f 100644
--- a/tools/gn/args.cc
+++ b/tools/gn/args.cc
@@ -294,6 +294,8 @@
os = "mac";
#elif defined(OS_LINUX)
os = "linux";
+#elif defined(OS_FREEBSD)
+ os = "freebsd";
#elif defined(OS_AIX)
os = "aix";
#else
diff --git a/tools/gn/exec_process.cc b/tools/gn/exec_process.cc
index 5c0619c..6c13558 100644
--- a/tools/gn/exec_process.cc
+++ b/tools/gn/exec_process.cc
@@ -21,6 +21,7 @@
#else
#include <errno.h>
#include <fcntl.h>
+#include <sys/signal.h>
#include <sys/wait.h>
#include <unistd.h>
diff --git a/util/exe_path.cc b/util/exe_path.cc
index f2adab5..2f80d5a 100644
--- a/util/exe_path.cc
+++ b/util/exe_path.cc
@@ -13,6 +13,9 @@
#include <mach-o/dyld.h>
#elif defined(OS_WIN)
#include <windows.h>
+#elif defined(OS_FREEBSD)
+#include <sys/sysctl.h>
+#include <sys/types.h>
#endif
#if defined(OS_MACOSX)
@@ -46,6 +49,18 @@
return base::FilePath(system_buffer);
}
+#elif defined(OS_FREEBSD)
+
+base::FilePath GetExePath() {
+ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
+ char buf[PATH_MAX];
+ size_t buf_size = PATH_MAX;
+ if (sysctl(mib, 4, buf, &buf_size, nullptr, 0) == -1) {
+ return base::FilePath();
+ }
+ return base::FilePath(buf);
+}
+
#else
base::FilePath GetExePath() {
diff --git a/util/semaphore.cc b/util/semaphore.cc
index 2ae7b7b..d5c82be 100644
--- a/util/semaphore.cc
+++ b/util/semaphore.cc
@@ -36,7 +36,7 @@
}
}
-#elif defined(OS_LINUX) || defined(OS_AIX)
+#elif defined(OS_POSIX)
Semaphore::Semaphore(int count) {
DCHECK_GE(count, 0);
diff --git a/util/semaphore.h b/util/semaphore.h
index 2de2759..92a1df6 100644
--- a/util/semaphore.h
+++ b/util/semaphore.h
@@ -15,7 +15,7 @@
#include <windows.h>
#elif defined(OS_MACOSX)
#include <mach/mach.h>
-#elif defined(OS_LINUX) || defined(OS_AIX)
+#elif defined(OS_POSIX)
#include <semaphore.h>
#else
#error Port.
@@ -35,7 +35,7 @@
#if defined(OS_MACOSX)
typedef semaphore_t NativeHandle;
-#elif defined(OS_LINUX) || defined(OS_AIX)
+#elif defined(OS_POSIX)
typedef sem_t NativeHandle;
#elif defined(OS_WIN)
typedef HANDLE NativeHandle;
diff --git a/util/ticks.cc b/util/ticks.cc
index 2a90c90..f26b5d8 100644
--- a/util/ticks.cc
+++ b/util/ticks.cc
@@ -11,7 +11,7 @@
#include <windows.h>
#elif defined(OS_MACOSX)
#include <mach/mach_time.h>
-#elif defined(OS_LINUX) || defined(OS_AIX)
+#elif defined(OS_POSIX)
#include <time.h>
#else
#error Port.
@@ -27,7 +27,7 @@
#elif defined(OS_MACOSX)
mach_timebase_info_data_t g_timebase;
uint64_t g_start;
-#elif defined(OS_LINUX) || defined(OS_AIX)
+#elif defined(OS_POSIX)
uint64_t g_start;
#else
#error Port.
@@ -44,7 +44,7 @@
#elif defined(OS_MACOSX)
mach_timebase_info(&g_timebase);
g_start = (mach_absolute_time() * g_timebase.numer) / g_timebase.denom;
-#elif defined(OS_LINUX) || defined(OS_AIX)
+#elif defined(OS_POSIX)
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
g_start = static_cast<uint64_t>(ts.tv_sec) * kNano +
@@ -74,7 +74,7 @@
#elif defined(OS_MACOSX)
now =
((mach_absolute_time() * g_timebase.numer) / g_timebase.denom) - g_start;
-#elif defined(OS_LINUX) || defined(OS_AIX)
+#elif defined(OS_POSIX)
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
now = (static_cast<uint64_t>(ts.tv_sec) * kNano +