attempt to fix murmur on big endian
[awesomized/libmemcached] / CMake / CheckByteswap.cmake
diff --git a/CMake/CheckByteswap.cmake b/CMake/CheckByteswap.cmake
new file mode 100644 (file)
index 0000000..b238a80
--- /dev/null
@@ -0,0 +1,58 @@
+include(CheckHeader)
+include(CheckDecl)
+include(CheckCompiles)
+
+# defines HAVE_BYTESWAP
+# optionally defines BYTESWAP_HEADER
+# optionally defines BYTESWAP_32
+#
+# checks whether the following compiles:
+# __builtin_bswap32(): defines HAVE_BUILTIN_BSWAP32
+#
+# else checks:
+# byteswap.h: defines HAVE_BYTESWAP_H
+# bswap_32() in byteswap.h: defines HAVE_BSWAP_32
+#
+# else checks:
+# sys/endian.h: defines HAVE_SYS_ENDIAN_H
+# bswap32() in sys/endian.h: defines HAVE_BSWAP32
+#
+function(check_byteswap)
+
+    check_compiles(HAVE_BUILTIN_BSWAP32 "uint32_t a, b = __builtin_bswap32(a);" stdint.h)
+
+    if(HAVE_BUILTIN_BSWAP32)
+        unset(BYTESWAP_HEADER PARENT_SCOPE)
+        set(BYTESWAP_32 __builtin_bswap32 PARENT_SCOPE)
+        set(HAVE_BYTESWAP 1 PARENT_SCOPE)
+        return()
+    endif()
+
+    check_header(byteswap.h)
+    check_decl(bswap_32 byteswap.h)
+
+    if(HAVE_BSWAP_32)
+        if(HAVE_BYTESWAP_H)
+            set(BYTESWAP_HEADER byteswap.h PARENT_SCOPE)
+        endif()
+        set(BYTESWAP_32 bswap_32 PARENT_SCOPE)
+        set(HAVE_BYTESWAP 1 PARENT_SCOPE)
+        return()
+    endif()
+
+    check_header(sys/endian.h)
+    check_decl(bswap32 sys/endian.h)
+
+    if(HAVE_BSWAP32)
+        if(HAVE_SYS_ENDIAN_H)
+            set(BYTESWAP_HEADER sys/endian.h PARENT_SCOPE)
+        endif()
+        set(BYTESWAP_32 bswap32 PARENT_SCOPE)
+        set(HAVE_BYTESWAP 1 PARENT_SCOPT)
+        return()
+    endif()
+
+    unset(BYTESWAP_HEADER PARENT_SCOPE)
+    unset(BYTESWAP_32 PARENT_SCOPE)
+    set(HAVE_BYTESWAP 0 PARENT_SCOPE)
+endfunction()