1#!/bin/sh 2# 3# Detects OS we're compiling on and generates build_config.mk, 4# which in turn gets read while processing Makefile. 5# 6# build_config.mk will set the following variables: 7# PLATFORM_LDFLAGS Linker flags 8# PLATFORM_CCFLAGS C compiler flags 9# PLATFORM_CXXFLAGS C++ compiler flags. Will contain: 10# -DLEVELDB_PLATFORM_POSIX if cstdatomic is present 11# -DLEVELDB_PLATFORM_NOATOMIC if it is not 12 13SCRIPT_DIR=`dirname $0` 14 15# Delete existing build_config.mk 16rm -f build_config.mk 17touch build_config.mk 18 19if test -z "$CXX"; then 20 CXX=g++ 21fi 22 23# Detect OS 24if test -z "$TARGET_OS"; then 25 TARGET_OS=`uname -s` 26fi 27 28COMMON_FLAGS= 29PLATFORM_CCFLAGS= 30PLATFORM_CXXFLAGS= 31PLATFORM_LDFLAGS= 32 33# On GCC, we pick libc's memcmp over GCC's memcmp via -fno-builtin-memcmp 34case "$TARGET_OS" in 35 Darwin) 36 PLATFORM=OS_MACOSX 37 COMMON_FLAGS="-fno-builtin-memcmp -DOS_MACOSX" 38 PORT_FILE=port/port_posix.cc 39 ;; 40 Linux) 41 PLATFORM=OS_LINUX 42 COMMON_FLAGS="-fno-builtin-memcmp -pthread -DOS_LINUX" 43 PLATFORM_LDFLAGS="-pthread" 44 PORT_FILE=port/port_posix.cc 45 ;; 46 SunOS) 47 PLATFORM=OS_SOLARIS 48 COMMON_FLAGS="-fno-builtin-memcmp -D_REENTRANT -DOS_SOLARIS" 49 PLATFORM_LDFLAGS="-lpthread -lrt" 50 PORT_FILE=port/port_posix.cc 51 ;; 52 FreeBSD) 53 PLATFORM=OS_FREEBSD 54 COMMON_FLAGS="-fno-builtin-memcmp -D_REENTRANT -DOS_FREEBSD" 55 PLATFORM_LDFLAGS="-lpthread" 56 PORT_FILE=port/port_posix.cc 57 ;; 58 NetBSD) 59 PLATFORM=OS_NETBSD 60 COMMON_FLAGS="-fno-builtin-memcmp -D_REENTRANT -DOS_NETBSD" 61 PLATFORM_LDFLAGS="-lpthread -lgcc_s" 62 PORT_FILE=port/port_posix.cc 63 ;; 64 OpenBSD) 65 PLATFORM=OS_OPENBSD 66 COMMON_FLAGS="-fno-builtin-memcmp -D_REENTRANT -DOS_OPENBSD" 67 PLATFORM_LDFLAGS="-pthread" 68 PORT_FILE=port/port_posix.cc 69 ;; 70 DragonFly) 71 PLATFORM=OS_DRAGONFLYBSD 72 COMMON_FLAGS="-fno-builtin-memcmp -D_REENTRANT -DOS_DRAGONFLYBSD" 73 PLATFORM_LDFLAGS="-lpthread" 74 PORT_FILE=port/port_posix.cc 75 ;; 76 OS_ANDROID_CROSSCOMPILE) 77 PLATFORM="$TARGET_OS" 78 COMMON_FLAGS="" 79 PLATFORM_LDFLAGS="" 80 PORT_FILE=port/port_android.cc 81 ;; 82 *) 83 echo "Unknown platform!" 84 exit 1 85esac 86 87# We want to make a list of all cc files within util, db, table, and helpers 88# except for the test and benchmark files. By default, find will output a list 89# of all files matching either rule, so we need to append -print to make the 90# prune take effect. 91DIRS="$SCRIPT_DIR/util $SCRIPT_DIR/db $SCRIPT_DIR/table" 92set -f # temporarily disable globbing so that our patterns aren't expanded 93PRUNE_TEST="-name *test*.cc -prune" 94PRUNE_BENCH="-name *_bench.cc -prune" 95PORTABLE_FILES=`find $DIRS $PRUNE_TEST -o $PRUNE_BENCH -o -name '*.cc' -print | sort | tr "\n" " "` 96set +f # re-enable globbing 97 98# The sources consist of the portable files, plus the platform-specific port 99# file. 100echo "SOURCES=$PORTABLE_FILES $PORT_FILE" >> build_config.mk 101echo "MEMENV_SOURCES=helpers/memenv/memenv.cc" >> build_config.mk 102 103if [ "$PLATFORM" = "OS_ANDROID_CROSSCOMPILE" ]; then 104 # Cross-compiling; do not try any compilation tests. 105 true 106else 107 # If -std=c++0x works, use <cstdatomic>. Otherwise use port_posix.h. 108 $CXX $CFLAGS -std=c++0x -x c++ - -o /dev/null 2>/dev/null <<EOF 109 #include <cstdatomic> 110 int main() {} 111EOF 112 if [ "$?" = 0 ]; then 113 COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX -DLEVELDB_CSTDATOMIC_PRESENT" 114 PLATFORM_CXXFLAGS="-std=c++0x" 115 else 116 COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX" 117 fi 118 119 # Test whether Snappy library is installed 120 # http://code.google.com/p/snappy/ 121 $CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF 122 #include <snappy.h> 123 int main() {} 124EOF 125 if [ "$?" = 0 ]; then 126 COMMON_FLAGS="$COMMON_FLAGS -DSNAPPY" 127 PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lsnappy" 128 fi 129 130 # Test whether tcmalloc is available 131 $CXX $CFLAGS -x c++ - -o /dev/null -ltcmalloc 2>/dev/null <<EOF 132 int main() {} 133EOF 134 if [ "$?" = 0 ]; then 135 PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -ltcmalloc" 136 fi 137fi 138 139PLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS" 140PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS" 141 142echo "PLATFORM=$PLATFORM" >> build_config.mk 143echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> build_config.mk 144echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> build_config.mk 145echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> build_config.mk 146