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