port gn to aix
Change-Id: I3077efcd131c0f69377bb6dfa85f9a36852df3f1
Reviewed-on: https://gn-review.googlesource.com/2260
Reviewed-by: Brett Wilson <brettw@google.com>
Commit-Queue: Brett Wilson <brettw@google.com>
diff --git a/base/files/file_posix.cc b/base/files/file_posix.cc
index 977eb1b..4faf77b 100644
--- a/base/files/file_posix.cc
+++ b/base/files/file_posix.cc
@@ -100,6 +100,13 @@
int64_t last_accessed_nsec = stat_info.st_atimespec.tv_nsec;
time_t creation_time_sec = stat_info.st_ctimespec.tv_sec;
int64_t creation_time_nsec = stat_info.st_ctimespec.tv_nsec;
+#elif defined(OS_AIX)
+ time_t last_modified_sec = stat_info.st_mtime;
+ int64_t last_modified_nsec = 0;
+ time_t last_accessed_sec = stat_info.st_atime;
+ int64_t last_accessed_nsec = 0;
+ time_t creation_time_sec = stat_info.st_ctime;
+ int64_t creation_time_nsec = 0;
#else
#error
#endif
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc
index 9415735..23c7cb4 100644
--- a/base/files/file_util_posix.cc
+++ b/base/files/file_util_posix.cc
@@ -47,6 +47,12 @@
#include <grp.h>
#endif
+// We need to do this on AIX due to some inconsistencies in how AIX
+// handles XOPEN_SOURCE and ALL_SOURCE.
+#if defined(OS_AIX)
+extern "C" char* mkdtemp(char* path);
+#endif
+
namespace base {
namespace {
diff --git a/build/build_aix.ninja.template b/build/build_aix.ninja.template
new file mode 100644
index 0000000..f393e18
--- /dev/null
+++ b/build/build_aix.ninja.template
@@ -0,0 +1,16 @@
+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 $in $libs $solibs
+ description = LINK $out
diff --git a/build/gen.py b/build/gen.py
index 9007277..454d49d 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -24,7 +24,8 @@
is_win = sys.platform.startswith('win')
is_linux = sys.platform.startswith('linux')
is_mac = sys.platform.startswith('darwin')
-is_posix = is_linux or is_mac
+is_aix = sys.platform.startswith('aix')
+is_posix = is_linux or is_mac or is_aix
def main(argv):
@@ -159,7 +160,8 @@
template_filename = os.path.join(SCRIPT_DIR, {
'win32': 'build_win.ninja.template',
'darwin': 'build_mac.ninja.template',
- 'linux2': 'build_linux.ninja.template'
+ 'linux2': 'build_linux.ninja.template',
+ 'aix6': 'build_aix.ninja.template'
}[sys.platform])
with open(template_filename) as f:
@@ -243,6 +245,11 @@
cxx = os.environ.get('CXX', 'cl.exe')
ld = os.environ.get('LD', 'link.exe')
ar = os.environ.get('AR', 'lib.exe')
+ elif is_aix:
+ cc = os.environ.get('CC', 'gcc')
+ cxx = os.environ.get('CXX', 'g++')
+ ld = os.environ.get('LD', 'g++')
+ ar = os.environ.get('AR', 'ar -X64')
else:
cc = os.environ.get('CC', 'clang')
cxx = os.environ.get('CXX', 'clang++')
@@ -268,9 +275,20 @@
# unused functions and data items.
cflags.extend(['-fdata-sections', '-ffunction-sections'])
ldflags.extend(['-fdata-sections', '-ffunction-sections'])
- ldflags.append('-Wl,-dead_strip' if is_mac else '-Wl,--gc-sections')
+ if is_mac:
+ ldflags.append('-Wl,-dead_strip')
+ elif not is_aix:
+ # Garbage collection is done by default on aix.
+ ldflags.append('-Wl,--gc-sections')
+
# Omit all symbol information from the output file.
- ldflags.append('-Wl,-S' if is_mac else '-Wl,-strip-all')
+ if is_mac:
+ ldflags.append('-Wl,-S')
+ elif is_aix:
+ ldflags.append('-Wl,-s')
+ else:
+ ldflags.append('-Wl,-strip-all')
+
# Enable identical code-folding.
if options.use_icf:
ldflags.append('-Wl,--icf=all')
@@ -306,6 +324,9 @@
min_mac_version_flag = '-mmacosx-version-min=10.9'
cflags.append(min_mac_version_flag)
ldflags.append(min_mac_version_flag)
+ elif is_aix:
+ cflags_cc.append('-maix64')
+ ldflags.extend(['-maix64', '-pthread'])
if options.use_lto:
cflags.extend(['-flto', '-fwhole-program-vtables'])
@@ -594,7 +615,7 @@
'base/strings/string16.cc',
])
- if is_linux:
+ if is_linux or is_aix:
static_libraries['base']['sources'].extend([
'base/strings/sys_string_conversions_posix.cc',
])
diff --git a/tools/gn/args.cc b/tools/gn/args.cc
index 3003d9f..aa42ff3 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_AIX)
+ os = "aix";
#else
#error Unknown OS type.
#endif
diff --git a/tools/gn/function_write_file_unittest.cc b/tools/gn/function_write_file_unittest.cc
index 8b64a29..035faba 100644
--- a/tools/gn/function_write_file_unittest.cc
+++ b/tools/gn/function_write_file_unittest.cc
@@ -85,6 +85,9 @@
FILETIME last_modified_filetime = {};
ASSERT_TRUE(::SetFileTime(foo_file.GetPlatformFile(), nullptr,
&last_access_filetime, &last_modified_filetime));
+#elif defined(OS_AIX)
+ struct timeval times[2] = {};
+ ASSERT_EQ(utimes(foo_name.AsUTF8Unsafe().c_str(), times), 0);
#else
struct timeval times[2] = {};
ASSERT_EQ(futimes(foo_file.GetPlatformFile(), times), 0);
diff --git a/util/semaphore.cc b/util/semaphore.cc
index a1fa779..2ae7b7b 100644
--- a/util/semaphore.cc
+++ b/util/semaphore.cc
@@ -36,7 +36,7 @@
}
}
-#elif defined(OS_LINUX)
+#elif defined(OS_LINUX) || defined(OS_AIX)
Semaphore::Semaphore(int count) {
DCHECK_GE(count, 0);
diff --git a/util/semaphore.h b/util/semaphore.h
index 84d8b60..2de2759 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)
+#elif defined(OS_LINUX) || defined(OS_AIX)
#include <semaphore.h>
#else
#error Port.
@@ -35,7 +35,7 @@
#if defined(OS_MACOSX)
typedef semaphore_t NativeHandle;
-#elif defined(OS_LINUX)
+#elif defined(OS_LINUX) || defined(OS_AIX)
typedef sem_t NativeHandle;
#elif defined(OS_WIN)
typedef HANDLE NativeHandle;
diff --git a/util/ticks.cc b/util/ticks.cc
index df35375..2a90c90 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)
+#elif defined(OS_LINUX) || defined(OS_AIX)
#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)
+#elif defined(OS_LINUX) || defined(OS_AIX)
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)
+#elif defined(OS_LINUX) || defined(OS_AIX)
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)
+#elif defined(OS_LINUX) || defined(OS_AIX)
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
now = (static_cast<uint64_t>(ts.tv_sec) * kNano +