xref: /leveldb-1.20/build_detect_platform (revision ea175e28)
1f57e2335S[email protected]#!/bin/sh
2a1ad4d19SSanjay Ghemawat#
385584d49SSanjay Ghemawat# Detects OS we're compiling on and outputs a file specified by the first
485584d49SSanjay Ghemawat# argument, which in turn gets read while processing Makefile.
5a1ad4d19SSanjay Ghemawat#
685584d49SSanjay Ghemawat# The output will set the following variables:
7075a35a6SSanjay Ghemawat#   CC                          C Compiler path
8075a35a6SSanjay Ghemawat#   CXX                         C++ Compiler path
9a1ad4d19SSanjay Ghemawat#   PLATFORM_LDFLAGS            Linker flags
1040768657SSanjay Ghemawat#   PLATFORM_LIBS               Libraries flags
11bc1ee4d2SSanjay Ghemawat#   PLATFORM_SHARED_EXT         Extension for shared libraries
12bc1ee4d2SSanjay Ghemawat#   PLATFORM_SHARED_LDFLAGS     Flags for building shared library
1340768657SSanjay Ghemawat#                               This flag is embedded just before the name
1440768657SSanjay Ghemawat#                               of the shared library without intervening spaces
15bc1ee4d2SSanjay Ghemawat#   PLATFORM_SHARED_CFLAGS      Flags for compiling objects for shared library
16a1ad4d19SSanjay Ghemawat#   PLATFORM_CCFLAGS            C compiler flags
17a1ad4d19SSanjay Ghemawat#   PLATFORM_CXXFLAGS           C++ compiler flags.  Will contain:
18075a35a6SSanjay Ghemawat#   PLATFORM_SHARED_VERSIONED   Set to 'true' if platform supports versioned
19075a35a6SSanjay Ghemawat#                               shared libraries, empty otherwise.
20075a35a6SSanjay Ghemawat#
21075a35a6SSanjay Ghemawat# The PLATFORM_CCFLAGS and PLATFORM_CXXFLAGS might include the following:
22075a35a6SSanjay Ghemawat#
23803d6920SChris Mumford#       -DLEVELDB_ATOMIC_PRESENT     if <atomic> is present
24075a35a6SSanjay Ghemawat#       -DLEVELDB_PLATFORM_POSIX     for Posix-based platforms
25075a35a6SSanjay Ghemawat#       -DSNAPPY                     if the Snappy library is present
26075a35a6SSanjay Ghemawat#
27a1ad4d19SSanjay Ghemawat
2885584d49SSanjay GhemawatOUTPUT=$1
29946e5b5aSDavid GroganPREFIX=$2
30946e5b5aSDavid Groganif test -z "$OUTPUT" || test -z "$PREFIX"; then
31946e5b5aSDavid Grogan  echo "usage: $0 <output-filename> <directory_prefix>" >&2
3285584d49SSanjay Ghemawat  exit 1
3385584d49SSanjay Ghemawatfi
34f57e2335S[email protected]
3585584d49SSanjay Ghemawat# Delete existing output, if it exists
3685584d49SSanjay Ghemawatrm -f $OUTPUT
3785584d49SSanjay Ghemawattouch $OUTPUT
38f57e2335S[email protected]
39075a35a6SSanjay Ghemawatif test -z "$CC"; then
40075a35a6SSanjay Ghemawat    CC=cc
41075a35a6SSanjay Ghemawatfi
42075a35a6SSanjay Ghemawat
43c8c5866aSHans Wennborgif test -z "$CXX"; then
44c8c5866aSHans Wennborg    CXX=g++
45c8c5866aSHans Wennborgfi
46c8c5866aSHans Wennborg
4728dad918SDavid Groganif test -z "$TMPDIR"; then
4828dad918SDavid Grogan    TMPDIR=/tmp
4928dad918SDavid Groganfi
5028dad918SDavid Grogan
51f57e2335S[email protected]# Detect OS
52a1ad4d19SSanjay Ghemawatif test -z "$TARGET_OS"; then
53a1ad4d19SSanjay Ghemawat    TARGET_OS=`uname -s`
54a1ad4d19SSanjay Ghemawatfi
55a1ad4d19SSanjay Ghemawat
56a1ad4d19SSanjay GhemawatCOMMON_FLAGS=
57075a35a6SSanjay GhemawatCROSS_COMPILE=
58a1ad4d19SSanjay GhemawatPLATFORM_CCFLAGS=
59a1ad4d19SSanjay GhemawatPLATFORM_CXXFLAGS=
60a1ad4d19SSanjay GhemawatPLATFORM_LDFLAGS=
6140768657SSanjay GhemawatPLATFORM_LIBS=
62bc1ee4d2SSanjay GhemawatPLATFORM_SHARED_EXT="so"
63bc1ee4d2SSanjay GhemawatPLATFORM_SHARED_LDFLAGS="-shared -Wl,-soname -Wl,"
64bc1ee4d2SSanjay GhemawatPLATFORM_SHARED_CFLAGS="-fPIC"
65075a35a6SSanjay GhemawatPLATFORM_SHARED_VERSIONED=true
66*ea175e28ScostanPLATFORM_SSEFLAGS=
67a1ad4d19SSanjay Ghemawat
68946e5b5aSDavid GroganMEMCMP_FLAG=
69946e5b5aSDavid Groganif [ "$CXX" = "g++" ]; then
70946e5b5aSDavid Grogan    # Use libc's memcmp instead of GCC's memcmp.  This results in ~40%
71946e5b5aSDavid Grogan    # performance improvement on readrandom under gcc 4.4.3 on Linux/x86.
72946e5b5aSDavid Grogan    MEMCMP_FLAG="-fno-builtin-memcmp"
73946e5b5aSDavid Groganfi
74946e5b5aSDavid Grogan
75a1ad4d19SSanjay Ghemawatcase "$TARGET_OS" in
76803d6920SChris Mumford    CYGWIN_*)
77803d6920SChris Mumford        PLATFORM=OS_LINUX
78803d6920SChris Mumford        COMMON_FLAGS="$MEMCMP_FLAG -lpthread -DOS_LINUX -DCYGWIN"
79803d6920SChris Mumford        PLATFORM_LDFLAGS="-lpthread"
80803d6920SChris Mumford        PORT_FILE=port/port_posix.cc
81*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
82803d6920SChris Mumford        ;;
83f57e2335S[email protected]    Darwin)
84f57e2335S[email protected]        PLATFORM=OS_MACOSX
85946e5b5aSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX"
86bc1ee4d2SSanjay Ghemawat        PLATFORM_SHARED_EXT=dylib
8740768657SSanjay Ghemawat        [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd`
8840768657SSanjay Ghemawat        PLATFORM_SHARED_LDFLAGS="-dynamiclib -install_name $INSTALL_PATH/"
89a1ad4d19SSanjay Ghemawat        PORT_FILE=port/port_posix.cc
90*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
91f57e2335S[email protected]        ;;
92f57e2335S[email protected]    Linux)
93f57e2335S[email protected]        PLATFORM=OS_LINUX
94946e5b5aSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -pthread -DOS_LINUX"
95a1ad4d19SSanjay Ghemawat        PLATFORM_LDFLAGS="-pthread"
96a1ad4d19SSanjay Ghemawat        PORT_FILE=port/port_posix.cc
97*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
98f57e2335S[email protected]        ;;
99f57e2335S[email protected]    SunOS)
100f57e2335S[email protected]        PLATFORM=OS_SOLARIS
101946e5b5aSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_SOLARIS"
10240768657SSanjay Ghemawat        PLATFORM_LIBS="-lpthread -lrt"
103a1ad4d19SSanjay Ghemawat        PORT_FILE=port/port_posix.cc
104*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
105f57e2335S[email protected]        ;;
106f122c6dfS[email protected]    FreeBSD)
107f122c6dfS[email protected]        PLATFORM=OS_FREEBSD
108946e5b5aSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_FREEBSD"
10940768657SSanjay Ghemawat        PLATFORM_LIBS="-lpthread"
110a1ad4d19SSanjay Ghemawat        PORT_FILE=port/port_posix.cc
111*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
112f122c6dfS[email protected]        ;;
113015d26f8SSanjay Ghemawat    NetBSD)
114015d26f8SSanjay Ghemawat        PLATFORM=OS_NETBSD
115946e5b5aSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_NETBSD"
11640768657SSanjay Ghemawat        PLATFORM_LIBS="-lpthread -lgcc_s"
117a1ad4d19SSanjay Ghemawat        PORT_FILE=port/port_posix.cc
118*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
119015d26f8SSanjay Ghemawat        ;;
120015d26f8SSanjay Ghemawat    OpenBSD)
121015d26f8SSanjay Ghemawat        PLATFORM=OS_OPENBSD
122946e5b5aSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_OPENBSD"
123a1ad4d19SSanjay Ghemawat        PLATFORM_LDFLAGS="-pthread"
124a1ad4d19SSanjay Ghemawat        PORT_FILE=port/port_posix.cc
125*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
126015d26f8SSanjay Ghemawat        ;;
127015d26f8SSanjay Ghemawat    DragonFly)
128015d26f8SSanjay Ghemawat        PLATFORM=OS_DRAGONFLYBSD
129946e5b5aSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_DRAGONFLYBSD"
13040768657SSanjay Ghemawat        PLATFORM_LIBS="-lpthread"
131a1ad4d19SSanjay Ghemawat        PORT_FILE=port/port_posix.cc
132*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
133a1ad4d19SSanjay Ghemawat        ;;
134a1ad4d19SSanjay Ghemawat    OS_ANDROID_CROSSCOMPILE)
135075a35a6SSanjay Ghemawat        PLATFORM=OS_ANDROID
136946e5b5aSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_ANDROID -DLEVELDB_PLATFORM_POSIX"
137075a35a6SSanjay Ghemawat        PLATFORM_LDFLAGS=""  # All pthread features are in the Android C library
138075a35a6SSanjay Ghemawat        PORT_FILE=port/port_posix.cc
139*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
140075a35a6SSanjay Ghemawat        CROSS_COMPILE=true
141015d26f8SSanjay Ghemawat        ;;
142946e5b5aSDavid Grogan    HP-UX)
143946e5b5aSDavid Grogan        PLATFORM=OS_HPUX
144946e5b5aSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_HPUX"
145946e5b5aSDavid Grogan        PLATFORM_LDFLAGS="-pthread"
146946e5b5aSDavid Grogan        PORT_FILE=port/port_posix.cc
147*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
148946e5b5aSDavid Grogan        # man ld: +h internal_name
149946e5b5aSDavid Grogan        PLATFORM_SHARED_LDFLAGS="-shared -Wl,+h -Wl,"
150946e5b5aSDavid Grogan        ;;
1510cfb990dSDavid Grogan    IOS)
1520cfb990dSDavid Grogan        PLATFORM=IOS
1530cfb990dSDavid Grogan        COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX"
1540cfb990dSDavid Grogan        [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd`
1550cfb990dSDavid Grogan        PORT_FILE=port/port_posix.cc
156*ea175e28Scostan        PORT_SSE_FILE=port/port_posix_sse.cc
1570cfb990dSDavid Grogan        PLATFORM_SHARED_EXT=
1580cfb990dSDavid Grogan        PLATFORM_SHARED_LDFLAGS=
1590cfb990dSDavid Grogan        PLATFORM_SHARED_CFLAGS=
1600cfb990dSDavid Grogan        PLATFORM_SHARED_VERSIONED=
1610cfb990dSDavid Grogan        ;;
162f57e2335S[email protected]    *)
163075a35a6SSanjay Ghemawat        echo "Unknown platform!" >&2
164f57e2335S[email protected]        exit 1
165f57e2335S[email protected]esac
166f57e2335S[email protected]
167a1ad4d19SSanjay Ghemawat# We want to make a list of all cc files within util, db, table, and helpers
168a1ad4d19SSanjay Ghemawat# except for the test and benchmark files. By default, find will output a list
169a1ad4d19SSanjay Ghemawat# of all files matching either rule, so we need to append -print to make the
170a1ad4d19SSanjay Ghemawat# prune take effect.
171946e5b5aSDavid GroganDIRS="$PREFIX/db $PREFIX/util $PREFIX/table"
172946e5b5aSDavid Grogan
173a1ad4d19SSanjay Ghemawatset -f # temporarily disable globbing so that our patterns aren't expanded
174a1ad4d19SSanjay GhemawatPRUNE_TEST="-name *test*.cc -prune"
175a1ad4d19SSanjay GhemawatPRUNE_BENCH="-name *_bench.cc -prune"
176adbe3eb0ScmumfordPRUNE_TOOL="-name leveldbutil.cc -prune"
177ea2e9195SSanjay GhemawatPORTABLE_FILES=`find $DIRS $PRUNE_TEST -o $PRUNE_BENCH -o $PRUNE_TOOL -o -name '*.cc' -print | sort | sed "s,^$PREFIX/,," | tr "\n" " "`
178946e5b5aSDavid Grogan
179a1ad4d19SSanjay Ghemawatset +f # re-enable globbing
180f57e2335S[email protected]
181a1ad4d19SSanjay Ghemawat# The sources consist of the portable files, plus the platform-specific port
182a1ad4d19SSanjay Ghemawat# file.
183*ea175e28Scostanecho "SOURCES=$PORTABLE_FILES $PORT_FILE $PORT_SSE_FILE" >> $OUTPUT
18485584d49SSanjay Ghemawatecho "MEMENV_SOURCES=helpers/memenv/memenv.cc" >> $OUTPUT
185f57e2335S[email protected]
186075a35a6SSanjay Ghemawatif [ "$CROSS_COMPILE" = "true" ]; then
187a1ad4d19SSanjay Ghemawat    # Cross-compiling; do not try any compilation tests.
188a1ad4d19SSanjay Ghemawat    true
189a1ad4d19SSanjay Ghemawatelse
19028dad918SDavid Grogan    CXXOUTPUT="${TMPDIR}/leveldb_build_detect_platform-cxx.$$"
19128dad918SDavid Grogan
192803d6920SChris Mumford    # If -std=c++0x works, use <atomic> as fallback for when memory barriers
193803d6920SChris Mumford    # are not available.
19428dad918SDavid Grogan    $CXX $CXXFLAGS -std=c++0x -x c++ - -o $CXXOUTPUT 2>/dev/null  <<EOF
195803d6920SChris Mumford      #include <atomic>
196f57e2335S[email protected]      int main() {}
197f57e2335S[email protected]EOF
198f57e2335S[email protected]    if [ "$?" = 0 ]; then
199803d6920SChris Mumford        COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT"
200a1ad4d19SSanjay Ghemawat        PLATFORM_CXXFLAGS="-std=c++0x"
201f57e2335S[email protected]    else
202a1ad4d19SSanjay Ghemawat        COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX"
203f57e2335S[email protected]    fi
204f57e2335S[email protected]
205f57e2335S[email protected]    # Test whether Snappy library is installed
206f57e2335S[email protected]    # http://code.google.com/p/snappy/
20728dad918SDavid Grogan    $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT 2>/dev/null  <<EOF
208f57e2335S[email protected]      #include <snappy.h>
209f57e2335S[email protected]      int main() {}
210f57e2335S[email protected]EOF
211f57e2335S[email protected]    if [ "$?" = 0 ]; then
212a1ad4d19SSanjay Ghemawat        COMMON_FLAGS="$COMMON_FLAGS -DSNAPPY"
21340768657SSanjay Ghemawat        PLATFORM_LIBS="$PLATFORM_LIBS -lsnappy"
214f57e2335S[email protected]    fi
215f57e2335S[email protected]
216a1ad4d19SSanjay Ghemawat    # Test whether tcmalloc is available
21728dad918SDavid Grogan    $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -ltcmalloc 2>/dev/null  <<EOF
218a1ad4d19SSanjay Ghemawat      int main() {}
219a1ad4d19SSanjay GhemawatEOF
220a1ad4d19SSanjay Ghemawat    if [ "$?" = 0 ]; then
22140768657SSanjay Ghemawat        PLATFORM_LIBS="$PLATFORM_LIBS -ltcmalloc"
222a1ad4d19SSanjay Ghemawat    fi
22328dad918SDavid Grogan
22428dad918SDavid Grogan    rm -f $CXXOUTPUT 2>/dev/null
225*ea175e28Scostan
226*ea175e28Scostan    # Test if gcc SSE 4.2 is supported
227*ea175e28Scostan    $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -msse4.2 2>/dev/null  <<EOF
228*ea175e28Scostan      int main() {}
229*ea175e28ScostanEOF
230*ea175e28Scostan    if [ "$?" = 0 ]; then
231*ea175e28Scostan        PLATFORM_SSEFLAGS="-msse4.2"
232*ea175e28Scostan    fi
233*ea175e28Scostan
234*ea175e28Scostan    rm -f $CXXOUTPUT 2>/dev/null
235*ea175e28Scostanfi
236*ea175e28Scostan
237*ea175e28Scostan# Use the SSE 4.2 CRC32C intrinsics iff runtime checks indicate compiler supports them.
238*ea175e28Scostanif [ -n "$PLATFORM_SSEFLAGS" ]; then
239*ea175e28Scostan    PLATFORM_SSEFLAGS="$PLATFORM_SSEFLAGS -DLEVELDB_PLATFORM_POSIX_SSE"
240a1ad4d19SSanjay Ghemawatfi
241a1ad4d19SSanjay Ghemawat
242a1ad4d19SSanjay GhemawatPLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS"
243a1ad4d19SSanjay GhemawatPLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS"
244a1ad4d19SSanjay Ghemawat
245075a35a6SSanjay Ghemawatecho "CC=$CC" >> $OUTPUT
246075a35a6SSanjay Ghemawatecho "CXX=$CXX" >> $OUTPUT
24785584d49SSanjay Ghemawatecho "PLATFORM=$PLATFORM" >> $OUTPUT
24885584d49SSanjay Ghemawatecho "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUT
24940768657SSanjay Ghemawatecho "PLATFORM_LIBS=$PLATFORM_LIBS" >> $OUTPUT
25085584d49SSanjay Ghemawatecho "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUT
25185584d49SSanjay Ghemawatecho "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUT
252*ea175e28Scostanecho "PLATFORM_SSEFLAGS=$PLATFORM_SSEFLAGS" >> $OUTPUT
25385584d49SSanjay Ghemawatecho "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUT
25485584d49SSanjay Ghemawatecho "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUT
25585584d49SSanjay Ghemawatecho "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUT
256075a35a6SSanjay Ghemawatecho "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> $OUTPUT
257