b238a805ace3904eb91a01f52bde4941511766e4
[m6w6/libmemcached] / CMake / CheckByteswap.cmake
1 include(CheckHeader)
2 include(CheckDecl)
3 include(CheckCompiles)
4
5 # defines HAVE_BYTESWAP
6 # optionally defines BYTESWAP_HEADER
7 # optionally defines BYTESWAP_32
8 #
9 # checks whether the following compiles:
10 # __builtin_bswap32(): defines HAVE_BUILTIN_BSWAP32
11 #
12 # else checks:
13 # byteswap.h: defines HAVE_BYTESWAP_H
14 # bswap_32() in byteswap.h: defines HAVE_BSWAP_32
15 #
16 # else checks:
17 # sys/endian.h: defines HAVE_SYS_ENDIAN_H
18 # bswap32() in sys/endian.h: defines HAVE_BSWAP32
19 #
20 function(check_byteswap)
21
22 check_compiles(HAVE_BUILTIN_BSWAP32 "uint32_t a, b = __builtin_bswap32(a);" stdint.h)
23
24 if(HAVE_BUILTIN_BSWAP32)
25 unset(BYTESWAP_HEADER PARENT_SCOPE)
26 set(BYTESWAP_32 __builtin_bswap32 PARENT_SCOPE)
27 set(HAVE_BYTESWAP 1 PARENT_SCOPE)
28 return()
29 endif()
30
31 check_header(byteswap.h)
32 check_decl(bswap_32 byteswap.h)
33
34 if(HAVE_BSWAP_32)
35 if(HAVE_BYTESWAP_H)
36 set(BYTESWAP_HEADER byteswap.h PARENT_SCOPE)
37 endif()
38 set(BYTESWAP_32 bswap_32 PARENT_SCOPE)
39 set(HAVE_BYTESWAP 1 PARENT_SCOPE)
40 return()
41 endif()
42
43 check_header(sys/endian.h)
44 check_decl(bswap32 sys/endian.h)
45
46 if(HAVE_BSWAP32)
47 if(HAVE_SYS_ENDIAN_H)
48 set(BYTESWAP_HEADER sys/endian.h PARENT_SCOPE)
49 endif()
50 set(BYTESWAP_32 bswap32 PARENT_SCOPE)
51 set(HAVE_BYTESWAP 1 PARENT_SCOPT)
52 return()
53 endif()
54
55 unset(BYTESWAP_HEADER PARENT_SCOPE)
56 unset(BYTESWAP_32 PARENT_SCOPE)
57 set(HAVE_BYTESWAP 0 PARENT_SCOPE)
58 endfunction()