blob: 6e59c6f8fbad1f14dd30a313e30274134943167b [file] [log] [blame]
gabor@google.com9cb7b732011-06-29 00:30:50 +00001#!/bin/sh
sanjay@google.comd44dcce2012-03-21 17:32:19 +00002#
sanjay@google.com99a75852012-04-17 15:48:25 +00003# Detects OS we're compiling on and outputs a file specified by the first
4# argument, which in turn gets read while processing Makefile.
sanjay@google.comd44dcce2012-03-21 17:32:19 +00005#
sanjay@google.com99a75852012-04-17 15:48:25 +00006# The output will set the following variables:
sanjay@google.com158f7672012-05-30 16:53:11 +00007# CC C Compiler path
8# CXX C++ Compiler path
sanjay@google.comd44dcce2012-03-21 17:32:19 +00009# PLATFORM_LDFLAGS Linker flags
sanjay@google.comb0edd032012-10-16 23:22:36 +000010# PLATFORM_LIBS Libraries flags
sanjay@google.combf108122012-03-30 20:18:06 +000011# PLATFORM_SHARED_EXT Extension for shared libraries
12# PLATFORM_SHARED_LDFLAGS Flags for building shared library
sanjay@google.comb0edd032012-10-16 23:22:36 +000013# This flag is embedded just before the name
14# of the shared library without intervening spaces
sanjay@google.combf108122012-03-30 20:18:06 +000015# PLATFORM_SHARED_CFLAGS Flags for compiling objects for shared library
sanjay@google.comd44dcce2012-03-21 17:32:19 +000016# PLATFORM_CCFLAGS C compiler flags
17# PLATFORM_CXXFLAGS C++ compiler flags. Will contain:
sanjay@google.com158f7672012-05-30 16:53:11 +000018# 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#
sanjay@google.comd44dcce2012-03-21 17:32:19 +000027
sanjay@google.com99a75852012-04-17 15:48:25 +000028OUTPUT=$1
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +000029PREFIX=$2
30if test -z "$OUTPUT" || test -z "$PREFIX"; then
31 echo "usage: $0 <output-filename> <directory_prefix>" >&2
sanjay@google.com99a75852012-04-17 15:48:25 +000032 exit 1
33fi
gabor@google.com9cb7b732011-06-29 00:30:50 +000034
sanjay@google.com99a75852012-04-17 15:48:25 +000035# Delete existing output, if it exists
36rm -f $OUTPUT
37touch $OUTPUT
gabor@google.com9cb7b732011-06-29 00:30:50 +000038
sanjay@google.com158f7672012-05-30 16:53:11 +000039if test -z "$CC"; then
40 CC=cc
41fi
42
hans@chromium.orgb14d5e12011-11-30 11:08:02 +000043if test -z "$CXX"; then
44 CXX=g++
45fi
46
dgrogan@chromium.orgbd534e22013-05-15 00:06:55 +000047if test -z "$TMPDIR"; then
48 TMPDIR=/tmp
49fi
50
gabor@google.com9cb7b732011-06-29 00:30:50 +000051# Detect OS
sanjay@google.comd44dcce2012-03-21 17:32:19 +000052if test -z "$TARGET_OS"; then
53 TARGET_OS=`uname -s`
54fi
55
56COMMON_FLAGS=
sanjay@google.com158f7672012-05-30 16:53:11 +000057CROSS_COMPILE=
sanjay@google.comd44dcce2012-03-21 17:32:19 +000058PLATFORM_CCFLAGS=
59PLATFORM_CXXFLAGS=
60PLATFORM_LDFLAGS=
sanjay@google.comb0edd032012-10-16 23:22:36 +000061PLATFORM_LIBS=
sanjay@google.combf108122012-03-30 20:18:06 +000062PLATFORM_SHARED_EXT="so"
63PLATFORM_SHARED_LDFLAGS="-shared -Wl,-soname -Wl,"
64PLATFORM_SHARED_CFLAGS="-fPIC"
sanjay@google.com158f7672012-05-30 16:53:11 +000065PLATFORM_SHARED_VERSIONED=true
sanjay@google.comd44dcce2012-03-21 17:32:19 +000066
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +000067MEMCMP_FLAG=
68if [ "$CXX" = "g++" ]; then
69 # Use libc's memcmp instead of GCC's memcmp. This results in ~40%
70 # performance improvement on readrandom under gcc 4.4.3 on Linux/x86.
71 MEMCMP_FLAG="-fno-builtin-memcmp"
72fi
73
sanjay@google.comd44dcce2012-03-21 17:32:19 +000074case "$TARGET_OS" in
gabor@google.com9cb7b732011-06-29 00:30:50 +000075 Darwin)
76 PLATFORM=OS_MACOSX
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +000077 COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX"
sanjay@google.combf108122012-03-30 20:18:06 +000078 PLATFORM_SHARED_EXT=dylib
sanjay@google.comb0edd032012-10-16 23:22:36 +000079 [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd`
80 PLATFORM_SHARED_LDFLAGS="-dynamiclib -install_name $INSTALL_PATH/"
sanjay@google.comd44dcce2012-03-21 17:32:19 +000081 PORT_FILE=port/port_posix.cc
gabor@google.com9cb7b732011-06-29 00:30:50 +000082 ;;
83 Linux)
84 PLATFORM=OS_LINUX
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +000085 COMMON_FLAGS="$MEMCMP_FLAG -pthread -DOS_LINUX"
sanjay@google.comd44dcce2012-03-21 17:32:19 +000086 PLATFORM_LDFLAGS="-pthread"
87 PORT_FILE=port/port_posix.cc
gabor@google.com9cb7b732011-06-29 00:30:50 +000088 ;;
89 SunOS)
90 PLATFORM=OS_SOLARIS
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +000091 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_SOLARIS"
sanjay@google.comb0edd032012-10-16 23:22:36 +000092 PLATFORM_LIBS="-lpthread -lrt"
sanjay@google.comd44dcce2012-03-21 17:32:19 +000093 PORT_FILE=port/port_posix.cc
gabor@google.com9cb7b732011-06-29 00:30:50 +000094 ;;
gabor@google.comfcd2d562011-07-27 01:46:25 +000095 FreeBSD)
96 PLATFORM=OS_FREEBSD
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +000097 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_FREEBSD"
sanjay@google.comb0edd032012-10-16 23:22:36 +000098 PLATFORM_LIBS="-lpthread"
sanjay@google.comd44dcce2012-03-21 17:32:19 +000099 PORT_FILE=port/port_posix.cc
gabor@google.comfcd2d562011-07-27 01:46:25 +0000100 ;;
sanjay@google.com33660312012-03-05 18:38:07 +0000101 NetBSD)
102 PLATFORM=OS_NETBSD
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +0000103 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_NETBSD"
sanjay@google.comb0edd032012-10-16 23:22:36 +0000104 PLATFORM_LIBS="-lpthread -lgcc_s"
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000105 PORT_FILE=port/port_posix.cc
sanjay@google.com33660312012-03-05 18:38:07 +0000106 ;;
107 OpenBSD)
108 PLATFORM=OS_OPENBSD
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +0000109 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_OPENBSD"
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000110 PLATFORM_LDFLAGS="-pthread"
111 PORT_FILE=port/port_posix.cc
sanjay@google.com33660312012-03-05 18:38:07 +0000112 ;;
113 DragonFly)
114 PLATFORM=OS_DRAGONFLYBSD
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +0000115 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_DRAGONFLYBSD"
sanjay@google.comb0edd032012-10-16 23:22:36 +0000116 PLATFORM_LIBS="-lpthread"
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000117 PORT_FILE=port/port_posix.cc
118 ;;
119 OS_ANDROID_CROSSCOMPILE)
sanjay@google.com158f7672012-05-30 16:53:11 +0000120 PLATFORM=OS_ANDROID
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +0000121 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_ANDROID -DLEVELDB_PLATFORM_POSIX"
sanjay@google.com158f7672012-05-30 16:53:11 +0000122 PLATFORM_LDFLAGS="" # All pthread features are in the Android C library
123 PORT_FILE=port/port_posix.cc
124 CROSS_COMPILE=true
sanjay@google.com33660312012-03-05 18:38:07 +0000125 ;;
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +0000126 HP-UX)
127 PLATFORM=OS_HPUX
128 COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_HPUX"
129 PLATFORM_LDFLAGS="-pthread"
130 PORT_FILE=port/port_posix.cc
131 # man ld: +h internal_name
132 PLATFORM_SHARED_LDFLAGS="-shared -Wl,+h -Wl,"
133 ;;
dgrogan@chromium.org4935bf02013-12-10 19:01:22 +0000134 IOS)
135 PLATFORM=IOS
136 COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX"
137 [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd`
138 PORT_FILE=port/port_posix.cc
139 PLATFORM_SHARED_EXT=
140 PLATFORM_SHARED_LDFLAGS=
141 PLATFORM_SHARED_CFLAGS=
142 PLATFORM_SHARED_VERSIONED=
143 ;;
gabor@google.com9cb7b732011-06-29 00:30:50 +0000144 *)
sanjay@google.com158f7672012-05-30 16:53:11 +0000145 echo "Unknown platform!" >&2
gabor@google.com9cb7b732011-06-29 00:30:50 +0000146 exit 1
147esac
148
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000149# We want to make a list of all cc files within util, db, table, and helpers
150# except for the test and benchmark files. By default, find will output a list
151# of all files matching either rule, so we need to append -print to make the
152# prune take effect.
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +0000153DIRS="$PREFIX/db $PREFIX/util $PREFIX/table"
154
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000155set -f # temporarily disable globbing so that our patterns aren't expanded
156PRUNE_TEST="-name *test*.cc -prune"
157PRUNE_BENCH="-name *_bench.cc -prune"
sanjay@google.coma842f7e2012-12-27 18:43:59 +0000158PRUNE_TOOL="-name leveldb_main.cc -prune"
159PORTABLE_FILES=`find $DIRS $PRUNE_TEST -o $PRUNE_BENCH -o $PRUNE_TOOL -o -name '*.cc' -print | sort | sed "s,^$PREFIX/,," | tr "\n" " "`
dgrogan@chromium.org29c68f12012-10-12 19:13:17 +0000160
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000161set +f # re-enable globbing
162
163# The sources consist of the portable files, plus the platform-specific port
164# file.
sanjay@google.com99a75852012-04-17 15:48:25 +0000165echo "SOURCES=$PORTABLE_FILES $PORT_FILE" >> $OUTPUT
166echo "MEMENV_SOURCES=helpers/memenv/memenv.cc" >> $OUTPUT
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000167
sanjay@google.com158f7672012-05-30 16:53:11 +0000168if [ "$CROSS_COMPILE" = "true" ]; then
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000169 # Cross-compiling; do not try any compilation tests.
170 true
171else
dgrogan@chromium.orgbd534e22013-05-15 00:06:55 +0000172 CXXOUTPUT="${TMPDIR}/leveldb_build_detect_platform-cxx.$$"
173
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000174 # If -std=c++0x works, use <cstdatomic>. Otherwise use port_posix.h.
dgrogan@chromium.orgbd534e22013-05-15 00:06:55 +0000175 $CXX $CXXFLAGS -std=c++0x -x c++ - -o $CXXOUTPUT 2>/dev/null <<EOF
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000176 #include <cstdatomic>
177 int main() {}
178EOF
179 if [ "$?" = 0 ]; then
180 COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX -DLEVELDB_CSTDATOMIC_PRESENT"
181 PLATFORM_CXXFLAGS="-std=c++0x"
182 else
183 COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX"
184 fi
185
186 # Test whether Snappy library is installed
187 # http://code.google.com/p/snappy/
dgrogan@chromium.orgbd534e22013-05-15 00:06:55 +0000188 $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT 2>/dev/null <<EOF
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000189 #include <snappy.h>
190 int main() {}
191EOF
192 if [ "$?" = 0 ]; then
193 COMMON_FLAGS="$COMMON_FLAGS -DSNAPPY"
sanjay@google.comb0edd032012-10-16 23:22:36 +0000194 PLATFORM_LIBS="$PLATFORM_LIBS -lsnappy"
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000195 fi
196
197 # Test whether tcmalloc is available
dgrogan@chromium.orgbd534e22013-05-15 00:06:55 +0000198 $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -ltcmalloc 2>/dev/null <<EOF
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000199 int main() {}
200EOF
201 if [ "$?" = 0 ]; then
sanjay@google.comb0edd032012-10-16 23:22:36 +0000202 PLATFORM_LIBS="$PLATFORM_LIBS -ltcmalloc"
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000203 fi
dgrogan@chromium.orgbd534e22013-05-15 00:06:55 +0000204
205 rm -f $CXXOUTPUT 2>/dev/null
sanjay@google.comd44dcce2012-03-21 17:32:19 +0000206fi
207
208PLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS"
209PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS"
210
sanjay@google.com158f7672012-05-30 16:53:11 +0000211echo "CC=$CC" >> $OUTPUT
212echo "CXX=$CXX" >> $OUTPUT
sanjay@google.com99a75852012-04-17 15:48:25 +0000213echo "PLATFORM=$PLATFORM" >> $OUTPUT
214echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUT
sanjay@google.comb0edd032012-10-16 23:22:36 +0000215echo "PLATFORM_LIBS=$PLATFORM_LIBS" >> $OUTPUT
sanjay@google.com99a75852012-04-17 15:48:25 +0000216echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUT
217echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUT
218echo "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUT
219echo "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUT
220echo "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUT
sanjay@google.com158f7672012-05-30 16:53:11 +0000221echo "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> $OUTPUT