-
Notifications
You must be signed in to change notification settings - Fork 18
/
configure.ac
215 lines (194 loc) · 7.63 KB
/
configure.ac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
dnl Process this file with autoconf to produce a configure script.
AC_INIT(htscodecs, 1.6.1)
# Some functions benefit from -O3 optimisation, so if the user didn't
# explicitly set any compiler flags, we'll plump for O3.
_=${CFLAGS="-g -O3"}
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([foreign])
AM_MAINTAINER_MODE
AM_EXTRA_RECURSIVE_TARGETS([fuzz])
# For my own benefit, here's a summary of how versioning should work.
#
# Library versioning, not to be confused with the release number:
# Update VERS_CURRENT when an interface changes in an incompatible manner.
# eg. change of struct, removing a function, changing a prototype.
# Also increment this when we add new functions in a backwards compatible
# manner, but update VERS_AGE too (see below).
#
# Update VERS_REVISION whenever VERS_CURRENT hasn't changed, but the source
# code has. (Otherwise reset revision to 0).
#
# Update VERS_AGE if new interfaces have been added, causing VERS_CURRENT to
# be incremented too. The idea is that if the previous values are
# VERS_CURRENT=2, VERS_AGE=0 then after adding a new function we
# get VERS_CURRENT=3, VERS_AGE=1 (ie ABI compat with vers 2 or 3).
#
# Also see:
# http://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info
# Example: We have htscodecs 1.11.6 implementing ABI vers 0, rev 6, age 0.
# Our library has an soname of libhtscodecs.so.0 and files as follows:
# (SONAME libhtscodecs.so.0)
# libhtscodecs.so -> libhtscodecs.so.0.0.6
# libhtscodecs.so.0 -> libhtscodecs.so.0.0.6
# libhtscodecs.so.0.0.6
#
# We then release htscodecs 1.12.0 with modified structs, so it's incompatible.
# We bump to ABI vers 1, rev 0, age 0 - giving:
# (SONAME libhtscodecs.so.1)
# libhtscodecs.so -> libhtscodecs.so.1.0.0
# libhtscodecs.so.1 -> libhtscodecs.so.1.0.0
# libhtscodecs.so.1.0.0
#
# If in 1.12.1 to 1.12.5 we then perform several successive minor tweaks (bug
# fix, optimisation, etc) that do not change the ABI at all, we may
# end up with ABI vers 1, rev 5, age 0:
# (SONAME libhtscodecs.so.1)
# libhtscodecs.so -> libhtscodecs.so.1.0.5
# libhtscodecs.so.1 -> libhtscodecs.so.1.0.5
# libhtscodecs.so.1.0.5
#
# And assume in 1.13.0 we add an extra public function. Code linked
# against 1.12.x still works (aka library version 1) meaning our
# soname doesn't change, but we do update ABI version: vers 2, rev 0, age 1.
# (SONAME libhtscodecs.so.1)
# libhtscodecs.so -> libhtscodecs.so.1.1.0
# libhtscodecs.so.1 -> libhtscodecs.so.1.1.0
# libhtscodecs.so.1.1.0
VERS_CURRENT=3
VERS_REVISION=6
VERS_AGE=1
AC_SUBST(VERS_CURRENT)
AC_SUBST(VERS_REVISION)
AC_SUBST(VERS_AGE)
dnl Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL
LT_INIT
# # by Marcelo Magallon <[email protected]>
# # Turn around -rpath problem with libtool 1.0c
# # This define should be improbable enough to not conflict with anything.
# echo host=$host
# case ${host} in
# *-linux-gnu | *-apple-darwin*)
# AC_MSG_RESULT([Fixing libtool for -rpath problems.])
# sed < libtool > libtool-2 \
# 's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=""/'
# mv libtool-2 libtool
# chmod 755 libtool
# ;;
# esac
dnl Turn on C compiler warnings.
VL_PROG_CC_WARNINGS
dnl Check for libraries
AC_ARG_ENABLE([bz2],
[AS_HELP_STRING([--disable-bz2],
[omit support for BZ2 within Arith streams])],
[], [enable_bz2=yes])
if test "$enable_bz2" != no; then
bz2_devel=ok
AC_CHECK_LIB([bz2], [BZ2_bzBuffToBuffCompress], [
LIBS="-lbz2 $LIBS"
AC_DEFINE([HAVE_LIBBZ2],1,[Define to 1 if you have the libbz2 library.])], [bz2_devel=missing])
if test "$bz2_devel" != "ok"; then
AC_MSG_ERROR([libbzip2 development files not found.
This is needed for some options of the arithmetic coder. It can be disabled
with configure --disable-bz2, but be aware some data streams will become
unable to be decompressed and arith tests will fail.])
fi
fi
dnl Check if __builtin_prefetch exists.
AC_CACHE_CHECK([for __builtin_prefetch], [ax_cv_builtin_prefetch],[
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [__builtin_prefetch("")])],
[ax_cv_builtin_prefetch=yes],
[ax_cv_builtin_prefetch=no])
])
AS_IF([test "$ax_cv_builtin_prefetch" = "yes"],
[AC_DEFINE(HAVE_BUILTIN_PREFETCH, 1,
[Define to 1 if you have a __builtin_prefetch])],
[])
dnl Check is cpuid works, needed by rANS_static4x16pr.c.
AC_CHECK_DECLS([__get_cpuid_max, __cpuid_count], [], [], [[#include <cpuid.h>]])
dnl AC_CHECK_LIB([lzma], [lzma_easy_buffer_encode], [
dnl LIBS="-llzma $LIBS"
dnl AC_DEFINE([HAVE_LIBLZMA],1,[Define to 1 if you have the liblzma library.])])
dnl
dnl # Experimental
dnl AC_CHECK_LIB([bsc], [bsc_compress], [
dnl LIBS="-lbsc $LIBS"
dnl AC_DEFINE([HAVE_LIBBSC],1,[Define to 1 if you have the libbsc library.])])
dnl Check if we can use our SSE4.1 too.
dnl Our SSE4 codec uses SSE4.1, SSSE3 (shuffle) and POPCNT, so we check all 3
dnl together. This helps Zig builds which don't work well if we test each
dnl individually.
HTS_CHECK_COMPILE_FLAGS_NEEDED([sse4.1], [-msse4.1 -mssse3 -mpopcnt], [AC_LANG_PROGRAM([[
#ifdef __x86_64__
#include "x86intrin.h"
#endif
]],[[
#ifdef __x86_64__
__m128i a = _mm_set_epi32(1, 2, 3, 4), b = _mm_set_epi32(4, 3, 2, 1);
__m128i c = _mm_shuffle_epi8(_mm_max_epu32(a, b), b);
return _mm_popcnt_u32(*((char *) &c));
#endif
]])], [
MSSE4_1="$flags_needed"
build_rans_sse4=yes
AC_SUBST([MSSE4_1])
AC_DEFINE([HAVE_SSE4_1],1,[Defined to 1 if rANS source using SSE4.1 can be compiled.])
AC_DEFINE([HAVE_SSSE3],1,[Defined to 1 if rANS source using SSSE3 can be compiled.])
AC_DEFINE([HAVE_POPCNT],1,[Defined to 1 if rANS source using popcnt can be compiled.])
])
AM_CONDITIONAL([RANS_32x16_SSE4],[test "$build_rans_sse4" = yes])
dnl Check if we can use our AVX2 implementations.
build_rans_avx2=no
HTS_CHECK_COMPILE_FLAGS_NEEDED([avx2], [-mavx2 -mpopcnt], [AC_LANG_PROGRAM([[
#ifdef __x86_64__
#include "x86intrin.h"
#endif
]],[[
#ifdef __x86_64__
__m256i a = _mm256_set_epi32(1, 2, 3, 4, 5, 6, 7, 8);
__m256i b = _mm256_add_epi32(a, a);
long long c = _mm256_extract_epi64(b, 0);
return _mm_popcnt_u32((int)c);
#endif
]])], [
MAVX2="$flags_needed"
build_rans_avx2=yes
AC_SUBST([MAVX2])
AC_DEFINE([HAVE_AVX2],1,[Defined to 1 if rANS source using AVX2 can be compiled.])
AC_DEFINE([HAVE_POPCNT],1,[Defined to 1 if rANS source using popcnt can be compiled.])
])
AM_CONDITIONAL([RANS_32x16_AVX2],[test "$build_rans_avx2" = yes])
dnl Check also if we have AVX512.
build_rans_avx512=no
HTS_CHECK_COMPILE_FLAGS_NEEDED([avx512f], [-mavx512f -mpopcnt], [AC_LANG_PROGRAM([[
#ifdef __x86_64__
#include "x86intrin.h"
#endif
]],[[
#ifdef __x86_64__
__m512i a = _mm512_set1_epi32(1);
__m512i b = _mm512_add_epi32(a, a);
__m256i c = _mm512_castsi512_si256(b);
__m256i d = _mm512_extracti64x4_epi64(a, 1);
return _mm_popcnt_u32(*((char *) &c)) + (*(char *) &d);
#endif
]])], [
MAVX512="$flags_needed"
build_rans_avx512=yes
AC_SUBST([MAVX512])
AC_DEFINE([HAVE_AVX512],1,[Defined to 1 if rANS source using AVX512F can be compiled.])
])
AC_DEFINE([HAVE_POPCNT],1,[Defined to 1 if rANS source using popcnt can be compiled.])
AM_CONDITIONAL([RANS_32x16_AVX512],[test "$build_rans_avx512" = yes])
AC_SUBST([HTSCODECS_SIMD_SRC])
dnl Checks for header files.
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS(fcntl.h limits.h unistd.h malloc.h)
AC_CHECK_HEADER(zlib.h)
dnl Checks for library functions.
AX_SEARCH_LIBS_REV([pthread_join], [thr pthread])
AC_CONFIG_FILES([Makefile htscodecs/Makefile tests/Makefile])
AC_OUTPUT