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_CSTDATOMIC_PRESENT if <cstdatomic> 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 47# Detect OS 48if test -z "$TARGET_OS"; then 49 TARGET_OS=`uname -s` 50fi 51 52COMMON_FLAGS= 53CROSS_COMPILE= 54PLATFORM_CCFLAGS= 55PLATFORM_CXXFLAGS= 56PLATFORM_LDFLAGS= 57PLATFORM_LIBS= 58PLATFORM_SHARED_EXT="so" 59PLATFORM_SHARED_LDFLAGS="-shared -Wl,-soname -Wl," 60PLATFORM_SHARED_CFLAGS="-fPIC" 61PLATFORM_SHARED_VERSIONED=true 62 63MEMCMP_FLAG= 64if [ "$CXX" = "g++" ]; then 65 # Use libc's memcmp instead of GCC's memcmp. This results in ~40% 66 # performance improvement on readrandom under gcc 4.4.3 on Linux/x86. 67 MEMCMP_FLAG="-fno-builtin-memcmp" 68fi 69 70case "$TARGET_OS" in 71 Darwin) 72 PLATFORM=OS_MACOSX 73 COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX" 74 PLATFORM_SHARED_EXT=dylib 75 [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd` 76 PLATFORM_SHARED_LDFLAGS="-dynamiclib -install_name $INSTALL_PATH/" 77 PORT_FILE=port/port_posix.cc 78 ;; 79 Linux) 80 PLATFORM=OS_LINUX 81 COMMON_FLAGS="$MEMCMP_FLAG -pthread -DOS_LINUX" 82 PLATFORM_LDFLAGS="-pthread" 83 PORT_FILE=port/port_posix.cc 84 ;; 85 SunOS) 86 PLATFORM=OS_SOLARIS 87 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_SOLARIS" 88 PLATFORM_LIBS="-lpthread -lrt" 89 PORT_FILE=port/port_posix.cc 90 ;; 91 FreeBSD) 92 PLATFORM=OS_FREEBSD 93 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_FREEBSD" 94 PLATFORM_LIBS="-lpthread" 95 PORT_FILE=port/port_posix.cc 96 ;; 97 NetBSD) 98 PLATFORM=OS_NETBSD 99 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_NETBSD" 100 PLATFORM_LIBS="-lpthread -lgcc_s" 101 PORT_FILE=port/port_posix.cc 102 ;; 103 OpenBSD) 104 PLATFORM=OS_OPENBSD 105 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_OPENBSD" 106 PLATFORM_LDFLAGS="-pthread" 107 PORT_FILE=port/port_posix.cc 108 ;; 109 DragonFly) 110 PLATFORM=OS_DRAGONFLYBSD 111 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_DRAGONFLYBSD" 112 PLATFORM_LIBS="-lpthread" 113 PORT_FILE=port/port_posix.cc 114 ;; 115 OS_ANDROID_CROSSCOMPILE) 116 PLATFORM=OS_ANDROID 117 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_ANDROID -DLEVELDB_PLATFORM_POSIX" 118 PLATFORM_LDFLAGS="" # All pthread features are in the Android C library 119 PORT_FILE=port/port_posix.cc 120 CROSS_COMPILE=true 121 ;; 122 HP-UX) 123 PLATFORM=OS_HPUX 124 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_HPUX" 125 PLATFORM_LDFLAGS="-pthread" 126 PORT_FILE=port/port_posix.cc 127 # man ld: +h internal_name 128 PLATFORM_SHARED_LDFLAGS="-shared -Wl,+h -Wl," 129 ;; 130 *) 131 echo "Unknown platform!" >&2 132 exit 1 133esac 134 135# We want to make a list of all cc files within util, db, table, and helpers 136# except for the test and benchmark files. By default, find will output a list 137# of all files matching either rule, so we need to append -print to make the 138# prune take effect. 139DIRS="$PREFIX/db $PREFIX/util $PREFIX/table" 140 141set -f # temporarily disable globbing so that our patterns aren't expanded 142PRUNE_TEST="-name *test*.cc -prune" 143PRUNE_BENCH="-name *_bench.cc -prune" 144PRUNE_TOOL="-name leveldb_main.cc -prune" 145PORTABLE_FILES=`find $DIRS $PRUNE_TEST -o $PRUNE_BENCH -o $PRUNE_TOOL -o -name '*.cc' -print | sort | sed "s,^$PREFIX/,," | tr "\n" " "` 146 147set +f # re-enable globbing 148 149# The sources consist of the portable files, plus the platform-specific port 150# file. 151echo "SOURCES=$PORTABLE_FILES $PORT_FILE" >> $OUTPUT 152echo "MEMENV_SOURCES=helpers/memenv/memenv.cc" >> $OUTPUT 153 154if [ "$CROSS_COMPILE" = "true" ]; then 155 # Cross-compiling; do not try any compilation tests. 156 true 157else 158 # If -std=c++0x works, use <cstdatomic>. Otherwise use port_posix.h. 159 $CXX $CXXFLAGS -std=c++0x -x c++ - -o /dev/null 2>/dev/null <<EOF 160 #include <cstdatomic> 161 int main() {} 162EOF 163 if [ "$?" = 0 ]; then 164 COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX -DLEVELDB_CSTDATOMIC_PRESENT" 165 PLATFORM_CXXFLAGS="-std=c++0x" 166 else 167 COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX" 168 fi 169 170 # Test whether Snappy library is installed 171 # http://code.google.com/p/snappy/ 172 $CXX $CXXFLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF 173 #include <snappy.h> 174 int main() {} 175EOF 176 if [ "$?" = 0 ]; then 177 COMMON_FLAGS="$COMMON_FLAGS -DSNAPPY" 178 PLATFORM_LIBS="$PLATFORM_LIBS -lsnappy" 179 fi 180 181 # Test whether tcmalloc is available 182 $CXX $CXXFLAGS -x c++ - -o /dev/null -ltcmalloc 2>/dev/null <<EOF 183 int main() {} 184EOF 185 if [ "$?" = 0 ]; then 186 PLATFORM_LIBS="$PLATFORM_LIBS -ltcmalloc" 187 fi 188fi 189 190PLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS" 191PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS" 192 193echo "CC=$CC" >> $OUTPUT 194echo "CXX=$CXX" >> $OUTPUT 195echo "PLATFORM=$PLATFORM" >> $OUTPUT 196echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUT 197echo "PLATFORM_LIBS=$PLATFORM_LIBS" >> $OUTPUT 198echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUT 199echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUT 200echo "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUT 201echo "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUT 202echo "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUT 203echo "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> $OUTPUT 204