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