folly is an open-source C++ library developed and used at Facebook. Adding this package will enable adding further packages that depend on this. Depends on PR #7098, PR #7101, PR #7126, PR #7877 Maintainer: me Compile tested: openwrt-18.06 for ipq40xx, ipq806x, x86 and ar71xx Run tested: Tested on devices running on the above architectures. Verified that dependent packages can successfully build and run using the libfolly.so shared library. Signed-off-by: Amol Bhave <ambhave@fb.com>lilik-openwrt-22.03
@ -0,0 +1,54 @@ | |||||
include $(TOPDIR)/rules.mk | |||||
PKG_NAME:=libfolly | |||||
PKG_VERSION:=2019.05.06.00 | |||||
PKG_RELEASE:=1 | |||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz | |||||
PKG_SOURCE_URL:=https://codeload.github.com/facebook/folly/tar.gz/v$(PKG_VERSION)? | |||||
PKG_HASH:=59e88d792e4c917e2f37ac22c230af0056bce8aa7bacf2d9e94ceb177a7c1079 | |||||
PKG_BUILD_DIR:=$(BUILD_DIR)/folly-$(PKG_VERSION) | |||||
PKG_LICENSE:=Apache-2.0 | |||||
PKG_LICENSE_FILES:=LICENSE | |||||
include $(INCLUDE_DIR)/package.mk | |||||
include $(INCLUDE_DIR)/cmake.mk | |||||
PKG_BUILD_PARALLEL:=1 | |||||
CMAKE_OPTIONS:= \ | |||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \ | |||||
-DCXX_STD=gnu++14 \ | |||||
-DFOLLY_HAVE_UNALIGNED_ACCESS_EXITCODE=OFF \ | |||||
-DFOLLY_HAVE_LINUX_VDSO_EXITCODE=OFF \ | |||||
-DFOLLY_HAVE_WCHAR_SUPPORT_EXITCODE=OFF \ | |||||
-DHAVE_VSNPRINTF_ERRORS_EXITCODE=OFF \ | |||||
-DFOLLY_HAVE_XSI_STRERROR_R_EXITCODE=0 \ | |||||
-DBUILD_SHARED_LIBS=ON | |||||
CMAKE_INSTALL:=1 | |||||
define Package/libfolly | |||||
SECTION:=libs | |||||
CATEGORY:=Libraries | |||||
TITLE:=An open-source C++ library developed and used at Facebook. | |||||
URL:=https://github.com/facebook/folly | |||||
DEPENDS:=+libstdcpp +boost +boost-context +boost-system +boost-thread \ | |||||
+boost-date_time +boost-filesystem +boost-program_options +boost-regex \ | |||||
+libbz2 +libopenssl +libdouble-conversion +libevent2 +glog +zlib +libzstd \ | |||||
+gflags +libsodium +liblzma +libaio | |||||
endef | |||||
define Package/libfolly/description | |||||
An open-source C++ library developed and used at Facebook. | |||||
Folly (acronymed loosely after Facebook Open Source Library) is a library of | |||||
C++14 components designed with practicality and efficiency in mind. | |||||
Folly contains a variety of core library components used extensively at Facebook. | |||||
This package includes the shared library. | |||||
endef | |||||
define Package/libfolly/install | |||||
$(INSTALL_DIR) $(1)/usr/lib | |||||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/libfolly*.so* $(1)/usr/lib/ | |||||
endef | |||||
$(eval $(call BuildPackage,libfolly)) |
@ -0,0 +1,40 @@ | |||||
Index: folly-2019.05.06.00/CMakeLists.txt | |||||
=================================================================== | |||||
--- folly-2019.05.06.00.orig/CMakeLists.txt | |||||
+++ folly-2019.05.06.00/CMakeLists.txt | |||||
@@ -109,17 +109,19 @@ configure_file( | |||||
auto_sources(files "*.cpp" "RECURSE" "${FOLLY_DIR}") | |||||
auto_sources(hfiles "*.h" "RECURSE" "${FOLLY_DIR}") | |||||
+string(REPLACE + \\+ FOLLY_DIR_ESCAPED ${FOLLY_DIR}) | |||||
+ | |||||
# Exclude tests, benchmarks, and other standalone utility executables from the | |||||
# library sources. Test sources are listed separately below. | |||||
REMOVE_MATCHES_FROM_LISTS(files hfiles | |||||
MATCHES | |||||
- "^${FOLLY_DIR}/build/" | |||||
- "^${FOLLY_DIR}/experimental/exception_tracer/" | |||||
- "^${FOLLY_DIR}/experimental/pushmi/" | |||||
- "^${FOLLY_DIR}/futures/exercises/" | |||||
- "^${FOLLY_DIR}/logging/example/" | |||||
- "^${FOLLY_DIR}/(.*/)?test/" | |||||
- "^${FOLLY_DIR}/tools/" | |||||
+ "^${FOLLY_DIR_ESCAPED}/build/" | |||||
+ "^${FOLLY_DIR_ESCAPED}/experimental/exception_tracer/" | |||||
+ "^${FOLLY_DIR_ESCAPED}/experimental/pushmi/" | |||||
+ "^${FOLLY_DIR_ESCAPED}/futures/exercises/" | |||||
+ "^${FOLLY_DIR_ESCAPED}/logging/example/" | |||||
+ "^${FOLLY_DIR_ESCAPED}/(.*/)?test/" | |||||
+ "^${FOLLY_DIR_ESCAPED}/tools/" | |||||
"Benchmark.cpp$" | |||||
"Test.cpp$" | |||||
) | |||||
@@ -169,7 +171,7 @@ list(APPEND hfiles | |||||
if (NOT FOLLY_USE_SYMBOLIZER) | |||||
REMOVE_MATCHES_FROM_LISTS(files hfiles | |||||
MATCHES | |||||
- "^${FOLLY_DIR}/experimental/symbolizer/" | |||||
+ "^${FOLLY_DIR_ESCAPED}/experimental/symbolizer/" | |||||
) | |||||
list(REMOVE_ITEM files | |||||
${FOLLY_DIR}/SingletonStackTrace.cpp |
@ -0,0 +1,12 @@ | |||||
Index: folly-2019.05.06.00/folly/stats/detail/BufferedStat-defs.h | |||||
=================================================================== | |||||
--- folly-2019.05.06.00.orig/folly/stats/detail/BufferedStat-defs.h | |||||
+++ folly-2019.05.06.00/folly/stats/detail/BufferedStat-defs.h | |||||
@@ -74,7 +74,6 @@ void BufferedStat<DigestT, ClockT>::doUp | |||||
TimePoint now, | |||||
const std::unique_lock<SharedMutex>& g, | |||||
UpdateMode updateMode) { | |||||
- DCHECK(g.owns_lock()); | |||||
// Check that no other thread has performed the slide after the check | |||||
auto oldExpiry = expiry_.load(std::memory_order_relaxed).tp; | |||||
if (now > oldExpiry || updateMode == UpdateMode::Now) { |
@ -0,0 +1,114 @@ | |||||
diff --git a/folly/CachelinePadded.h b/folly/CachelinePadded.h | |||||
--- a/folly/CachelinePadded.h | |||||
+++ b/folly/CachelinePadded.h | |||||
@@ -35,10 +35,6 @@ | |||||
*/ | |||||
template <typename T> | |||||
class CachelinePadded { | |||||
- static_assert( | |||||
- alignof(T) <= max_align_v, | |||||
- "CachelinePadded does not support over-aligned types."); | |||||
- | |||||
public: | |||||
template <typename... Args> | |||||
explicit CachelinePadded(Args&&... args) | |||||
diff --git a/folly/experimental/JSONSchema.cpp b/folly/experimental/JSONSchema.cpp | |||||
--- a/folly/experimental/JSONSchema.cpp | |||||
+++ b/folly/experimental/JSONSchema.cpp | |||||
@@ -25,6 +25,7 @@ | |||||
#include <folly/Singleton.h> | |||||
#include <folly/String.h> | |||||
#include <folly/json.h> | |||||
+#include <folly/portability/Math.h> | |||||
namespace folly { | |||||
namespace jsonschema { | |||||
@@ -141,7 +142,7 @@ | |||||
return none; | |||||
} | |||||
if (schema_.isDouble() || value.isDouble()) { | |||||
- const auto rem = std::remainder(value.asDouble(), schema_.asDouble()); | |||||
+ const auto rem = folly::remainder(value.asDouble(), schema_.asDouble()); | |||||
if (std::abs(rem) > std::numeric_limits<double>::epsilon()) { | |||||
return makeError("a multiple of ", schema_, value); | |||||
} | |||||
diff --git a/folly/external/farmhash/farmhash.cpp b/folly/external/farmhash/farmhash.cpp | |||||
--- a/folly/external/farmhash/farmhash.cpp | |||||
+++ b/folly/external/farmhash/farmhash.cpp | |||||
@@ -181,6 +181,7 @@ | |||||
#undef bswap_32 | |||||
#undef bswap_64 | |||||
+#undef _BYTESWAP_H | |||||
#include <byteswap.h> | |||||
#endif | |||||
diff --git a/folly/portability/Math.h b/folly/portability/Math.h | |||||
--- a/folly/portability/Math.h | |||||
+++ b/folly/portability/Math.h | |||||
@@ -20,21 +20,24 @@ | |||||
namespace folly { | |||||
-#ifndef __ANDROID__ | |||||
+#if !defined(__ANDROID__) && !defined(__UCLIBC__) | |||||
/** | |||||
- * Most platforms hopefully provide std::nextafter. | |||||
+ * Most platforms hopefully provide std::{nextafter,remainder}. | |||||
*/ | |||||
/* using override */ using std::nextafter; | |||||
+/* using override */ using std::remainder; | |||||
-#else // !__ANDROID__ | |||||
+#else // !__ANDROID__ && !__UCLIBC__ | |||||
/** | |||||
* On Android, std::nextafter isn't implemented. However, the C functions and | |||||
* compiler builtins are still provided. Using the GCC builtin is actually | |||||
* slightly faster, as they're constexpr and the use cases within folly are in | |||||
* constexpr context. | |||||
+ * | |||||
+ * UCLIBC doesn't implement std::remainder. Use the builtin versions. | |||||
*/ | |||||
#if defined(__GNUC__) && !defined(__clang__) | |||||
@@ -51,6 +54,18 @@ | |||||
return __builtin_nextafterl(x, y); | |||||
} | |||||
+constexpr float remainder(float x, float y) { | |||||
+ return __builtin_remainderf(x, y); | |||||
+} | |||||
+ | |||||
+constexpr double remainder(double x, double y) { | |||||
+ return __builtin_remainder(x, y); | |||||
+} | |||||
+ | |||||
+constexpr long double remainder(long double x, long double y) { | |||||
+ return __builtin_remainderl(x, y); | |||||
+} | |||||
+ | |||||
#else // __GNUC__ | |||||
inline float nextafter(float x, float y) { | |||||
@@ -65,6 +80,18 @@ | |||||
return ::nextafterl(x, y); | |||||
} | |||||
+inline float remainder(float x, float y) { | |||||
+ return ::remainderf(x, y); | |||||
+} | |||||
+ | |||||
+inline double remainder(double x, double y) { | |||||
+ return ::remainder(x, y); | |||||
+} | |||||
+ | |||||
+inline long double remainder(long double x, long double y) { | |||||
+ return ::remainderl(x, y); | |||||
+} | |||||
+ | |||||
#endif // __GNUC__ | |||||
#endif // __ANDROID__ |
@ -0,0 +1,147 @@ | |||||
diff --git a/folly/io/async/ssl/OpenSSLUtils.cpp b/folly/io/async/ssl/OpenSSLUtils.cpp | |||||
index 0504cf8..a9c2775 100644 | |||||
--- a/folly/io/async/ssl/OpenSSLUtils.cpp | |||||
+++ b/folly/io/async/ssl/OpenSSLUtils.cpp | |||||
@@ -155,8 +155,12 @@ static std::unordered_map<uint16_t, std::string> getOpenSSLCipherNames() { | |||||
SSL_CTX* ctx = nullptr; | |||||
SSL* ssl = nullptr; | |||||
+#if OPENSSL_VERSION_NUMBER < 0x10100000L | |||||
const SSL_METHOD* meth = SSLv23_server_method(); | |||||
OpenSSL_add_ssl_algorithms(); | |||||
+#else | |||||
+ const SSL_METHOD* meth = TLS_server_method(); | |||||
+#endif | |||||
if ((ctx = SSL_CTX_new(meth)) == nullptr) { | |||||
return ret; | |||||
diff --git a/folly/portability/OpenSSL.h b/folly/portability/OpenSSL.h | |||||
index a4f4b04..427bf95 100644 | |||||
--- a/folly/portability/OpenSSL.h | |||||
+++ b/folly/portability/OpenSSL.h | |||||
@@ -27,6 +27,7 @@ | |||||
#include <openssl/asn1.h> | |||||
#include <openssl/bio.h> | |||||
+#include <openssl/bn.h> | |||||
#include <openssl/crypto.h> | |||||
#include <openssl/dh.h> | |||||
#include <openssl/err.h> | |||||
diff --git a/folly/ssl/OpenSSLCertUtils.cpp b/folly/ssl/OpenSSLCertUtils.cpp | |||||
index 544bb4f..423dd2c 100644 | |||||
--- a/folly/ssl/OpenSSLCertUtils.cpp | |||||
+++ b/folly/ssl/OpenSSLCertUtils.cpp | |||||
@@ -155,12 +155,17 @@ folly::Optional<std::string> OpenSSLCertUtils::toString(X509& x509) { | |||||
} | |||||
} | |||||
+#if OPENSSL_VERSION_NUMBER < 0x10100000L | |||||
+#define X509_get0_notAfter X509_get_notAfter | |||||
+#define X509_get0_notBefore X509_get_notBefore | |||||
+#endif | |||||
+ | |||||
std::string OpenSSLCertUtils::getNotAfterTime(X509& x509) { | |||||
- return getDateTimeStr(X509_get_notAfter(&x509)); | |||||
+ return getDateTimeStr(X509_get0_notAfter(&x509)); | |||||
} | |||||
std::string OpenSSLCertUtils::getNotBeforeTime(X509& x509) { | |||||
- return getDateTimeStr(X509_get_notBefore(&x509)); | |||||
+ return getDateTimeStr(X509_get0_notBefore(&x509)); | |||||
} | |||||
std::string OpenSSLCertUtils::getDateTimeStr(const ASN1_TIME* time) { | |||||
diff --git a/folly/ssl/OpenSSLVersionFinder.h b/folly/ssl/OpenSSLVersionFinder.h | |||||
index d0110d7..9d65580 100644 | |||||
--- a/folly/ssl/OpenSSLVersionFinder.h | |||||
+++ b/folly/ssl/OpenSSLVersionFinder.h | |||||
@@ -18,6 +18,12 @@ | |||||
#include <folly/Conv.h> | |||||
#include <folly/portability/OpenSSL.h> | |||||
+#if OPENSSL_VERSION_NUMBER < 0x10100000L | |||||
+#define OPENSSL_VERSION SSLEAY_VERSION | |||||
+#define OpenSSL_version SSLeay_version | |||||
+#define OpenSSL_version_num SSLeay | |||||
+#endif | |||||
+ | |||||
// This is used to find the OpenSSL version at runtime. Just returning | |||||
// OPENSSL_VERSION_NUMBER is insufficient as runtime version may be different | |||||
// from the compile-time version | |||||
@@ -25,7 +31,7 @@ namespace folly { | |||||
namespace ssl { | |||||
inline std::string getOpenSSLLongVersion() { | |||||
#ifdef OPENSSL_VERSION_TEXT | |||||
- return SSLeay_version(SSLEAY_VERSION); | |||||
+ return OpenSSL_version(OPENSSL_VERSION); | |||||
#elif defined(OPENSSL_VERSION_NUMBER) | |||||
return folly::format("0x{:x}", OPENSSL_VERSION_NUMBER).str(); | |||||
#else | |||||
@@ -35,7 +41,7 @@ inline std::string getOpenSSLLongVersion() { | |||||
inline uint64_t getOpenSSLNumericVersion() { | |||||
#ifdef OPENSSL_VERSION_NUMBER | |||||
- return SSLeay(); | |||||
+ return OpenSSL_version_num(); | |||||
#else | |||||
return 0; | |||||
#endif | |||||
diff --git a/folly/ssl/detail/OpenSSLThreading.cpp b/folly/ssl/detail/OpenSSLThreading.cpp | |||||
index 3414fbd..ce345ab 100644 | |||||
--- a/folly/ssl/detail/OpenSSLThreading.cpp | |||||
+++ b/folly/ssl/detail/OpenSSLThreading.cpp | |||||
@@ -115,6 +115,7 @@ struct SSLLock { | |||||
// SSLContext runs in such environments. | |||||
// Instead of declaring a static member we "new" the static | |||||
// member so that it won't be destructed on exit(). | |||||
+#if !FOLLY_SSL_DETAIL_OPENSSL_IS_110 | |||||
static std::unique_ptr<SSLLock[]>& locks() { | |||||
static auto locksInst = new std::unique_ptr<SSLLock[]>(); | |||||
return *locksInst; | |||||
@@ -128,8 +129,8 @@ static void callbackLocking(int mode, int n, const char*, int) { | |||||
} | |||||
} | |||||
-static unsigned long callbackThreadID() { | |||||
- return static_cast<unsigned long>(folly::getCurrentThreadID()); | |||||
+static void callbackThreadID(CRYPTO_THREADID *id) { | |||||
+ return CRYPTO_THREADID_set_numeric(id, folly::getCurrentThreadID()); | |||||
} | |||||
static CRYPTO_dynlock_value* dyn_create(const char*, int) { | |||||
@@ -150,28 +151,33 @@ dyn_lock(int mode, struct CRYPTO_dynlock_value* lock, const char*, int) { | |||||
static void dyn_destroy(struct CRYPTO_dynlock_value* lock, const char*, int) { | |||||
delete lock; | |||||
} | |||||
+#endif | |||||
void installThreadingLocks() { | |||||
+#if !FOLLY_SSL_DETAIL_OPENSSL_IS_110 | |||||
// static locking | |||||
locks() = std::make_unique<SSLLock[]>(size_t(CRYPTO_num_locks())); | |||||
for (auto it : lockTypes()) { | |||||
locks()[size_t(it.first)].lockType = it.second; | |||||
} | |||||
- CRYPTO_set_id_callback(callbackThreadID); | |||||
+ CRYPTO_THREADID_set_callback(callbackThreadID); | |||||
CRYPTO_set_locking_callback(callbackLocking); | |||||
// dynamic locking | |||||
CRYPTO_set_dynlock_create_callback(dyn_create); | |||||
CRYPTO_set_dynlock_lock_callback(dyn_lock); | |||||
CRYPTO_set_dynlock_destroy_callback(dyn_destroy); | |||||
+#endif | |||||
} | |||||
void cleanupThreadingLocks() { | |||||
- CRYPTO_set_id_callback(nullptr); | |||||
+#if !FOLLY_SSL_DETAIL_OPENSSL_IS_110 | |||||
+ CRYPTO_THREADID_set_callback(nullptr); | |||||
CRYPTO_set_locking_callback(nullptr); | |||||
CRYPTO_set_dynlock_create_callback(nullptr); | |||||
CRYPTO_set_dynlock_lock_callback(nullptr); | |||||
CRYPTO_set_dynlock_destroy_callback(nullptr); | |||||
locks().reset(); | |||||
+#endif | |||||
} | |||||
} // namespace detail |