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