249 lines
9.6 KiB
Diff
249 lines
9.6 KiB
Diff
From d35dfeba58ea107b25ea73f9aa1f873461bac169 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?=C8=98tefan=20Talpalaru?= <stefantalpalaru@yahoo.com>
|
|
Date: Thu, 24 Mar 2022 10:39:21 +0100
|
|
Subject: [PATCH] Makefile: support Mingw + more cross-compilation
|
|
|
|
Tested on an Ubuntu 20.04 host, targeting:
|
|
- Linux ARM64, using aarch64-linux-gnu-g++
|
|
- macOS AMD64 and ARM64, using https://github.com/tpoechtrager/osxcross
|
|
- Windows AMD64, using Mingw-w64 from https://github.com/mxe/mxe
|
|
|
|
"build_tools/build_detect_platform" and "Makefile" have been partially
|
|
cleaned, in the process. There is more stuff left to clean there.
|
|
|
|
The Makefile now passes more command line arguments to the detection
|
|
script via environment variables.
|
|
---
|
|
HISTORY.md | 4 ++
|
|
INSTALL.md | 16 ++++++
|
|
Makefile | 87 +++++++++++++++++--------------
|
|
build_tools/build_detect_platform | 39 +++++++-------
|
|
4 files changed, 90 insertions(+), 56 deletions(-)
|
|
|
|
diff --git a/Makefile b/Makefile
|
|
index a1d0a3303..befb279e2 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -118,16 +118,19 @@ OPT += -momit-leaf-frame-pointer
|
|
endif
|
|
endif
|
|
|
|
-ifeq (,$(shell $(CXX) -fsyntax-only -maltivec -xc /dev/null 2>&1))
|
|
-CXXFLAGS += -DHAS_ALTIVEC
|
|
-CFLAGS += -DHAS_ALTIVEC
|
|
-HAS_ALTIVEC=1
|
|
-endif
|
|
+# A cross-compiler can support PPC, even though that's not our target.
|
|
+ifneq ($(CROSS_COMPILE), true)
|
|
+ ifeq (,$(shell $(CXX) -fsyntax-only -maltivec -xc /dev/null 2>&1))
|
|
+ CXXFLAGS += -DHAS_ALTIVEC
|
|
+ CFLAGS += -DHAS_ALTIVEC
|
|
+ HAS_ALTIVEC=1
|
|
+ endif
|
|
|
|
-ifeq (,$(shell $(CXX) -fsyntax-only -mcpu=power8 -xc /dev/null 2>&1))
|
|
-CXXFLAGS += -DHAVE_POWER8
|
|
-CFLAGS += -DHAVE_POWER8
|
|
-HAVE_POWER8=1
|
|
+ ifeq (,$(shell $(CXX) -fsyntax-only -mcpu=power8 -xc /dev/null 2>&1))
|
|
+ CXXFLAGS += -DHAVE_POWER8
|
|
+ CFLAGS += -DHAVE_POWER8
|
|
+ HAVE_POWER8=1
|
|
+ endif
|
|
endif
|
|
|
|
# if we're compiling for shared libraries, add the shared flags
|
|
@@ -136,34 +139,31 @@ CXXFLAGS += $(PLATFORM_SHARED_CFLAGS) -DROCKSDB_DLL
|
|
CFLAGS += $(PLATFORM_SHARED_CFLAGS) -DROCKSDB_DLL
|
|
endif
|
|
|
|
-# if we're compiling for release, compile without debug code (-DNDEBUG)
|
|
-ifeq ($(DEBUG_LEVEL),0)
|
|
-OPT += -DNDEBUG
|
|
-
|
|
-ifneq ($(USE_RTTI), 1)
|
|
- CXXFLAGS += -fno-rtti
|
|
-else
|
|
- CXXFLAGS += -DROCKSDB_USE_RTTI
|
|
-endif
|
|
-else
|
|
-ifneq ($(USE_RTTI), 0)
|
|
- CXXFLAGS += -DROCKSDB_USE_RTTI
|
|
+ifeq ($(DEBUG_LEVEL),0) # release build
|
|
+ # if we're compiling for release, compile without debug code (-DNDEBUG)
|
|
+ OPT += -DNDEBUG
|
|
+ USE_RTTI := 0
|
|
+else # debug build
|
|
+ USE_RTTI := 1
|
|
+
|
|
+ ifdef ASSERT_STATUS_CHECKED
|
|
+ # For ASC, turn off constructor elision, preventing the case where a constructor returned
|
|
+ # by a method may pass the ASC check if the status is checked in the inner method. Forcing
|
|
+ # the copy constructor to be invoked disables the optimization and will cause the calling method
|
|
+ # to check the status in order to prevent an error from being raised.
|
|
+ PLATFORM_CXXFLAGS += -fno-elide-constructors
|
|
+ ifeq ($(filter -DROCKSDB_ASSERT_STATUS_CHECKED,$(OPT)),)
|
|
+ OPT += -DROCKSDB_ASSERT_STATUS_CHECKED
|
|
+ endif
|
|
+ endif
|
|
+
|
|
+ $(warning Warning: Compiling in debug mode. Don't use the resulting binary in production)
|
|
+endif # DEBUG_LEVEL
|
|
+
|
|
+ifeq ($(USE_RTTI), 0)
|
|
+ CXXFLAGS += -fno-rtti
|
|
else
|
|
- CXXFLAGS += -fno-rtti
|
|
-endif
|
|
-
|
|
-ifdef ASSERT_STATUS_CHECKED
|
|
-# For ASC, turn off constructor elision, preventing the case where a constructor returned
|
|
-# by a method may pass the ASC check if the status is checked in the inner method. Forcing
|
|
-# the copy constructor to be invoked disables the optimization and will cause the calling method
|
|
-# to check the status in order to prevent an error from being raised.
|
|
-PLATFORM_CXXFLAGS += -fno-elide-constructors
|
|
-ifeq ($(filter -DROCKSDB_ASSERT_STATUS_CHECKED,$(OPT)),)
|
|
- OPT += -DROCKSDB_ASSERT_STATUS_CHECKED
|
|
-endif
|
|
-endif
|
|
-
|
|
-$(warning Warning: Compiling in debug mode. Don't use the resulting binary in production)
|
|
+ CXXFLAGS += -DROCKSDB_USE_RTTI
|
|
endif
|
|
|
|
# `USE_LTO=1` enables link-time optimizations. Among other things, this enables
|
|
@@ -217,12 +217,18 @@ AM_SHARE = $(AM_V_CCLD) $(CXX) $(PLATFORM_SHARED_LDFLAGS)$@ -L. $(patsubst lib%.
|
|
# Export some common variables that might have been passed as Make variables
|
|
# instead of environment variables.
|
|
dummy := $(shell (export ROCKSDB_ROOT="$(CURDIR)"; \
|
|
- export CXXFLAGS="$(EXTRA_CXXFLAGS)"; \
|
|
- export LDFLAGS="$(EXTRA_LDFLAGS)"; \
|
|
+ export CC="$(CC)"; \
|
|
+ export CXX="$(CXX)"; \
|
|
+ export AR="$(AR)"; \
|
|
+ export CFLAGS="$(CFLAGS)"; \
|
|
+ export CXXFLAGS="$(CXXFLAGS)"; \
|
|
export COMPILE_WITH_ASAN="$(COMPILE_WITH_ASAN)"; \
|
|
export COMPILE_WITH_TSAN="$(COMPILE_WITH_TSAN)"; \
|
|
export COMPILE_WITH_UBSAN="$(COMPILE_WITH_UBSAN)"; \
|
|
export PORTABLE="$(PORTABLE)"; \
|
|
+ export CROSS_COMPILE="$(CROSS_COMPILE)"; \
|
|
+ export TARGET_OS="$(TARGET_OS)"; \
|
|
+ export TARGET_ARCHITECTURE="$(TARGET_ARCHITECTURE)"; \
|
|
export ROCKSDB_NO_FBCODE="$(ROCKSDB_NO_FBCODE)"; \
|
|
export USE_CLANG="$(USE_CLANG)"; \
|
|
export LIB_MODE="$(LIB_MODE)"; \
|
|
@@ -504,6 +510,11 @@ ifeq ($(NO_THREEWAY_CRC32C), 1)
|
|
CXXFLAGS += -DNO_THREEWAY_CRC32C
|
|
endif
|
|
|
|
+# The original CFLAGS and CXXFLAGS have already been included in
|
|
+# PLATFORM_CCFLAGS and PLATFORM_CXXFLAGS, but we can't avoid the duplication
|
|
+# here because more parameters have been appended in the mean time.
|
|
+# TODO: move all the new flags to PLATFORM_* after "make_config.mk" is
|
|
+# included, so we can := instead of += here.
|
|
CFLAGS += $(C_WARNING_FLAGS) $(WARNING_FLAGS) -I. -I./include $(PLATFORM_CCFLAGS) $(OPT)
|
|
CXXFLAGS += $(WARNING_FLAGS) -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT) -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers
|
|
|
|
diff --git a/build_tools/build_detect_platform b/build_tools/build_detect_platform
|
|
index 4dc9dd31b..da4b50c69 100755
|
|
--- a/build_tools/build_detect_platform
|
|
+++ b/build_tools/build_detect_platform
|
|
@@ -45,16 +45,15 @@ if test -z "$OUTPUT"; then
|
|
exit 1
|
|
fi
|
|
|
|
+PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS ${CXXFLAGS}"
|
|
+
|
|
# we depend on C++17, but should be compatible with newer standards
|
|
if [ "$ROCKSDB_CXX_STANDARD" ]; then
|
|
- PLATFORM_CXXFLAGS="-std=$ROCKSDB_CXX_STANDARD"
|
|
+ PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS -std=$ROCKSDB_CXX_STANDARD"
|
|
else
|
|
- PLATFORM_CXXFLAGS="-std=c++17"
|
|
+ PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS -std=c++17"
|
|
fi
|
|
|
|
-# we currently depend on POSIX platform
|
|
-COMMON_FLAGS="-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX"
|
|
-
|
|
# Default to fbcode gcc on internal fb machines
|
|
if [ -z "$ROCKSDB_NO_FBCODE" -a -d /mnt/gvfs/third-party ]; then
|
|
FBCODE_BUILD="true"
|
|
@@ -136,10 +135,11 @@ if test -z "$WATCH"; then
|
|
WATCH=watch
|
|
fi
|
|
|
|
-COMMON_FLAGS="$COMMON_FLAGS ${CFLAGS}"
|
|
-CROSS_COMPILE=
|
|
-PLATFORM_CCFLAGS=
|
|
-PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS"
|
|
+if [[ ! "$TARGET_OS" =~ MINGW ]]; then
|
|
+ COMMON_FLAGS="-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX"
|
|
+fi
|
|
+
|
|
+PLATFORM_CCFLAGS="${CFLAGS}"
|
|
PLATFORM_SHARED_EXT="so"
|
|
PLATFORM_SHARED_LDFLAGS="-Wl,--no-as-needed -shared -Wl,-soname -Wl,"
|
|
PLATFORM_SHARED_CFLAGS="-fPIC"
|
|
@@ -249,7 +249,7 @@ EOF
|
|
Cygwin)
|
|
PLATFORM=CYGWIN
|
|
PLATFORM_SHARED_CFLAGS=""
|
|
- PLATFORM_CXXFLAGS="-std=gnu++11"
|
|
+ #PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS -std=gnu++11"
|
|
COMMON_FLAGS="$COMMON_FLAGS -DCYGWIN"
|
|
if [ -z "$USE_CLANG" ]; then
|
|
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp"
|
|
@@ -259,6 +259,10 @@ EOF
|
|
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread -lrt"
|
|
# PORT_FILES=port/linux/linux_specific.cc
|
|
;;
|
|
+ MINGW*)
|
|
+ PLATFORM=MINGW
|
|
+ COMMON_FLAGS="$COMMON_FLAGS -DWIN32 -DOS_WIN -D_MBCS -DWIN64 -DNOMINMAX -D_WIN32_WINNT=_WIN32_WINNT_VISTA -D_POSIX_C_SOURCE=1"
|
|
+ ;;
|
|
OS_ANDROID_CROSSCOMPILE)
|
|
PLATFORM=OS_ANDROID
|
|
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_ANDROID -DROCKSDB_PLATFORM_POSIX"
|
|
@@ -271,7 +275,6 @@ EOF
|
|
exit 1
|
|
esac
|
|
|
|
-PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS ${CXXFLAGS}"
|
|
JAVA_LDFLAGS="$PLATFORM_LDFLAGS"
|
|
JAVA_STATIC_LDFLAGS="$PLATFORM_LDFLAGS"
|
|
JAVAC_ARGS="-source 8"
|
|
@@ -416,7 +419,7 @@ EOF
|
|
|
|
if ! test $ROCKSDB_DISABLE_TBB; then
|
|
# Test whether tbb is available
|
|
- $CXX $PLATFORM_CXXFLAGS $LDFLAGS -x c++ - -o test.o -ltbb 2>/dev/null <<EOF
|
|
+ $CXX $PLATFORM_CXXFLAGS -x c++ - -o test.o -ltbb 2>/dev/null <<EOF
|
|
#include <tbb/tbb.h>
|
|
int main() {}
|
|
EOF
|
|
@@ -667,13 +670,13 @@ else
|
|
fi
|
|
|
|
if [[ "${PLATFORM}" == "OS_MACOSX" ]]; then
|
|
- # For portability compile for macOS 10.12 (2016) or newer
|
|
- COMMON_FLAGS="$COMMON_FLAGS -mmacosx-version-min=10.12"
|
|
- PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -mmacosx-version-min=10.12"
|
|
+ # For portability compile for macOS 10.14 (2018) or newer
|
|
+ COMMON_FLAGS="$COMMON_FLAGS -mmacosx-version-min=10.14"
|
|
+ PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -mmacosx-version-min=10.14"
|
|
# -mmacosx-version-min must come first here.
|
|
- PLATFORM_SHARED_LDFLAGS="-mmacosx-version-min=10.12 $PLATFORM_SHARED_LDFLAGS"
|
|
- PLATFORM_CMAKE_FLAGS="-DCMAKE_OSX_DEPLOYMENT_TARGET=10.12"
|
|
- JAVA_STATIC_DEPS_COMMON_FLAGS="-mmacosx-version-min=10.12"
|
|
+ PLATFORM_SHARED_LDFLAGS="-mmacosx-version-min=10.14 $PLATFORM_SHARED_LDFLAGS"
|
|
+ PLATFORM_CMAKE_FLAGS="-DCMAKE_OSX_DEPLOYMENT_TARGET=10.14"
|
|
+ JAVA_STATIC_DEPS_COMMON_FLAGS="-mmacosx-version-min=10.14"
|
|
JAVA_STATIC_DEPS_LDFLAGS="$JAVA_STATIC_DEPS_COMMON_FLAGS"
|
|
JAVA_STATIC_DEPS_CCFLAGS="$JAVA_STATIC_DEPS_COMMON_FLAGS"
|
|
JAVA_STATIC_DEPS_CXXFLAGS="$JAVA_STATIC_DEPS_COMMON_FLAGS"
|
|
--
|
|
2.35.1
|
|
|