mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-01-09 11:55:57 +00:00
51bc1cf87f
* dist: precompiled binaries and Docker images The builds are reproducible, the binaries are portable and statically link librocksdb. This took some patching. Upstream PR: https://github.com/facebook/rocksdb/pull/9752 32-bit ARM is missing as a target because two different GCC versions fail with an ICE when trying to cross-compile RocksDB. Using Clang instead is too much trouble for a platform that nobody should be using anyway. (Clang doesn't come with its own target headers and libraries, can't be easily convinced to use the ones from GCC, so it needs an fs image from a 32-bit ARM distro - at which point I stopped caring). * CI: disable reproducibility test
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
|
|
|