1f57e2335S[email protected]#!/bin/sh 2a1ad4d19SSanjay Ghemawat# 385584d49SSanjay Ghemawat# Detects OS we're compiling on and outputs a file specified by the first 485584d49SSanjay Ghemawat# argument, which in turn gets read while processing Makefile. 5a1ad4d19SSanjay Ghemawat# 685584d49SSanjay Ghemawat# The output will set the following variables: 7075a35a6SSanjay Ghemawat# CC C Compiler path 8075a35a6SSanjay Ghemawat# CXX C++ Compiler path 9a1ad4d19SSanjay Ghemawat# PLATFORM_LDFLAGS Linker flags 1040768657SSanjay Ghemawat# PLATFORM_LIBS Libraries flags 11bc1ee4d2SSanjay Ghemawat# PLATFORM_SHARED_EXT Extension for shared libraries 12bc1ee4d2SSanjay Ghemawat# PLATFORM_SHARED_LDFLAGS Flags for building shared library 1340768657SSanjay Ghemawat# This flag is embedded just before the name 1440768657SSanjay Ghemawat# of the shared library without intervening spaces 15bc1ee4d2SSanjay Ghemawat# PLATFORM_SHARED_CFLAGS Flags for compiling objects for shared library 16a1ad4d19SSanjay Ghemawat# PLATFORM_CCFLAGS C compiler flags 17a1ad4d19SSanjay Ghemawat# PLATFORM_CXXFLAGS C++ compiler flags. Will contain: 18075a35a6SSanjay Ghemawat# PLATFORM_SHARED_VERSIONED Set to 'true' if platform supports versioned 19075a35a6SSanjay Ghemawat# shared libraries, empty otherwise. 20075a35a6SSanjay Ghemawat# 21075a35a6SSanjay Ghemawat# The PLATFORM_CCFLAGS and PLATFORM_CXXFLAGS might include the following: 22075a35a6SSanjay Ghemawat# 23803d6920SChris Mumford# -DLEVELDB_ATOMIC_PRESENT if <atomic> is present 24075a35a6SSanjay Ghemawat# -DLEVELDB_PLATFORM_POSIX for Posix-based platforms 25075a35a6SSanjay Ghemawat# -DSNAPPY if the Snappy library is present 26075a35a6SSanjay Ghemawat# 27a1ad4d19SSanjay Ghemawat 2885584d49SSanjay GhemawatOUTPUT=$1 29946e5b5aSDavid GroganPREFIX=$2 30946e5b5aSDavid Groganif test -z "$OUTPUT" || test -z "$PREFIX"; then 31946e5b5aSDavid Grogan echo "usage: $0 <output-filename> <directory_prefix>" >&2 3285584d49SSanjay Ghemawat exit 1 3385584d49SSanjay Ghemawatfi 34f57e2335S[email protected] 3585584d49SSanjay Ghemawat# Delete existing output, if it exists 3685584d49SSanjay Ghemawatrm -f $OUTPUT 3785584d49SSanjay Ghemawattouch $OUTPUT 38f57e2335S[email protected] 39075a35a6SSanjay Ghemawatif test -z "$CC"; then 40075a35a6SSanjay Ghemawat CC=cc 41075a35a6SSanjay Ghemawatfi 42075a35a6SSanjay Ghemawat 43c8c5866aSHans Wennborgif test -z "$CXX"; then 44c8c5866aSHans Wennborg CXX=g++ 45c8c5866aSHans Wennborgfi 46c8c5866aSHans Wennborg 4728dad918SDavid Groganif test -z "$TMPDIR"; then 4828dad918SDavid Grogan TMPDIR=/tmp 4928dad918SDavid Groganfi 5028dad918SDavid Grogan 51f57e2335S[email protected]# Detect OS 52a1ad4d19SSanjay Ghemawatif test -z "$TARGET_OS"; then 53a1ad4d19SSanjay Ghemawat TARGET_OS=`uname -s` 54a1ad4d19SSanjay Ghemawatfi 55a1ad4d19SSanjay Ghemawat 56a1ad4d19SSanjay GhemawatCOMMON_FLAGS= 57075a35a6SSanjay GhemawatCROSS_COMPILE= 58a1ad4d19SSanjay GhemawatPLATFORM_CCFLAGS= 59a1ad4d19SSanjay GhemawatPLATFORM_CXXFLAGS= 60a1ad4d19SSanjay GhemawatPLATFORM_LDFLAGS= 6140768657SSanjay GhemawatPLATFORM_LIBS= 62bc1ee4d2SSanjay GhemawatPLATFORM_SHARED_EXT="so" 63bc1ee4d2SSanjay GhemawatPLATFORM_SHARED_LDFLAGS="-shared -Wl,-soname -Wl," 64bc1ee4d2SSanjay GhemawatPLATFORM_SHARED_CFLAGS="-fPIC" 65075a35a6SSanjay GhemawatPLATFORM_SHARED_VERSIONED=true 66*ea175e28ScostanPLATFORM_SSEFLAGS= 67a1ad4d19SSanjay Ghemawat 68946e5b5aSDavid GroganMEMCMP_FLAG= 69946e5b5aSDavid Groganif [ "$CXX" = "g++" ]; then 70946e5b5aSDavid Grogan # Use libc's memcmp instead of GCC's memcmp. This results in ~40% 71946e5b5aSDavid Grogan # performance improvement on readrandom under gcc 4.4.3 on Linux/x86. 72946e5b5aSDavid Grogan MEMCMP_FLAG="-fno-builtin-memcmp" 73946e5b5aSDavid Groganfi 74946e5b5aSDavid Grogan 75a1ad4d19SSanjay Ghemawatcase "$TARGET_OS" in 76803d6920SChris Mumford CYGWIN_*) 77803d6920SChris Mumford PLATFORM=OS_LINUX 78803d6920SChris Mumford COMMON_FLAGS="$MEMCMP_FLAG -lpthread -DOS_LINUX -DCYGWIN" 79803d6920SChris Mumford PLATFORM_LDFLAGS="-lpthread" 80803d6920SChris Mumford PORT_FILE=port/port_posix.cc 81*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 82803d6920SChris Mumford ;; 83f57e2335S[email protected] Darwin) 84f57e2335S[email protected] PLATFORM=OS_MACOSX 85946e5b5aSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX" 86bc1ee4d2SSanjay Ghemawat PLATFORM_SHARED_EXT=dylib 8740768657SSanjay Ghemawat [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd` 8840768657SSanjay Ghemawat PLATFORM_SHARED_LDFLAGS="-dynamiclib -install_name $INSTALL_PATH/" 89a1ad4d19SSanjay Ghemawat PORT_FILE=port/port_posix.cc 90*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 91f57e2335S[email protected] ;; 92f57e2335S[email protected] Linux) 93f57e2335S[email protected] PLATFORM=OS_LINUX 94946e5b5aSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -pthread -DOS_LINUX" 95a1ad4d19SSanjay Ghemawat PLATFORM_LDFLAGS="-pthread" 96a1ad4d19SSanjay Ghemawat PORT_FILE=port/port_posix.cc 97*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 98f57e2335S[email protected] ;; 99f57e2335S[email protected] SunOS) 100f57e2335S[email protected] PLATFORM=OS_SOLARIS 101946e5b5aSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_SOLARIS" 10240768657SSanjay Ghemawat PLATFORM_LIBS="-lpthread -lrt" 103a1ad4d19SSanjay Ghemawat PORT_FILE=port/port_posix.cc 104*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 105f57e2335S[email protected] ;; 106f122c6dfS[email protected] FreeBSD) 107f122c6dfS[email protected] PLATFORM=OS_FREEBSD 108946e5b5aSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_FREEBSD" 10940768657SSanjay Ghemawat PLATFORM_LIBS="-lpthread" 110a1ad4d19SSanjay Ghemawat PORT_FILE=port/port_posix.cc 111*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 112f122c6dfS[email protected] ;; 113015d26f8SSanjay Ghemawat NetBSD) 114015d26f8SSanjay Ghemawat PLATFORM=OS_NETBSD 115946e5b5aSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_NETBSD" 11640768657SSanjay Ghemawat PLATFORM_LIBS="-lpthread -lgcc_s" 117a1ad4d19SSanjay Ghemawat PORT_FILE=port/port_posix.cc 118*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 119015d26f8SSanjay Ghemawat ;; 120015d26f8SSanjay Ghemawat OpenBSD) 121015d26f8SSanjay Ghemawat PLATFORM=OS_OPENBSD 122946e5b5aSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_OPENBSD" 123a1ad4d19SSanjay Ghemawat PLATFORM_LDFLAGS="-pthread" 124a1ad4d19SSanjay Ghemawat PORT_FILE=port/port_posix.cc 125*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 126015d26f8SSanjay Ghemawat ;; 127015d26f8SSanjay Ghemawat DragonFly) 128015d26f8SSanjay Ghemawat PLATFORM=OS_DRAGONFLYBSD 129946e5b5aSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_DRAGONFLYBSD" 13040768657SSanjay Ghemawat PLATFORM_LIBS="-lpthread" 131a1ad4d19SSanjay Ghemawat PORT_FILE=port/port_posix.cc 132*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 133a1ad4d19SSanjay Ghemawat ;; 134a1ad4d19SSanjay Ghemawat OS_ANDROID_CROSSCOMPILE) 135075a35a6SSanjay Ghemawat PLATFORM=OS_ANDROID 136946e5b5aSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_ANDROID -DLEVELDB_PLATFORM_POSIX" 137075a35a6SSanjay Ghemawat PLATFORM_LDFLAGS="" # All pthread features are in the Android C library 138075a35a6SSanjay Ghemawat PORT_FILE=port/port_posix.cc 139*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 140075a35a6SSanjay Ghemawat CROSS_COMPILE=true 141015d26f8SSanjay Ghemawat ;; 142946e5b5aSDavid Grogan HP-UX) 143946e5b5aSDavid Grogan PLATFORM=OS_HPUX 144946e5b5aSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_HPUX" 145946e5b5aSDavid Grogan PLATFORM_LDFLAGS="-pthread" 146946e5b5aSDavid Grogan PORT_FILE=port/port_posix.cc 147*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 148946e5b5aSDavid Grogan # man ld: +h internal_name 149946e5b5aSDavid Grogan PLATFORM_SHARED_LDFLAGS="-shared -Wl,+h -Wl," 150946e5b5aSDavid Grogan ;; 1510cfb990dSDavid Grogan IOS) 1520cfb990dSDavid Grogan PLATFORM=IOS 1530cfb990dSDavid Grogan COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX" 1540cfb990dSDavid Grogan [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd` 1550cfb990dSDavid Grogan PORT_FILE=port/port_posix.cc 156*ea175e28Scostan PORT_SSE_FILE=port/port_posix_sse.cc 1570cfb990dSDavid Grogan PLATFORM_SHARED_EXT= 1580cfb990dSDavid Grogan PLATFORM_SHARED_LDFLAGS= 1590cfb990dSDavid Grogan PLATFORM_SHARED_CFLAGS= 1600cfb990dSDavid Grogan PLATFORM_SHARED_VERSIONED= 1610cfb990dSDavid Grogan ;; 162f57e2335S[email protected] *) 163075a35a6SSanjay Ghemawat echo "Unknown platform!" >&2 164f57e2335S[email protected] exit 1 165f57e2335S[email protected]esac 166f57e2335S[email protected] 167a1ad4d19SSanjay Ghemawat# We want to make a list of all cc files within util, db, table, and helpers 168a1ad4d19SSanjay Ghemawat# except for the test and benchmark files. By default, find will output a list 169a1ad4d19SSanjay Ghemawat# of all files matching either rule, so we need to append -print to make the 170a1ad4d19SSanjay Ghemawat# prune take effect. 171946e5b5aSDavid GroganDIRS="$PREFIX/db $PREFIX/util $PREFIX/table" 172946e5b5aSDavid Grogan 173a1ad4d19SSanjay Ghemawatset -f # temporarily disable globbing so that our patterns aren't expanded 174a1ad4d19SSanjay GhemawatPRUNE_TEST="-name *test*.cc -prune" 175a1ad4d19SSanjay GhemawatPRUNE_BENCH="-name *_bench.cc -prune" 176adbe3eb0ScmumfordPRUNE_TOOL="-name leveldbutil.cc -prune" 177ea2e9195SSanjay GhemawatPORTABLE_FILES=`find $DIRS $PRUNE_TEST -o $PRUNE_BENCH -o $PRUNE_TOOL -o -name '*.cc' -print | sort | sed "s,^$PREFIX/,," | tr "\n" " "` 178946e5b5aSDavid Grogan 179a1ad4d19SSanjay Ghemawatset +f # re-enable globbing 180f57e2335S[email protected] 181a1ad4d19SSanjay Ghemawat# The sources consist of the portable files, plus the platform-specific port 182a1ad4d19SSanjay Ghemawat# file. 183*ea175e28Scostanecho "SOURCES=$PORTABLE_FILES $PORT_FILE $PORT_SSE_FILE" >> $OUTPUT 18485584d49SSanjay Ghemawatecho "MEMENV_SOURCES=helpers/memenv/memenv.cc" >> $OUTPUT 185f57e2335S[email protected] 186075a35a6SSanjay Ghemawatif [ "$CROSS_COMPILE" = "true" ]; then 187a1ad4d19SSanjay Ghemawat # Cross-compiling; do not try any compilation tests. 188a1ad4d19SSanjay Ghemawat true 189a1ad4d19SSanjay Ghemawatelse 19028dad918SDavid Grogan CXXOUTPUT="${TMPDIR}/leveldb_build_detect_platform-cxx.$$" 19128dad918SDavid Grogan 192803d6920SChris Mumford # If -std=c++0x works, use <atomic> as fallback for when memory barriers 193803d6920SChris Mumford # are not available. 19428dad918SDavid Grogan $CXX $CXXFLAGS -std=c++0x -x c++ - -o $CXXOUTPUT 2>/dev/null <<EOF 195803d6920SChris Mumford #include <atomic> 196f57e2335S[email protected] int main() {} 197f57e2335S[email protected]EOF 198f57e2335S[email protected] if [ "$?" = 0 ]; then 199803d6920SChris Mumford COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT" 200a1ad4d19SSanjay Ghemawat PLATFORM_CXXFLAGS="-std=c++0x" 201f57e2335S[email protected] else 202a1ad4d19SSanjay Ghemawat COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX" 203f57e2335S[email protected] fi 204f57e2335S[email protected] 205f57e2335S[email protected] # Test whether Snappy library is installed 206f57e2335S[email protected] # http://code.google.com/p/snappy/ 20728dad918SDavid Grogan $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT 2>/dev/null <<EOF 208f57e2335S[email protected] #include <snappy.h> 209f57e2335S[email protected] int main() {} 210f57e2335S[email protected]EOF 211f57e2335S[email protected] if [ "$?" = 0 ]; then 212a1ad4d19SSanjay Ghemawat COMMON_FLAGS="$COMMON_FLAGS -DSNAPPY" 21340768657SSanjay Ghemawat PLATFORM_LIBS="$PLATFORM_LIBS -lsnappy" 214f57e2335S[email protected] fi 215f57e2335S[email protected] 216a1ad4d19SSanjay Ghemawat # Test whether tcmalloc is available 21728dad918SDavid Grogan $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -ltcmalloc 2>/dev/null <<EOF 218a1ad4d19SSanjay Ghemawat int main() {} 219a1ad4d19SSanjay GhemawatEOF 220a1ad4d19SSanjay Ghemawat if [ "$?" = 0 ]; then 22140768657SSanjay Ghemawat PLATFORM_LIBS="$PLATFORM_LIBS -ltcmalloc" 222a1ad4d19SSanjay Ghemawat fi 22328dad918SDavid Grogan 22428dad918SDavid Grogan rm -f $CXXOUTPUT 2>/dev/null 225*ea175e28Scostan 226*ea175e28Scostan # Test if gcc SSE 4.2 is supported 227*ea175e28Scostan $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -msse4.2 2>/dev/null <<EOF 228*ea175e28Scostan int main() {} 229*ea175e28ScostanEOF 230*ea175e28Scostan if [ "$?" = 0 ]; then 231*ea175e28Scostan PLATFORM_SSEFLAGS="-msse4.2" 232*ea175e28Scostan fi 233*ea175e28Scostan 234*ea175e28Scostan rm -f $CXXOUTPUT 2>/dev/null 235*ea175e28Scostanfi 236*ea175e28Scostan 237*ea175e28Scostan# Use the SSE 4.2 CRC32C intrinsics iff runtime checks indicate compiler supports them. 238*ea175e28Scostanif [ -n "$PLATFORM_SSEFLAGS" ]; then 239*ea175e28Scostan PLATFORM_SSEFLAGS="$PLATFORM_SSEFLAGS -DLEVELDB_PLATFORM_POSIX_SSE" 240a1ad4d19SSanjay Ghemawatfi 241a1ad4d19SSanjay Ghemawat 242a1ad4d19SSanjay GhemawatPLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS" 243a1ad4d19SSanjay GhemawatPLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS" 244a1ad4d19SSanjay Ghemawat 245075a35a6SSanjay Ghemawatecho "CC=$CC" >> $OUTPUT 246075a35a6SSanjay Ghemawatecho "CXX=$CXX" >> $OUTPUT 24785584d49SSanjay Ghemawatecho "PLATFORM=$PLATFORM" >> $OUTPUT 24885584d49SSanjay Ghemawatecho "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUT 24940768657SSanjay Ghemawatecho "PLATFORM_LIBS=$PLATFORM_LIBS" >> $OUTPUT 25085584d49SSanjay Ghemawatecho "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUT 25185584d49SSanjay Ghemawatecho "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUT 252*ea175e28Scostanecho "PLATFORM_SSEFLAGS=$PLATFORM_SSEFLAGS" >> $OUTPUT 25385584d49SSanjay Ghemawatecho "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUT 25485584d49SSanjay Ghemawatecho "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUT 25585584d49SSanjay Ghemawatecho "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUT 256075a35a6SSanjay Ghemawatecho "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> $OUTPUT 257