gabor@google.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 1 | #!/bin/sh |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 2 | # |
sanjay@google.com | 99a7585 | 2012-04-17 15:48:25 +0000 | [diff] [blame] | 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. |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 5 | # |
sanjay@google.com | 99a7585 | 2012-04-17 15:48:25 +0000 | [diff] [blame] | 6 | # The output will set the following variables: |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 7 | # CC C Compiler path |
| 8 | # CXX C++ Compiler path |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 9 | # PLATFORM_LDFLAGS Linker flags |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 10 | # PLATFORM_LIBS Libraries flags |
sanjay@google.com | bf10812 | 2012-03-30 20:18:06 +0000 | [diff] [blame] | 11 | # PLATFORM_SHARED_EXT Extension for shared libraries |
| 12 | # PLATFORM_SHARED_LDFLAGS Flags for building shared library |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 13 | # This flag is embedded just before the name |
| 14 | # of the shared library without intervening spaces |
sanjay@google.com | bf10812 | 2012-03-30 20:18:06 +0000 | [diff] [blame] | 15 | # PLATFORM_SHARED_CFLAGS Flags for compiling objects for shared library |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 16 | # PLATFORM_CCFLAGS C compiler flags |
| 17 | # PLATFORM_CXXFLAGS C++ compiler flags. Will contain: |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 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 | # |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 27 | |
sanjay@google.com | 99a7585 | 2012-04-17 15:48:25 +0000 | [diff] [blame] | 28 | OUTPUT=$1 |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 29 | PREFIX=$2 |
| 30 | if test -z "$OUTPUT" || test -z "$PREFIX"; then |
| 31 | echo "usage: $0 <output-filename> <directory_prefix>" >&2 |
sanjay@google.com | 99a7585 | 2012-04-17 15:48:25 +0000 | [diff] [blame] | 32 | exit 1 |
| 33 | fi |
gabor@google.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 34 | |
sanjay@google.com | 99a7585 | 2012-04-17 15:48:25 +0000 | [diff] [blame] | 35 | # Delete existing output, if it exists |
| 36 | rm -f $OUTPUT |
| 37 | touch $OUTPUT |
gabor@google.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 38 | |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 39 | if test -z "$CC"; then |
| 40 | CC=cc |
| 41 | fi |
| 42 | |
hans@chromium.org | b14d5e1 | 2011-11-30 11:08:02 +0000 | [diff] [blame] | 43 | if test -z "$CXX"; then |
| 44 | CXX=g++ |
| 45 | fi |
| 46 | |
dgrogan@chromium.org | bd534e2 | 2013-05-15 00:06:55 +0000 | [diff] [blame] | 47 | if test -z "$TMPDIR"; then |
| 48 | TMPDIR=/tmp |
| 49 | fi |
| 50 | |
gabor@google.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 51 | # Detect OS |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 52 | if test -z "$TARGET_OS"; then |
| 53 | TARGET_OS=`uname -s` |
| 54 | fi |
| 55 | |
| 56 | COMMON_FLAGS= |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 57 | CROSS_COMPILE= |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 58 | PLATFORM_CCFLAGS= |
| 59 | PLATFORM_CXXFLAGS= |
| 60 | PLATFORM_LDFLAGS= |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 61 | PLATFORM_LIBS= |
sanjay@google.com | bf10812 | 2012-03-30 20:18:06 +0000 | [diff] [blame] | 62 | PLATFORM_SHARED_EXT="so" |
| 63 | PLATFORM_SHARED_LDFLAGS="-shared -Wl,-soname -Wl," |
| 64 | PLATFORM_SHARED_CFLAGS="-fPIC" |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 65 | PLATFORM_SHARED_VERSIONED=true |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 66 | |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 67 | MEMCMP_FLAG= |
| 68 | if [ "$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" |
| 72 | fi |
| 73 | |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 74 | case "$TARGET_OS" in |
gabor@google.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 75 | Darwin) |
| 76 | PLATFORM=OS_MACOSX |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 77 | COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX" |
sanjay@google.com | bf10812 | 2012-03-30 20:18:06 +0000 | [diff] [blame] | 78 | PLATFORM_SHARED_EXT=dylib |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 79 | [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd` |
| 80 | PLATFORM_SHARED_LDFLAGS="-dynamiclib -install_name $INSTALL_PATH/" |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 81 | PORT_FILE=port/port_posix.cc |
gabor@google.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 82 | ;; |
| 83 | Linux) |
| 84 | PLATFORM=OS_LINUX |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 85 | COMMON_FLAGS="$MEMCMP_FLAG -pthread -DOS_LINUX" |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 86 | PLATFORM_LDFLAGS="-pthread" |
| 87 | PORT_FILE=port/port_posix.cc |
gabor@google.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 88 | ;; |
| 89 | SunOS) |
| 90 | PLATFORM=OS_SOLARIS |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 91 | COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_SOLARIS" |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 92 | PLATFORM_LIBS="-lpthread -lrt" |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 93 | PORT_FILE=port/port_posix.cc |
gabor@google.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 94 | ;; |
gabor@google.com | fcd2d56 | 2011-07-27 01:46:25 +0000 | [diff] [blame] | 95 | FreeBSD) |
| 96 | PLATFORM=OS_FREEBSD |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 97 | COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_FREEBSD" |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 98 | PLATFORM_LIBS="-lpthread" |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 99 | PORT_FILE=port/port_posix.cc |
gabor@google.com | fcd2d56 | 2011-07-27 01:46:25 +0000 | [diff] [blame] | 100 | ;; |
sanjay@google.com | 3366031 | 2012-03-05 18:38:07 +0000 | [diff] [blame] | 101 | NetBSD) |
| 102 | PLATFORM=OS_NETBSD |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 103 | COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_NETBSD" |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 104 | PLATFORM_LIBS="-lpthread -lgcc_s" |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 105 | PORT_FILE=port/port_posix.cc |
sanjay@google.com | 3366031 | 2012-03-05 18:38:07 +0000 | [diff] [blame] | 106 | ;; |
| 107 | OpenBSD) |
| 108 | PLATFORM=OS_OPENBSD |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 109 | COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_OPENBSD" |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 110 | PLATFORM_LDFLAGS="-pthread" |
| 111 | PORT_FILE=port/port_posix.cc |
sanjay@google.com | 3366031 | 2012-03-05 18:38:07 +0000 | [diff] [blame] | 112 | ;; |
| 113 | DragonFly) |
| 114 | PLATFORM=OS_DRAGONFLYBSD |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 115 | COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_DRAGONFLYBSD" |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 116 | PLATFORM_LIBS="-lpthread" |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 117 | PORT_FILE=port/port_posix.cc |
| 118 | ;; |
| 119 | OS_ANDROID_CROSSCOMPILE) |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 120 | PLATFORM=OS_ANDROID |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 121 | COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_ANDROID -DLEVELDB_PLATFORM_POSIX" |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 122 | PLATFORM_LDFLAGS="" # All pthread features are in the Android C library |
| 123 | PORT_FILE=port/port_posix.cc |
| 124 | CROSS_COMPILE=true |
sanjay@google.com | 3366031 | 2012-03-05 18:38:07 +0000 | [diff] [blame] | 125 | ;; |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 126 | 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.org | 4935bf0 | 2013-12-10 19:01:22 +0000 | [diff] [blame] | 134 | 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.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 144 | *) |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 145 | echo "Unknown platform!" >&2 |
gabor@google.com | 9cb7b73 | 2011-06-29 00:30:50 +0000 | [diff] [blame] | 146 | exit 1 |
| 147 | esac |
| 148 | |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 149 | # 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.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 153 | DIRS="$PREFIX/db $PREFIX/util $PREFIX/table" |
| 154 | |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 155 | set -f # temporarily disable globbing so that our patterns aren't expanded |
| 156 | PRUNE_TEST="-name *test*.cc -prune" |
| 157 | PRUNE_BENCH="-name *_bench.cc -prune" |
sanjay@google.com | a842f7e | 2012-12-27 18:43:59 +0000 | [diff] [blame] | 158 | PRUNE_TOOL="-name leveldb_main.cc -prune" |
| 159 | PORTABLE_FILES=`find $DIRS $PRUNE_TEST -o $PRUNE_BENCH -o $PRUNE_TOOL -o -name '*.cc' -print | sort | sed "s,^$PREFIX/,," | tr "\n" " "` |
dgrogan@chromium.org | 29c68f1 | 2012-10-12 19:13:17 +0000 | [diff] [blame] | 160 | |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 161 | set +f # re-enable globbing |
| 162 | |
| 163 | # The sources consist of the portable files, plus the platform-specific port |
| 164 | # file. |
sanjay@google.com | 99a7585 | 2012-04-17 15:48:25 +0000 | [diff] [blame] | 165 | echo "SOURCES=$PORTABLE_FILES $PORT_FILE" >> $OUTPUT |
| 166 | echo "MEMENV_SOURCES=helpers/memenv/memenv.cc" >> $OUTPUT |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 167 | |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 168 | if [ "$CROSS_COMPILE" = "true" ]; then |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 169 | # Cross-compiling; do not try any compilation tests. |
| 170 | true |
| 171 | else |
dgrogan@chromium.org | bd534e2 | 2013-05-15 00:06:55 +0000 | [diff] [blame] | 172 | CXXOUTPUT="${TMPDIR}/leveldb_build_detect_platform-cxx.$$" |
| 173 | |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 174 | # If -std=c++0x works, use <cstdatomic>. Otherwise use port_posix.h. |
dgrogan@chromium.org | bd534e2 | 2013-05-15 00:06:55 +0000 | [diff] [blame] | 175 | $CXX $CXXFLAGS -std=c++0x -x c++ - -o $CXXOUTPUT 2>/dev/null <<EOF |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 176 | #include <cstdatomic> |
| 177 | int main() {} |
| 178 | EOF |
| 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.org | bd534e2 | 2013-05-15 00:06:55 +0000 | [diff] [blame] | 188 | $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT 2>/dev/null <<EOF |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 189 | #include <snappy.h> |
| 190 | int main() {} |
| 191 | EOF |
| 192 | if [ "$?" = 0 ]; then |
| 193 | COMMON_FLAGS="$COMMON_FLAGS -DSNAPPY" |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 194 | PLATFORM_LIBS="$PLATFORM_LIBS -lsnappy" |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 195 | fi |
| 196 | |
| 197 | # Test whether tcmalloc is available |
dgrogan@chromium.org | bd534e2 | 2013-05-15 00:06:55 +0000 | [diff] [blame] | 198 | $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -ltcmalloc 2>/dev/null <<EOF |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 199 | int main() {} |
| 200 | EOF |
| 201 | if [ "$?" = 0 ]; then |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 202 | PLATFORM_LIBS="$PLATFORM_LIBS -ltcmalloc" |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 203 | fi |
dgrogan@chromium.org | bd534e2 | 2013-05-15 00:06:55 +0000 | [diff] [blame] | 204 | |
| 205 | rm -f $CXXOUTPUT 2>/dev/null |
sanjay@google.com | d44dcce | 2012-03-21 17:32:19 +0000 | [diff] [blame] | 206 | fi |
| 207 | |
| 208 | PLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS" |
| 209 | PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS" |
| 210 | |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 211 | echo "CC=$CC" >> $OUTPUT |
| 212 | echo "CXX=$CXX" >> $OUTPUT |
sanjay@google.com | 99a7585 | 2012-04-17 15:48:25 +0000 | [diff] [blame] | 213 | echo "PLATFORM=$PLATFORM" >> $OUTPUT |
| 214 | echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUT |
sanjay@google.com | b0edd03 | 2012-10-16 23:22:36 +0000 | [diff] [blame] | 215 | echo "PLATFORM_LIBS=$PLATFORM_LIBS" >> $OUTPUT |
sanjay@google.com | 99a7585 | 2012-04-17 15:48:25 +0000 | [diff] [blame] | 216 | echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUT |
| 217 | echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUT |
| 218 | echo "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUT |
| 219 | echo "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUT |
| 220 | echo "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUT |
sanjay@google.com | 158f767 | 2012-05-30 16:53:11 +0000 | [diff] [blame] | 221 | echo "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> $OUTPUT |