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