diff --git a/CMakeLists.txt b/CMakeLists.txt index f1103c5bf242..c4a250c4b1a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -248,6 +248,11 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64") endif(HAS_ALTIVEC) endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64") +if(CMAKE_SYSTEM_NAME MATCHES "AIX") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcmodel=large") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcmodel=large") +endif() + if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64|AARCH64") CHECK_C_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC) if(HAS_ARMV8_CRC) @@ -488,6 +493,8 @@ if(CMAKE_SYSTEM_NAME MATCHES "Cygwin") add_definitions(-fno-builtin-memcmp -DCYGWIN) elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") add_definitions(-DOS_MACOSX) +elseif(CMAKE_SYSTEM_NAME MATCHES "AIX") + add_definitions(-DOS_AIX) elseif(CMAKE_SYSTEM_NAME MATCHES "iOS") add_definitions(-DOS_MACOSX -DIOS_CROSS_COMPILE) elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") diff --git a/INSTALL.md b/INSTALL.md index 5bc5bd7b297e..eb122078d695 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -197,6 +197,16 @@ most processors made since roughly 2013. * Or install via [vcpkg](https://github.com/microsoft/vcpkg) * run `vcpkg install rocksdb:x64-windows` +* **AIX 7.2** + * Install IBM Open XL C/C++ for AIX and XL C/C++ + * Use CMake and run + ``` + cmake -G Ninja -B build -DCMAKE_BUILD_TYPE=Release -DPORTABLE=1 \ + -DCMAKE_C_COMPILER=ibm-clang \ + -DCMAKE_CXX_COMPILER=ibm-clang++_r + cmake --build build --target install + ``` + * **AIX 6.1** * Install AIX Toolbox rpms with gcc * Use these environment variables: diff --git a/env/fs_posix.cc b/env/fs_posix.cc index 82fb9fba337b..c2309a4fea1d 100644 --- a/env/fs_posix.cc +++ b/env/fs_posix.cc @@ -24,7 +24,7 @@ #include #include #include -#if defined(OS_LINUX) || defined(OS_SOLARIS) || defined(OS_ANDROID) +#if defined(OS_AIX) || defined(OS_LINUX) || defined(OS_SOLARIS) || defined(OS_ANDROID) #include #include #endif @@ -585,8 +585,15 @@ class PosixFileSystem : public FileSystem { while ((entry = readdir(d)) != nullptr) { // filter out '.' and '..' directory entries // which appear only on some platforms - const bool ignore = - entry->d_type == DT_DIR && +#if defined(OS_AIX) + struct stat entry_stat; + stat(entry->d_name, &entry_stat); + const bool is_dir = S_ISDIR(entry_stat.st_mode); +#else + const bool is_dir = entry->d_type == DT_DIR; +#endif + + const bool ignore = is_dir && (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0 #ifndef ASSERT_STATUS_CHECKED diff --git a/env/io_posix.cc b/env/io_posix.cc index 231e88daef39..a22d7d34d444 100644 --- a/env/io_posix.cc +++ b/env/io_posix.cc @@ -28,7 +28,7 @@ #include #include #include -#if defined(OS_LINUX) || defined(OS_ANDROID) +#if defined(OS_AIX) || defined(OS_LINUX) || defined(OS_ANDROID) #include #include #endif diff --git a/port/port_posix.h b/port/port_posix.h index 386be532cfd2..73fce73dcd70 100644 --- a/port/port_posix.h +++ b/port/port_posix.h @@ -41,6 +41,7 @@ #elif defined(OS_AIX) #include #include +#include #define PLATFORM_IS_LITTLE_ENDIAN (BYTE_ORDER == LITTLE_ENDIAN) #include #elif defined(OS_FREEBSD) || defined(OS_OPENBSD) || defined(OS_NETBSD) || \ diff --git a/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h b/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h index 451959aed4de..b5445646beb5 100644 --- a/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +++ b/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h @@ -58,7 +58,7 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include #include #include -#if defined(__powerpc__) +#if !defined(OS_AIX) && defined(__powerpc__) #include #endif @@ -131,6 +131,8 @@ static inline tokutime_t toku_time_now(void) { uint64_t result; __asm __volatile__("mrs %[rt], cntvct_el0" : [rt] "=r"(result)); return result; +#elif defined(OS_AIX) + return __builtin_ppc_get_timebase(); #elif defined(__powerpc__) return __ppc_get_timebase(); #elif defined(__s390x__)