xref: /leveldb-1.20/build_detect_platform (revision bc1ee4d2)
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