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