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# CC C Compiler path 8# CXX C++ Compiler path 9# PLATFORM_LDFLAGS Linker flags 10# PLATFORM_LIBS Libraries flags 11# PLATFORM_SHARED_EXT Extension for shared libraries 12# PLATFORM_SHARED_LDFLAGS Flags for building shared library 13# This flag is embedded just before the name 14# of the shared library without intervening spaces 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# 21# The PLATFORM_CCFLAGS and PLATFORM_CXXFLAGS might include the following: 22# 23# -DLEVELDB_ATOMIC_PRESENT if <atomic> is present 24# -DLEVELDB_PLATFORM_POSIX for Posix-based platforms 25# -DSNAPPY if the Snappy library is present 26# 27 28OUTPUT=$1 29PREFIX=$2 30if test -z "$OUTPUT" || test -z "$PREFIX"; then 31 echo "usage: $0 <output-filename> <directory_prefix>" >&2 32 exit 1 33fi 34 35# Delete existing output, if it exists 36rm -f $OUTPUT 37touch $OUTPUT 38 39if test -z "$CC"; then 40 CC=cc 41fi 42 43if test -z "$CXX"; then 44 CXX=g++ 45fi 46 47if test -z "$TMPDIR"; then 48 TMPDIR=/tmp 49fi 50 51# Detect OS 52if test -z "$TARGET_OS"; then 53 TARGET_OS=`uname -s` 54fi 55 56COMMON_FLAGS= 57CROSS_COMPILE= 58PLATFORM_CCFLAGS= 59PLATFORM_CXXFLAGS= 60PLATFORM_LDFLAGS= 61PLATFORM_LIBS= 62PLATFORM_SHARED_EXT="so" 63PLATFORM_SHARED_LDFLAGS="-shared -Wl,-soname -Wl," 64PLATFORM_SHARED_CFLAGS="-fPIC" 65PLATFORM_SHARED_VERSIONED=true 66PLATFORM_SSEFLAGS= 67 68MEMCMP_FLAG= 69if [ "$CXX" = "g++" ]; then 70 # Use libc's memcmp instead of GCC's memcmp. This results in ~40% 71 # performance improvement on readrandom under gcc 4.4.3 on Linux/x86. 72 MEMCMP_FLAG="-fno-builtin-memcmp" 73fi 74 75case "$TARGET_OS" in 76 CYGWIN_*) 77 PLATFORM=OS_LINUX 78 COMMON_FLAGS="$MEMCMP_FLAG -lpthread -DOS_LINUX -DCYGWIN" 79 PLATFORM_LDFLAGS="-lpthread" 80 PORT_FILE=port/port_posix.cc 81 PORT_SSE_FILE=port/port_posix_sse.cc 82 ;; 83 Darwin) 84 PLATFORM=OS_MACOSX 85 COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX" 86 PLATFORM_SHARED_EXT=dylib 87 [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd` 88 PLATFORM_SHARED_LDFLAGS="-dynamiclib -install_name $INSTALL_PATH/" 89 PORT_FILE=port/port_posix.cc 90 PORT_SSE_FILE=port/port_posix_sse.cc 91 ;; 92 Linux) 93 PLATFORM=OS_LINUX 94 COMMON_FLAGS="$MEMCMP_FLAG -pthread -DOS_LINUX" 95 PLATFORM_LDFLAGS="-pthread" 96 PORT_FILE=port/port_posix.cc 97 PORT_SSE_FILE=port/port_posix_sse.cc 98 ;; 99 SunOS) 100 PLATFORM=OS_SOLARIS 101 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_SOLARIS" 102 PLATFORM_LIBS="-lpthread -lrt" 103 PORT_FILE=port/port_posix.cc 104 PORT_SSE_FILE=port/port_posix_sse.cc 105 ;; 106 FreeBSD) 107 PLATFORM=OS_FREEBSD 108 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_FREEBSD" 109 PLATFORM_LIBS="-lpthread" 110 PORT_FILE=port/port_posix.cc 111 PORT_SSE_FILE=port/port_posix_sse.cc 112 ;; 113 NetBSD) 114 PLATFORM=OS_NETBSD 115 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_NETBSD" 116 PLATFORM_LIBS="-lpthread -lgcc_s" 117 PORT_FILE=port/port_posix.cc 118 PORT_SSE_FILE=port/port_posix_sse.cc 119 ;; 120 OpenBSD) 121 PLATFORM=OS_OPENBSD 122 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_OPENBSD" 123 PLATFORM_LDFLAGS="-pthread" 124 PORT_FILE=port/port_posix.cc 125 PORT_SSE_FILE=port/port_posix_sse.cc 126 ;; 127 DragonFly) 128 PLATFORM=OS_DRAGONFLYBSD 129 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_DRAGONFLYBSD" 130 PLATFORM_LIBS="-lpthread" 131 PORT_FILE=port/port_posix.cc 132 PORT_SSE_FILE=port/port_posix_sse.cc 133 ;; 134 OS_ANDROID_CROSSCOMPILE) 135 PLATFORM=OS_ANDROID 136 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_ANDROID -DLEVELDB_PLATFORM_POSIX" 137 PLATFORM_LDFLAGS="" # All pthread features are in the Android C library 138 PORT_FILE=port/port_posix.cc 139 PORT_SSE_FILE=port/port_posix_sse.cc 140 CROSS_COMPILE=true 141 ;; 142 HP-UX) 143 PLATFORM=OS_HPUX 144 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_HPUX" 145 PLATFORM_LDFLAGS="-pthread" 146 PORT_FILE=port/port_posix.cc 147 PORT_SSE_FILE=port/port_posix_sse.cc 148 # man ld: +h internal_name 149 PLATFORM_SHARED_LDFLAGS="-shared -Wl,+h -Wl," 150 ;; 151 IOS) 152 PLATFORM=IOS 153 COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX" 154 [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd` 155 PORT_FILE=port/port_posix.cc 156 PORT_SSE_FILE=port/port_posix_sse.cc 157 PLATFORM_SHARED_EXT= 158 PLATFORM_SHARED_LDFLAGS= 159 PLATFORM_SHARED_CFLAGS= 160 PLATFORM_SHARED_VERSIONED= 161 ;; 162 *) 163 echo "Unknown platform!" >&2 164 exit 1 165esac 166 167# We want to make a list of all cc files within util, db, table, and helpers 168# except for the test and benchmark files. By default, find will output a list 169# of all files matching either rule, so we need to append -print to make the 170# prune take effect. 171DIRS="$PREFIX/db $PREFIX/util $PREFIX/table" 172 173set -f # temporarily disable globbing so that our patterns aren't expanded 174PRUNE_TEST="-name *test*.cc -prune" 175PRUNE_BENCH="-name *_bench.cc -prune" 176PRUNE_TOOL="-name leveldbutil.cc -prune" 177PORTABLE_FILES=`find $DIRS $PRUNE_TEST -o $PRUNE_BENCH -o $PRUNE_TOOL -o -name '*.cc' -print | sort | sed "s,^$PREFIX/,," | tr "\n" " "` 178 179set +f # re-enable globbing 180 181# The sources consist of the portable files, plus the platform-specific port 182# file. 183echo "SOURCES=$PORTABLE_FILES $PORT_FILE $PORT_SSE_FILE" >> $OUTPUT 184echo "MEMENV_SOURCES=helpers/memenv/memenv.cc" >> $OUTPUT 185 186if [ "$CROSS_COMPILE" = "true" ]; then 187 # Cross-compiling; do not try any compilation tests. 188 true 189else 190 CXXOUTPUT="${TMPDIR}/leveldb_build_detect_platform-cxx.$$" 191 192 # If -std=c++0x works, use <atomic> as fallback for when memory barriers 193 # are not available. 194 $CXX $CXXFLAGS -std=c++0x -x c++ - -o $CXXOUTPUT 2>/dev/null <<EOF 195 #include <atomic> 196 int main() {} 197EOF 198 if [ "$?" = 0 ]; then 199 COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT" 200 PLATFORM_CXXFLAGS="-std=c++0x" 201 else 202 COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX" 203 fi 204 205 # Test whether Snappy library is installed 206 # http://code.google.com/p/snappy/ 207 $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT 2>/dev/null <<EOF 208 #include <snappy.h> 209 int main() {} 210EOF 211 if [ "$?" = 0 ]; then 212 COMMON_FLAGS="$COMMON_FLAGS -DSNAPPY" 213 PLATFORM_LIBS="$PLATFORM_LIBS -lsnappy" 214 fi 215 216 # Test whether tcmalloc is available 217 $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -ltcmalloc 2>/dev/null <<EOF 218 int main() {} 219EOF 220 if [ "$?" = 0 ]; then 221 PLATFORM_LIBS="$PLATFORM_LIBS -ltcmalloc" 222 fi 223 224 rm -f $CXXOUTPUT 2>/dev/null 225 226 # Test if gcc SSE 4.2 is supported 227 $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -msse4.2 2>/dev/null <<EOF 228 int main() {} 229EOF 230 if [ "$?" = 0 ]; then 231 PLATFORM_SSEFLAGS="-msse4.2" 232 fi 233 234 rm -f $CXXOUTPUT 2>/dev/null 235fi 236 237# Use the SSE 4.2 CRC32C intrinsics iff runtime checks indicate compiler supports them. 238if [ -n "$PLATFORM_SSEFLAGS" ]; then 239 PLATFORM_SSEFLAGS="$PLATFORM_SSEFLAGS -DLEVELDB_PLATFORM_POSIX_SSE" 240fi 241 242PLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS" 243PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS" 244 245echo "CC=$CC" >> $OUTPUT 246echo "CXX=$CXX" >> $OUTPUT 247echo "PLATFORM=$PLATFORM" >> $OUTPUT 248echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUT 249echo "PLATFORM_LIBS=$PLATFORM_LIBS" >> $OUTPUT 250echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUT 251echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUT 252echo "PLATFORM_SSEFLAGS=$PLATFORM_SSEFLAGS" >> $OUTPUT 253echo "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUT 254echo "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUT 255echo "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUT 256echo "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> $OUTPUT 257