aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormyd7349 <myd7349@gmail.com>2019-05-09 19:10:42 +0800
committermyd7349 <myd7349@gmail.com>2019-05-11 16:09:10 +0800
commit2bf491b4264f07c0669fbe10d6e5d373215ae737 (patch)
tree6bca16890771db368de269d91d8db47e020685c9
parent6f691d7a9b1a03620aaffe4364b342b76bb5b10a (diff)
downloadvcpkg-2bf491b4264f07c0669fbe10d6e5d373215ae737.tar.gz
vcpkg-2bf491b4264f07c0669fbe10d6e5d373215ae737.zip
[librdkafka] Fix ARM build error
-rw-r--r--ports/librdkafka/CONTROL2
-rw-r--r--ports/librdkafka/fix-arm-msvc-build.patch157
-rw-r--r--ports/librdkafka/portfile.cmake2
3 files changed, 160 insertions, 1 deletions
diff --git a/ports/librdkafka/CONTROL b/ports/librdkafka/CONTROL
index a1d1b64c6..5a652ec54 100644
--- a/ports/librdkafka/CONTROL
+++ b/ports/librdkafka/CONTROL
@@ -1,5 +1,5 @@
Source: librdkafka
-Version: 2019-05-07-1
+Version: 2019-05-07-2
Description: The Apache Kafka C/C++ library
Default-Features: ssl
diff --git a/ports/librdkafka/fix-arm-msvc-build.patch b/ports/librdkafka/fix-arm-msvc-build.patch
new file mode 100644
index 000000000..07600130b
--- /dev/null
+++ b/ports/librdkafka/fix-arm-msvc-build.patch
@@ -0,0 +1,157 @@
+diff --git a/src/snappy.c b/src/snappy.c
+index c3b6ea8a..e74e6903 100644
+--- a/src/snappy.c
++++ b/src/snappy.c
+@@ -63,9 +63,6 @@
+
+ #include "rd.h"
+
+-#ifdef _MSC_VER
+-#define inline __inline
+-#endif
+
+ #define CRASH_UNLESS(x) BUG_ON(!(x))
+ #define CHECK(cond) CRASH_UNLESS(cond)
+@@ -76,12 +73,12 @@
+ #define CHECK_LT(a, b) CRASH_UNLESS((a) < (b))
+ #define CHECK_GT(a, b) CRASH_UNLESS((a) > (b))
+
+-#define UNALIGNED_LOAD16(_p) get_unaligned((u16 *)(_p))
+-#define UNALIGNED_LOAD32(_p) get_unaligned((u32 *)(_p))
++#define UNALIGNED_LOAD16(_p) get_unaligned16((u16 *)(_p))
++#define UNALIGNED_LOAD32(_p) get_unaligned32((u32 *)(_p))
+ #define UNALIGNED_LOAD64(_p) get_unaligned64((u64 *)(_p))
+
+-#define UNALIGNED_STORE16(_p, _val) put_unaligned(_val, (u16 *)(_p))
+-#define UNALIGNED_STORE32(_p, _val) put_unaligned(_val, (u32 *)(_p))
++#define UNALIGNED_STORE16(_p, _val) put_unaligned16(_val, (u16 *)(_p))
++#define UNALIGNED_STORE32(_p, _val) put_unaligned32(_val, (u32 *)(_p))
+ #define UNALIGNED_STORE64(_p, _val) put_unaligned64(_val, (u64 *)(_p))
+
+ /*
+diff --git a/src/snappy_compat.h b/src/snappy_compat.h
+index 77606552..21e0ea6b 100644
+--- a/src/snappy_compat.h
++++ b/src/snappy_compat.h
+@@ -44,23 +44,65 @@ struct iovec {
+ };
+ #endif
+
+-#define get_unaligned_memcpy(x) ({ \
+- typeof(*(x)) _ret; \
+- memcpy(&_ret, (x), sizeof(*(x))); \
+- _ret; })
+-#define put_unaligned_memcpy(v,x) ({ \
+- typeof((v)) _v = (v); \
+- memcpy((x), &_v, sizeof(*(x))); })
++#ifdef _MSC_VER
++#define inline __inline
++#endif
++
++typedef unsigned char u8;
++typedef unsigned short u16;
++typedef unsigned u32;
++typedef unsigned long long u64;
++
++
++static inline u16 get_unaligned16_memcpy(const void *p)
++{
++ u16 t;
++ memcpy(&t, p, sizeof t);
++ return t;
++}
++
++static inline u32 get_unaligned32_memcpy(const void *p)
++{
++ u32 t;
++ memcpy(&t, p, sizeof t);
++ return t;
++}
++
++static inline u64 get_unaligned64_memcpy(const void *p)
++{
++ u64 t;
++ memcpy(&t, p, sizeof t);
++ return t;
++}
++
++static inline void put_unaligned16_memcpy(u16 v, void *p)
++{
++ memcpy(p, &v, sizeof v);
++}
++
++static inline void put_unaligned32_memcpy(u32 v, void *p)
++{
++ memcpy(p, &v, sizeof v);
++}
++
++static inline void put_unaligned64_memcpy(u64 v, void *p)
++{
++ memcpy(p, &v, sizeof v);
++}
+
+ #define get_unaligned_direct(x) (*(x))
+ #define put_unaligned_direct(v,x) (*(x) = (v))
+
+ // Potentially unaligned loads and stores.
+-// x86 and PowerPC can simply do these loads and stores native.
+-#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64)
+-
+-#define get_unaligned get_unaligned_direct
+-#define put_unaligned put_unaligned_direct
++// x86, PowerPC, and ARM64 can simply do these loads and stores native.
++#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || \
++ defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || \
++ defined(__aarch64__)
++
++#define get_unaligned16 get_unaligned_direct
++#define put_unaligned16 put_unaligned_direct
++#define get_unaligned32 get_unaligned_direct
++#define put_unaligned32 put_unaligned_direct
+ #define get_unaligned64 get_unaligned_direct
+ #define put_unaligned64 put_unaligned_direct
+
+@@ -86,29 +128,29 @@ struct iovec {
+ !defined(__ARM_ARCH_6ZK__) && \
+ !defined(__ARM_ARCH_6T2__)
+
+-#define get_unaligned get_unaligned_direct
+-#define put_unaligned put_unaligned_direct
+-#define get_unaligned64 get_unaligned_memcpy
+-#define put_unaligned64 put_unaligned_memcpy
++#define get_unaligned16 get_unaligned_direct
++#define put_unaligned16 put_unaligned_direct
++#define get_unaligned32 get_unaligned_direct
++#define put_unaligned32 put_unaligned_direct
++#define get_unaligned64 get_unaligned64_memcpy
++#define put_unaligned64 put_unaligned64_memcpy
+
+ // These macroses are provided for architectures that don't support
+ // unaligned loads and stores.
+ #else
+
+-#define get_unaligned get_unaligned_memcpy
+-#define put_unaligned put_unaligned_memcpy
+-#define get_unaligned64 get_unaligned_memcpy
+-#define put_unaligned64 put_unaligned_memcpy
++#define get_unaligned16 get_unaligned16_memcpy
++#define put_unaligned16 put_unaligned16_memcpy
++#define get_unaligned32 get_unaligned32_memcpy
++#define put_unaligned32 put_unaligned32_memcpy
++#define get_unaligned64 get_unaligned64_memcpy
++#define put_unaligned64 put_unaligned64_memcpy
+
+ #endif
+
+-#define get_unaligned_le32(x) (le32toh(get_unaligned((u32 *)(x))))
+-#define put_unaligned_le16(v,x) (put_unaligned(htole16(v), (u16 *)(x)))
++#define get_unaligned_le32(x) (le32toh(get_unaligned32((u32 *)(x))))
++#define put_unaligned_le16(v,x) (put_unaligned16(htole16(v), (u16 *)(x)))
+
+-typedef unsigned char u8;
+-typedef unsigned short u16;
+-typedef unsigned u32;
+-typedef unsigned long long u64;
+
+ #ifdef _MSC_VER
+ #define BUG_ON(x) do { if (unlikely((x))) abort(); } while (0)
diff --git a/ports/librdkafka/portfile.cmake b/ports/librdkafka/portfile.cmake
index fb637cd1d..d5beca2ec 100644
--- a/ports/librdkafka/portfile.cmake
+++ b/ports/librdkafka/portfile.cmake
@@ -6,6 +6,8 @@ vcpkg_from_github(
REF dc85ffc8068c18dfdf118666b4c78de1c7ac640b
SHA512 b21be356806125ab8bdb74de41eef2c56714cfd2003065be362d9fab7e177a07675e95a13ed6d7fbd3dc38502194000b0e378ff6c43c7d54a0234ada0df881eb
HEAD_REF master
+ PATCHES
+ fix-arm-msvc-build
)
string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "static" RDKAFKA_BUILD_STATIC)