3 # Detects OS we're compiling on and outputs a file specified by the first
4 # argument, which in turn gets read while processing Makefile.
6 # The output will set the following variables:
8 # CXX C++ Compiler path
9 # PLATFORM_LDFLAGS Linker flags
10 # JAVA_LDFLAGS Linker flags for RocksDBJava
11 # JAVA_STATIC_LDFLAGS Linker flags for RocksDBJava static build
12 # JAVAC_ARGS Arguments for javac
13 # PLATFORM_SHARED_EXT Extension for shared libraries
14 # PLATFORM_SHARED_LDFLAGS Flags for building shared library
15 # PLATFORM_SHARED_CFLAGS Flags for compiling objects for shared library
16 # PLATFORM_CCFLAGS C compiler flags
17 # PLATFORM_CXXFLAGS C++ compiler flags. Will contain:
18 # PLATFORM_SHARED_VERSIONED Set to 'true' if platform supports versioned
19 # shared libraries, empty otherwise.
20 # FIND Command for the find utility
21 # WATCH Command for the watch utility
23 # The PLATFORM_CCFLAGS and PLATFORM_CXXFLAGS might include the following:
25 # -DROCKSDB_PLATFORM_POSIX if posix-platform based
26 # -DSNAPPY if the Snappy library is present
27 # -DLZ4 if the LZ4 library is present
28 # -DZSTD if the ZSTD library is present
29 # -DNUMA if the NUMA library is present
30 # -DTBB if the TBB library is present
31 # -DMEMKIND if the memkind library is present
33 # Using gflags in rocksdb:
34 # Our project depends on gflags, which requires users to take some extra steps
35 # before they can compile the whole repository:
36 # 1. Install gflags. You may download it from here:
37 # https://gflags.github.io/gflags/ (Mac users can `brew install gflags`)
38 # 2. Once installed, add the include path for gflags to your CPATH env var and
39 # the lib path to LIBRARY_PATH. If installed with default settings, the lib
40 # will be /usr/local/lib and the include path will be /usr/local/include
43 if test -z "$OUTPUT"; then
44 echo "usage: $0 <output-filename>" >&2
48 # we depend on C++17, but should be compatible with newer standards
49 if [ "$ROCKSDB_CXX_STANDARD" ]; then
50 PLATFORM_CXXFLAGS
="-std=$ROCKSDB_CXX_STANDARD"
52 PLATFORM_CXXFLAGS
="-std=c++17"
55 # we currently depend on POSIX platform
56 COMMON_FLAGS
="-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX"
58 # Default to fbcode gcc on internal fb machines
59 if [ -z "$ROCKSDB_NO_FBCODE" -a -d /mnt
/gvfs
/third-party
]; then
61 # If we're compiling with TSAN or shared lib, we need pic build
62 PIC_BUILD
=$COMPILE_WITH_TSAN
63 if [ "$LIB_MODE" == "shared" ]; then
66 if [ -n "$ROCKSDB_FBCODE_BUILD_WITH_PLATFORM010" ]; then
67 source "$PWD/build_tools/fbcode_config_platform010.sh"
68 elif [ -n "$ROCKSDB_FBCODE_BUILD_WITH_PLATFORM009" ]; then
69 source "$PWD/build_tools/fbcode_config_platform009.sh"
71 source "$PWD/build_tools/fbcode_config_platform009.sh"
75 # Delete existing output, if it exists
79 if test -z "$CC"; then
80 if [ -x "$(command -v cc)" ]; then
82 elif [ -x "$(command -v clang)" ]; then
89 if test -z "$CXX"; then
90 if [ -x "$(command -v g++)" ]; then
92 elif [ -x "$(command -v clang++)" ]; then
99 if test -z "$AR"; then
100 if [ -x "$(command -v gcc-ar)" ]; then
102 elif [ -x "$(command -v llvm-ar)" ]; then
110 if test -z "$TARGET_OS"; then
114 if test -z "$TARGET_ARCHITECTURE"; then
115 TARGET_ARCHITECTURE
=`uname -m`
118 if test -z "$CLANG_SCAN_BUILD"; then
119 CLANG_SCAN_BUILD
=scan-build
122 if test -z "$CLANG_ANALYZER"; then
123 CLANG_ANALYZER
=$
(command -v clang
++ 2> /dev
/null
)
126 if test -z "$FIND"; then
130 if test -z "$WATCH"; then
134 COMMON_FLAGS
="$COMMON_FLAGS ${CFLAGS}"
137 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS"
138 PLATFORM_SHARED_EXT
="so"
139 PLATFORM_SHARED_LDFLAGS
="-Wl,--no-as-needed -shared -Wl,-soname -Wl,"
140 PLATFORM_SHARED_CFLAGS
="-fPIC"
141 PLATFORM_SHARED_VERSIONED
=true
143 # generic port files (working on all platform by #ifdef) go directly in /port
144 GENERIC_PORT_FILES
=`cd "$ROCKSDB_ROOT"; find port -name '*.cc' | tr "\n" " "`
146 # On GCC, we pick libc's memcmp over GCC's memcmp via -fno-builtin-memcmp
150 COMMON_FLAGS
="$COMMON_FLAGS -DOS_MACOSX"
151 PLATFORM_SHARED_EXT
=dylib
152 PLATFORM_SHARED_LDFLAGS
="-dynamiclib -install_name "
153 # PORT_FILES=port/darwin/darwin_specific.cc
157 COMMON_FLAGS
="$COMMON_FLAGS -DOS_MACOSX -DIOS_CROSS_COMPILE -DROCKSDB_LITE"
158 PLATFORM_SHARED_EXT
=dylib
159 PLATFORM_SHARED_LDFLAGS
="-dynamiclib -install_name "
161 PLATFORM_SHARED_VERSIONED
=
165 COMMON_FLAGS
="$COMMON_FLAGS -DOS_LINUX"
166 if [ -z "$USE_CLANG" ]; then
167 COMMON_FLAGS
="$COMMON_FLAGS -fno-builtin-memcmp"
169 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -latomic"
171 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lpthread -lrt -ldl"
172 if test -z "$ROCKSDB_USE_IO_URING"; then
173 ROCKSDB_USE_IO_URING
=1
175 if test "$ROCKSDB_USE_IO_URING" -ne 0; then
177 $CXX $PLATFORM_CXXFLAGS -x c
++ - -luring -o test.o
2>/dev
/null
<<EOF
178 #include <liburing.h>
180 struct io_uring ring;
181 io_uring_queue_init(1, &ring, 0);
185 if [ "$?" = 0 ]; then
186 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -luring"
187 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_IOURING_PRESENT"
190 # PORT_FILES=port/linux/linux_specific.cc
194 COMMON_FLAGS
="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_SOLARIS -m64"
195 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lpthread -lrt -static-libstdc++ -static-libgcc -m64"
196 # PORT_FILES=port/sunos/sunos_specific.cc
201 COMMON_FLAGS
="$COMMON_FLAGS -maix64 -pthread -fno-builtin-memcmp -D_REENTRANT -DOS_AIX -D__STDC_FORMAT_MACROS"
202 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -pthread -lpthread -lrt -maix64 -static-libstdc++ -static-libgcc"
203 # PORT_FILES=port/aix/aix_specific.cc
208 COMMON_FLAGS
="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_FREEBSD"
209 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lpthread"
210 # PORT_FILES=port/freebsd/freebsd_specific.cc
213 PLATFORM
=OS_GNU_KFREEBSD
214 COMMON_FLAGS
="$COMMON_FLAGS -DOS_GNU_KFREEBSD"
215 if [ -z "$USE_CLANG" ]; then
216 COMMON_FLAGS
="$COMMON_FLAGS -fno-builtin-memcmp"
218 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -latomic"
220 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lpthread -lrt"
221 # PORT_FILES=port/gnu_kfreebsd/gnu_kfreebsd_specific.cc
225 COMMON_FLAGS
="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_NETBSD"
226 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lpthread -lgcc_s"
227 # PORT_FILES=port/netbsd/netbsd_specific.cc
232 COMMON_FLAGS
="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_OPENBSD"
233 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -pthread"
234 # PORT_FILES=port/openbsd/openbsd_specific.cc
239 PLATFORM
=OS_DRAGONFLYBSD
240 COMMON_FLAGS
="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_DRAGONFLYBSD"
241 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lpthread"
242 # PORT_FILES=port/dragonfly/dragonfly_specific.cc
246 PLATFORM_SHARED_CFLAGS
=""
247 PLATFORM_CXXFLAGS
="-std=gnu++11"
248 COMMON_FLAGS
="$COMMON_FLAGS -DCYGWIN"
249 if [ -z "$USE_CLANG" ]; then
250 COMMON_FLAGS
="$COMMON_FLAGS -fno-builtin-memcmp"
252 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -latomic"
254 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lpthread -lrt"
255 # PORT_FILES=port/linux/linux_specific.cc
257 OS_ANDROID_CROSSCOMPILE
)
259 COMMON_FLAGS
="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_ANDROID -DROCKSDB_PLATFORM_POSIX"
260 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS " # All pthread features are in the Android C library
261 # PORT_FILES=port/android/android.cc
265 echo "Unknown platform!" >&2
269 PLATFORM_CXXFLAGS
="$PLATFORM_CXXFLAGS ${CXXFLAGS}"
270 JAVA_LDFLAGS
="$PLATFORM_LDFLAGS"
271 JAVA_STATIC_LDFLAGS
="$PLATFORM_LDFLAGS"
272 JAVAC_ARGS
="-source 8"
274 if [ "$CROSS_COMPILE" = "true" -o "$FBCODE_BUILD" = "true" ]; then
275 # Cross-compiling; do not try any compilation tests.
276 # Also don't need any compilation tests if compiling on fbcode
277 if [ "$FBCODE_BUILD" = "true" ]; then
278 # Enable backtrace on fbcode since the necessary libraries are present
279 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_BACKTRACE"
280 FOLLY_DIR
="third-party/folly"
284 if ! test $ROCKSDB_DISABLE_FALLOCATE; then
285 # Test whether fallocate is available
286 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
288 #include <linux/falloc.h>
290 int fd = open("/dev/null", 0);
291 fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024);
294 if [ "$?" = 0 ]; then
295 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_FALLOCATE_PRESENT"
299 if ! test $ROCKSDB_DISABLE_SNAPPY; then
300 # Test whether Snappy library is installed
301 # http://code.google.com/p/snappy/
302 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
306 if [ "$?" = 0 ]; then
307 COMMON_FLAGS
="$COMMON_FLAGS -DSNAPPY"
308 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lsnappy"
309 JAVA_LDFLAGS
="$JAVA_LDFLAGS -lsnappy"
313 if ! test $ROCKSDB_DISABLE_GFLAGS; then
314 # Test whether gflags library is installed
315 # http://gflags.github.io/gflags/
316 # check if the namespace is gflags
317 if $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<< EOF
318 #include <gflags/gflags.h>
319 using namespace GFLAGS_NAMESPACE;
323 COMMON_FLAGS
="$COMMON_FLAGS -DGFLAGS=1"
324 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lgflags"
325 # check if namespace is gflags
326 elif $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<< EOF
327 #include <gflags/gflags.h>
328 using namespace gflags;
332 COMMON_FLAGS
="$COMMON_FLAGS -DGFLAGS=1 -DGFLAGS_NAMESPACE=gflags"
333 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lgflags"
334 # check if namespace is google
335 elif $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<< EOF
336 #include <gflags/gflags.h>
337 using namespace google;
341 COMMON_FLAGS
="$COMMON_FLAGS -DGFLAGS=1 -DGFLAGS_NAMESPACE=google"
342 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lgflags"
346 if ! test $ROCKSDB_DISABLE_ZLIB; then
347 # Test whether zlib library is installed
348 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
352 if [ "$?" = 0 ]; then
353 COMMON_FLAGS
="$COMMON_FLAGS -DZLIB"
354 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lz"
355 JAVA_LDFLAGS
="$JAVA_LDFLAGS -lz"
359 if ! test $ROCKSDB_DISABLE_BZIP; then
360 # Test whether bzip library is installed
361 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
365 if [ "$?" = 0 ]; then
366 COMMON_FLAGS
="$COMMON_FLAGS -DBZIP2"
367 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lbz2"
368 JAVA_LDFLAGS
="$JAVA_LDFLAGS -lbz2"
372 if ! test $ROCKSDB_DISABLE_LZ4; then
373 # Test whether lz4 library is installed
374 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
379 if [ "$?" = 0 ]; then
380 COMMON_FLAGS
="$COMMON_FLAGS -DLZ4"
381 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -llz4"
382 JAVA_LDFLAGS
="$JAVA_LDFLAGS -llz4"
386 if ! test $ROCKSDB_DISABLE_ZSTD; then
387 # Test whether zstd library is installed
388 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS -x c
++ - -o /dev
/null
2>/dev
/null
<<EOF
392 if [ "$?" = 0 ]; then
393 COMMON_FLAGS
="$COMMON_FLAGS -DZSTD"
394 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lzstd"
395 JAVA_LDFLAGS
="$JAVA_LDFLAGS -lzstd"
399 if ! test $ROCKSDB_DISABLE_NUMA; then
400 # Test whether numa is available
401 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
-lnuma 2>/dev
/null
<<EOF
406 if [ "$?" = 0 ]; then
407 COMMON_FLAGS
="$COMMON_FLAGS -DNUMA"
408 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lnuma"
409 JAVA_LDFLAGS
="$JAVA_LDFLAGS -lnuma"
413 if ! test $ROCKSDB_DISABLE_TBB; then
414 # Test whether tbb is available
415 $CXX $PLATFORM_CXXFLAGS $LDFLAGS -x c
++ - -o test.o
-ltbb 2>/dev
/null
<<EOF
419 if [ "$?" = 0 ]; then
420 COMMON_FLAGS
="$COMMON_FLAGS -DTBB"
421 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -ltbb"
422 JAVA_LDFLAGS
="$JAVA_LDFLAGS -ltbb"
426 if ! test $ROCKSDB_DISABLE_JEMALLOC; then
427 # Test whether jemalloc is available
428 if echo 'int main() {}' |
$CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
-ljemalloc \
430 # This will enable some preprocessor identifiers in the Makefile
432 # JEMALLOC can be enabled either using the flag (like here) or by
433 # providing direct link to the jemalloc library
435 # check for JEMALLOC installed with HomeBrew
436 if [ "$PLATFORM" == "OS_MACOSX" ]; then
437 if hash brew
2>/dev
/null
&& brew
ls --versions jemalloc
> /dev
/null
; then
438 JEMALLOC_VER
=$
(brew
ls --versions jemalloc |
tail -n 1 | cut
-f 2 -d ' ')
439 JEMALLOC_INCLUDE
="-I/usr/local/Cellar/jemalloc/${JEMALLOC_VER}/include"
440 JEMALLOC_LIB
="/usr/local/Cellar/jemalloc/${JEMALLOC_VER}/lib/libjemalloc_pic.a"
441 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS $JEMALLOC_LIB"
442 JAVA_STATIC_LDFLAGS
="$JAVA_STATIC_LDFLAGS $JEMALLOC_LIB"
447 if ! test $JEMALLOC && ! test $ROCKSDB_DISABLE_TCMALLOC; then
448 # jemalloc is not available. Let's try tcmalloc
449 if echo 'int main() {}' |
$CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o \
450 -ltcmalloc 2>/dev
/null
; then
451 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -ltcmalloc"
452 JAVA_LDFLAGS
="$JAVA_LDFLAGS -ltcmalloc"
456 if ! test $ROCKSDB_DISABLE_MALLOC_USABLE_SIZE; then
457 # Test whether malloc_usable_size is available
458 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
461 size_t res = malloc_usable_size(0);
466 if [ "$?" = 0 ]; then
467 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_MALLOC_USABLE_SIZE"
471 if ! test $ROCKSDB_DISABLE_MEMKIND; then
472 # Test whether memkind library is installed
473 $CXX $PLATFORM_CXXFLAGS $LDFLAGS -x c
++ - -o test.o
-lmemkind 2>/dev
/null
<<EOF
476 memkind_malloc(MEMKIND_DAX_KMEM, 1024);
480 if [ "$?" = 0 ]; then
481 COMMON_FLAGS
="$COMMON_FLAGS -DMEMKIND"
482 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lmemkind"
483 JAVA_LDFLAGS
="$JAVA_LDFLAGS -lmemkind"
487 if ! test $ROCKSDB_DISABLE_PTHREAD_MUTEX_ADAPTIVE_NP; then
488 # Test whether PTHREAD_MUTEX_ADAPTIVE_NP mutex type is available
489 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
492 int x = PTHREAD_MUTEX_ADAPTIVE_NP;
497 if [ "$?" = 0 ]; then
498 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
502 if ! test $ROCKSDB_DISABLE_BACKTRACE; then
503 # Test whether backtrace is available
504 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
505 #include <execinfo.h>
508 backtrace_symbols(frames, backtrace(frames, 1));
512 if [ "$?" = 0 ]; then
513 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_BACKTRACE"
515 # Test whether execinfo library is installed
516 $CXX $PLATFORM_CXXFLAGS -lexecinfo -x c
++ - -o test.o
2>/dev
/null
<<EOF
517 #include <execinfo.h>
520 backtrace_symbols(frames, backtrace(frames, 1));
523 if [ "$?" = 0 ]; then
524 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_BACKTRACE"
525 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lexecinfo"
526 JAVA_LDFLAGS
="$JAVA_LDFLAGS -lexecinfo"
531 if ! test $ROCKSDB_DISABLE_PG; then
532 # Test if -pg is supported
533 $CXX $PLATFORM_CXXFLAGS -pg -x c
++ - -o test.o
2>/dev
/null
<<EOF
538 if [ "$?" = 0 ]; then
543 if ! test $ROCKSDB_DISABLE_SYNC_FILE_RANGE; then
544 # Test whether sync_file_range is supported for compatibility with an old glibc
545 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
548 int fd = open("/dev/null", 0);
549 sync_file_range(fd, 0, 1024, SYNC_FILE_RANGE_WRITE);
552 if [ "$?" = 0 ]; then
553 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_RANGESYNC_PRESENT"
557 if ! test $ROCKSDB_DISABLE_SCHED_GETCPU; then
558 # Test whether sched_getcpu is supported
559 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
562 int cpuid = sched_getcpu();
566 if [ "$?" = 0 ]; then
567 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_SCHED_GETCPU_PRESENT"
571 if ! test $ROCKSDB_DISABLE_AUXV_GETAUXVAL; then
572 # Test whether getauxval is supported
573 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
574 #include <sys/auxv.h>
576 uint64_t auxv = getauxval(AT_HWCAP);
580 if [ "$?" = 0 ]; then
581 COMMON_FLAGS
="$COMMON_FLAGS -DROCKSDB_AUXV_GETAUXVAL_PRESENT"
585 if ! test $ROCKSDB_DISABLE_ALIGNED_NEW; then
586 # Test whether c++17 aligned-new is supported
587 $CXX $PLATFORM_CXXFLAGS -faligned-new -x c
++ - -o test.o
2>/dev
/null
<<EOF
588 struct alignas(1024) t {int a;};
591 if [ "$?" = 0 ]; then
592 PLATFORM_CXXFLAGS
="$PLATFORM_CXXFLAGS -faligned-new -DHAVE_ALIGNED_NEW"
595 if ! test $ROCKSDB_DISABLE_BENCHMARK; then
596 # Test whether google benchmark is available
597 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o /dev
/null
-lbenchmark -lpthread 2>/dev
/null
<<EOF
598 #include <benchmark/benchmark.h>
601 if [ "$?" = 0 ]; then
602 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -lbenchmark"
605 if test $USE_FOLLY; then
606 # Test whether libfolly library is installed
607 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS -x c
++ - -o /dev
/null
2>/dev
/null
<<EOF
608 #include <folly/synchronization/DistributedMutex.h>
611 if [ "$?" != 0 ]; then
612 FOLLY_DIR
="./third-party/folly"
618 # TODO(tec): Fix -Wshorten-64-to-32 errors on FreeBSD and enable the warning.
619 # -Wshorten-64-to-32 breaks compilation on FreeBSD aarch64 and i386
620 if ! { [ "$TARGET_OS" = FreeBSD
] && [ "$TARGET_ARCHITECTURE" = arm64
-o "$TARGET_ARCHITECTURE" = i386
]; }; then
621 # Test whether -Wshorten-64-to-32 is available
622 $CXX $PLATFORM_CXXFLAGS -x c
++ - -o test.o
-Wshorten-64-to-32 2>/dev
/null
<<EOF
625 if [ "$?" = 0 ]; then
626 COMMON_FLAGS
="$COMMON_FLAGS -Wshorten-64-to-32"
630 if test "0$PORTABLE" -eq 0; then
631 if test -n "`echo $TARGET_ARCHITECTURE | grep ^ppc64`"; then
632 # Tune for this POWER processor, treating '+' models as base models
633 POWER
=`LD_SHOW_AUXV=1 /bin/true | grep AT_PLATFORM | grep -E -o power[0-9]+`
634 COMMON_FLAGS
="$COMMON_FLAGS -mcpu=$POWER -mtune=$POWER "
635 elif test -n "`echo $TARGET_ARCHITECTURE | grep -e^arm -e^aarch64`"; then
636 # TODO: Handle this with approprite options.
637 COMMON_FLAGS
="$COMMON_FLAGS"
638 elif test -n "`echo $TARGET_ARCHITECTURE | grep ^aarch64`"; then
639 COMMON_FLAGS
="$COMMON_FLAGS"
640 elif test -n "`echo $TARGET_ARCHITECTURE | grep ^s390x`"; then
641 if echo 'int main() {}' |
$CXX $PLATFORM_CXXFLAGS -x c
++ \
642 -march=native
- -o /dev
/null
2>/dev
/null
; then
643 COMMON_FLAGS
="$COMMON_FLAGS -march=native "
645 COMMON_FLAGS
="$COMMON_FLAGS -march=z196 "
647 COMMON_FLAGS
="$COMMON_FLAGS"
648 elif test -n "`echo $TARGET_ARCHITECTURE | grep ^riscv64`"; then
649 RISC_ISA
=$
(cat /proc
/cpuinfo |
grep isa |
head -1 | cut
--delimiter=: -f 2 | cut
-b 2-)
650 COMMON_FLAGS
="$COMMON_FLAGS -march=${RISC_ISA}"
651 elif [ "$TARGET_OS" == "IOS" ]; then
652 COMMON_FLAGS
="$COMMON_FLAGS"
653 elif [ "$TARGET_OS" == "AIX" ] ||
[ "$TARGET_OS" == "SunOS" ]; then
654 # TODO: Not sure why we don't use -march=native on these OSes
655 if test "$USE_SSE"; then
659 COMMON_FLAGS
="$COMMON_FLAGS -march=native "
663 if test "$USE_SSE"; then
667 if test -n "`echo $TARGET_ARCHITECTURE | grep ^s390x`"; then
668 COMMON_FLAGS
="$COMMON_FLAGS -march=z196 "
671 if test -n "`echo $TARGET_ARCHITECTURE | grep ^riscv64`"; then
672 RISC_ISA
=$
(cat /proc
/cpuinfo |
grep isa |
head -1 | cut
--delimiter=: -f 2 | cut
-b 2-)
673 COMMON_FLAGS
="$COMMON_FLAGS -march=${RISC_ISA}"
676 if [[ "${PLATFORM}" == "OS_MACOSX" ]]; then
677 # For portability compile for macOS 10.13 (2017) or newer
678 COMMON_FLAGS
="$COMMON_FLAGS -mmacosx-version-min=10.13"
679 PLATFORM_LDFLAGS
="$PLATFORM_LDFLAGS -mmacosx-version-min=10.13"
680 # -mmacosx-version-min must come first here.
681 PLATFORM_SHARED_LDFLAGS
="-mmacosx-version-min=10.13 $PLATFORM_SHARED_LDFLAGS"
682 PLATFORM_CMAKE_FLAGS
="-DCMAKE_OSX_DEPLOYMENT_TARGET=10.13"
683 JAVA_STATIC_DEPS_COMMON_FLAGS
="-mmacosx-version-min=10.13"
684 JAVA_STATIC_DEPS_LDFLAGS
="$JAVA_STATIC_DEPS_COMMON_FLAGS"
685 JAVA_STATIC_DEPS_CCFLAGS
="$JAVA_STATIC_DEPS_COMMON_FLAGS"
686 JAVA_STATIC_DEPS_CXXFLAGS
="$JAVA_STATIC_DEPS_COMMON_FLAGS"
690 if test -n "`echo $TARGET_ARCHITECTURE | grep ^ppc64`"; then
691 # check for GNU libc on ppc64
692 $CXX -x c
++ - -o /dev
/null
2>/dev
/null
<<EOF
695 #include <gnu/libc-version.h>
697 int main(int argc, char *argv[]) {
698 printf("GNU libc version: %s\n", gnu_get_libc_version());
702 if [ "$?" != 0 ]; then
707 if test "$TRY_SSE_ETC"; then
708 # The USE_SSE flag now means "attempt to compile with widely-available
709 # Intel architecture extensions utilized by specific optimizations in the
710 # source code." It's a qualifier on PORTABLE=1 that means "mostly portable."
711 # It doesn't even really check that your current CPU is compatible.
713 # SSE4.2 available since nehalem, ca. 2008-2010
714 # Includes POPCNT for BitsSetToOne, BitParity
716 # PCLMUL available since westmere, ca. 2010-2011
717 TRY_PCLMUL
="-mpclmul"
718 # AVX2 available since haswell, ca. 2013-2015
720 # BMI available since haswell, ca. 2013-2015
721 # Primarily for TZCNT for CountTrailingZeroBits
723 # LZCNT available since haswell, ca. 2013-2015
728 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS $TRY_SSE42 -x c
++ - -o test.o
2>/dev
/null
<<EOF
730 #include <nmmintrin.h>
732 volatile uint32_t x = _mm_crc32_u32(0, 0);
736 if [ "$?" = 0 ]; then
737 COMMON_FLAGS
="$COMMON_FLAGS $TRY_SSE42 -DHAVE_SSE42"
738 elif test "$USE_SSE"; then
739 echo "warning: USE_SSE specified but compiler could not use SSE intrinsics, disabling" >&2
742 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS $TRY_PCLMUL -x c
++ - -o test.o
2>/dev
/null
<<EOF
744 #include <wmmintrin.h>
746 const auto a = _mm_set_epi64x(0, 0);
747 const auto b = _mm_set_epi64x(0, 0);
748 const auto c = _mm_clmulepi64_si128(a, b, 0x00);
749 auto d = _mm_cvtsi128_si64(c);
753 if [ "$?" = 0 ]; then
754 COMMON_FLAGS
="$COMMON_FLAGS $TRY_PCLMUL -DHAVE_PCLMUL"
755 elif test "$USE_SSE"; then
756 echo "warning: USE_SSE specified but compiler could not use PCLMUL intrinsics, disabling" >&2
759 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS $TRY_AVX2 -x c
++ - -o test.o
2>/dev
/null
<<EOF
761 #include <immintrin.h>
763 const auto a = _mm256_setr_epi32(0, 1, 2, 3, 4, 7, 6, 5);
764 const auto b = _mm256_permutevar8x32_epi32(a, a);
768 if [ "$?" = 0 ]; then
769 COMMON_FLAGS
="$COMMON_FLAGS $TRY_AVX2 -DHAVE_AVX2"
770 elif test "$USE_SSE"; then
771 echo "warning: USE_SSE specified but compiler could not use AVX2 intrinsics, disabling" >&2
774 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS $TRY_BMI -x c
++ - -o test.o
2>/dev
/null
<<EOF
776 #include <immintrin.h>
777 int main(int argc, char *argv[]) {
779 return (int)_tzcnt_u64((uint64_t)argc);
782 if [ "$?" = 0 ]; then
783 COMMON_FLAGS
="$COMMON_FLAGS $TRY_BMI -DHAVE_BMI"
784 elif test "$USE_SSE"; then
785 echo "warning: USE_SSE specified but compiler could not use BMI intrinsics, disabling" >&2
788 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS $TRY_LZCNT -x c
++ - -o test.o
2>/dev
/null
<<EOF
790 #include <immintrin.h>
791 int main(int argc, char *argv[]) {
793 return (int)_lzcnt_u64((uint64_t)argc);
796 if [ "$?" = 0 ]; then
797 COMMON_FLAGS
="$COMMON_FLAGS $TRY_LZCNT -DHAVE_LZCNT"
798 elif test "$USE_SSE"; then
799 echo "warning: USE_SSE specified but compiler could not use LZCNT intrinsics, disabling" >&2
802 $CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
805 uint64_t a = 0xffffFFFFffffFFFF;
806 __uint128_t b = __uint128_t(a) * a;
807 a = static_cast<uint64_t>(b >> 64);
811 if [ "$?" = 0 ]; then
812 COMMON_FLAGS
="$COMMON_FLAGS -DHAVE_UINT128_EXTENSION"
815 if [ "$FBCODE_BUILD" != "true" -a "$PLATFORM" = OS_LINUX
]; then
816 $CXX $COMMON_FLAGS $PLATFORM_SHARED_CFLAGS -x c
++ -c - -o test_dl.o
2>/dev
/null
<<EOF
819 if [ "$?" = 0 ]; then
820 $CXX $COMMON_FLAGS $PLATFORM_SHARED_LDFLAGS test_dl.o
-o test.o
2>/dev
/null
821 if [ "$?" = 0 ]; then
828 # check for F_FULLFSYNC
829 $CXX $PLATFORM_CXXFALGS -x c
++ - -o test.o
2>/dev
/null
<<EOF
832 fcntl(0, F_FULLFSYNC);
836 if [ "$?" = 0 ]; then
837 COMMON_FLAGS
="$COMMON_FLAGS -DHAVE_FULLFSYNC"
840 rm -f test.o test_dl.o
842 # Get the path for the folly installation dir
843 if [ "$USE_FOLLY" ]; then
844 if [ "$FOLLY_DIR" ]; then
845 FOLLY_PATH
=`cd $FOLLY_DIR && $PYTHON build/fbcode_builder/getdeps.py show-inst-dir folly`
849 PLATFORM_CCFLAGS
="$PLATFORM_CCFLAGS $COMMON_FLAGS"
850 PLATFORM_CXXFLAGS
="$PLATFORM_CXXFLAGS $COMMON_FLAGS"
852 VALGRIND_VER
="$VALGRIND_VER"
854 ROCKSDB_MAJOR
=`build_tools/version.sh major`
855 ROCKSDB_MINOR
=`build_tools/version.sh minor`
856 ROCKSDB_PATCH
=`build_tools/version.sh patch`
858 echo "CC=$CC" >> "$OUTPUT"
859 echo "CXX=$CXX" >> "$OUTPUT"
860 echo "AR=$AR" >> "$OUTPUT"
861 echo "PLATFORM=$PLATFORM" >> "$OUTPUT"
862 echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> "$OUTPUT"
863 echo "PLATFORM_CMAKE_FLAGS=$PLATFORM_CMAKE_FLAGS" >> "$OUTPUT"
864 echo "JAVA_LDFLAGS=$JAVA_LDFLAGS" >> "$OUTPUT"
865 echo "JAVA_STATIC_LDFLAGS=$JAVA_STATIC_LDFLAGS" >> "$OUTPUT"
866 echo "JAVA_STATIC_DEPS_CCFLAGS=$JAVA_STATIC_DEPS_CCFLAGS" >> "$OUTPUT"
867 echo "JAVA_STATIC_DEPS_CXXFLAGS=$JAVA_STATIC_DEPS_CXXFLAGS" >> "$OUTPUT"
868 echo "JAVA_STATIC_DEPS_LDFLAGS=$JAVA_STATIC_DEPS_LDFLAGS" >> "$OUTPUT"
869 echo "JAVAC_ARGS=$JAVAC_ARGS" >> "$OUTPUT"
870 echo "VALGRIND_VER=$VALGRIND_VER" >> "$OUTPUT"
871 echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> "$OUTPUT"
872 echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> "$OUTPUT"
873 echo "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> "$OUTPUT"
874 echo "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> "$OUTPUT"
875 echo "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> "$OUTPUT"
876 echo "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> "$OUTPUT"
877 echo "EXEC_LDFLAGS=$EXEC_LDFLAGS" >> "$OUTPUT"
878 echo "JEMALLOC_INCLUDE=$JEMALLOC_INCLUDE" >> "$OUTPUT"
879 echo "JEMALLOC_LIB=$JEMALLOC_LIB" >> "$OUTPUT"
880 echo "ROCKSDB_MAJOR=$ROCKSDB_MAJOR" >> "$OUTPUT"
881 echo "ROCKSDB_MINOR=$ROCKSDB_MINOR" >> "$OUTPUT"
882 echo "ROCKSDB_PATCH=$ROCKSDB_PATCH" >> "$OUTPUT"
883 echo "CLANG_SCAN_BUILD=$CLANG_SCAN_BUILD" >> "$OUTPUT"
884 echo "CLANG_ANALYZER=$CLANG_ANALYZER" >> "$OUTPUT"
885 echo "PROFILING_FLAGS=$PROFILING_FLAGS" >> "$OUTPUT"
886 echo "FIND=$FIND" >> "$OUTPUT"
887 echo "WATCH=$WATCH" >> "$OUTPUT"
888 echo "FOLLY_PATH=$FOLLY_PATH" >> "$OUTPUT"
890 # This will enable some related identifiers for the preprocessor
891 if test -n "$JEMALLOC"; then
892 echo "JEMALLOC=1" >> "$OUTPUT"
894 # Indicates that jemalloc should be enabled using -ljemalloc flag
895 # The alternative is to porvide a direct link to the library via JEMALLOC_LIB
896 # and JEMALLOC_INCLUDE
897 if test -n "$WITH_JEMALLOC_FLAG"; then
898 echo "WITH_JEMALLOC_FLAG=$WITH_JEMALLOC_FLAG" >> "$OUTPUT"
900 echo "LUA_PATH=$LUA_PATH" >> "$OUTPUT"
901 if test -n "$USE_FOLLY"; then
902 echo "USE_FOLLY=$USE_FOLLY" >> "$OUTPUT"
904 if test -n "$PPC_LIBC_IS_GNU"; then
905 echo "PPC_LIBC_IS_GNU=$PPC_LIBC_IS_GNU" >> "$OUTPUT"