forked from xiph/speex
-
Notifications
You must be signed in to change notification settings - Fork 0
/
meson.build
224 lines (180 loc) · 6.56 KB
/
meson.build
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
216
217
218
219
220
221
222
223
224
project('speex', 'c', version: '1.2.1',
meson_version: '>= 0.59')
libversion = '1.5.2'
speex_version = meson.project_version()
version_arr = speex_version.split('.')
speex_version_major = version_arr[0].to_int()
speex_version_minor = version_arr[1].to_int()
# extra version might be "-svn" or ".2" or empty
if version_arr.length() == 4
speex_version_micro = version_arr[2].to_int()
speex_version_extra = '.' + version_arr[3]
elif version_arr[2].contains('-')
speex_version_micro = version_arr[2].split('-')[0].to_int()
speex_version_extra = '-' + version_arr[2].split('-')[1]
else
speex_version_micro = version_arr[2].to_int()
speex_version_extra = ''
endif
host_system = host_machine.system()
host_cpu_family = host_machine.cpu_family()
if host_machine.endian() == 'big'
cdata.set('WORDS_BIGENDIAN', true)
endif
cc = meson.get_compiler('c')
config_inc = include_directories('.')
speex_incs = include_directories('include', 'include/speex')
cdata = configuration_data()
add_project_arguments('-DHAVE_CONFIG_H=1', language: 'c')
cdata.set_quoted('SPEEX_VERSION', speex_version,
description: 'Complete version string')
cdata.set('SPEEX_MAJOR_VERSION', speex_version_major,
description: 'Version major')
cdata.set('SPEEX_MINOR_VERSION', speex_version_minor,
description: 'Version minor')
cdata.set('SPEEX_MICRO_VERSION', speex_version_micro,
description: 'Version micro')
cdata.set_quoted('SPEEX_EXTRA_VERSION', speex_version_extra,
description: 'Version extra (version suffix string)')
# Test whether the compiler supports the 'long double' type.
have_var_arrays = cc.compiles('void func (int n) {int arr[n]; }',
name: 'C99 variable-size arrays')
cdata.set('VAR_ARRAYS', have_var_arrays,
description: 'Use C99 variable-size arrays')
has_sse = false
if host_cpu_family in ['x86', 'x86_64'] and get_option('sse').allowed()
intrin_check = '''#include <xmmintrin.h>
__m128 testfunc(float *a, float *b) {
return _mm_add_ps(_mm_loadu_ps(a), _mm_loadu_ps(b));
}
int main (int argc, char ** argv) {
float a = 2.0, b = 99.0;
testfunc(&a, &b);
return 0;
}
'''
# Intrinsics arguments are not available with MSVC-like compilers
intrin_args = cc.get_argument_syntax() == 'msvc' ? [] : ['-msse']
if cc.links(intrin_check, name: 'Compiler supports SEE intrinsics', args: intrin_args)
has_sse = true
endif
# Mimicing the logic in win32/config.h
if cc.get_id() == 'msvc' and host_cpu_family == 'x86'
m_ix86_fp = cc.get_define('_M_IX86_FP')
if m_ix86_fp == '' or m_ix86_fp.to_int() < 1
has_sse = false
endif
endif
endif
# Visual Studio supports alloca(), but it always aligns variables to 16-bit
# boundary, while SSE needs 128-bit alignment. So we disable alloca() when
# SSE is enabled (from win32/config.h)
allow_alloca = not (cc.get_id() == 'msvc' and has_sse)
use_alloca = false
if allow_alloca
alloca_check = 'int main (int n) { char * array = alloca(n); }'
if cc.has_header('alloca.h')
cdata.set('HAVE_ALLOCA_H', true)
if cc.links('#include <alloca.h>\n' + alloca_check, name: 'alloca (alloca.h)')
use_alloca = true
endif
endif
if cc.links('#include <malloc.h>\n#include <stdlib.h>\n' + alloca_check, name: 'alloca (malloc.h)')
use_alloca = true
endif
endif
cdata.set('USE_ALLOCA', use_alloca)
if cc.get_id() != 'msvc' and cc.has_argument('-fvisibility=hidden')
add_project_arguments('-fvisibility=hidden', language: 'c')
cdata.set('EXPORT', '__attribute__((visibility("default")))')
else
cdata.set('EXPORT', '/* */')
endif
# FFT implementation
fft_dep = []
use_fixed_point = get_option('fixed-point').enabled()
if use_fixed_point
default_fft = 'kiss'
has_sse = false
cdata.set('FIXED_POINT', true)
else
default_fft = 'smallft'
cdata.set('FLOATING_POINT', true)
endif
fft_opt = get_option('fft')
if fft_opt == 'auto'
fft_used = default_fft
elif fft_opt == 'kiss'
fft_used = 'kiss'
elif fft_opt == 'smallft'
fft_used = 'smallft'
elif fft_opt == 'gpl-fftw3'
fft_used = 'gpl-fftw3'
fft_dep = dependency('fftw3f', required: true)
elif fft_opt == 'proprietary-intel-mkl'
error('FIXME: add support for proprietary-intel-mkl FFT')
else
error('Unexpected FFT option', fft_opt)
endif
if not has_sse and get_option('sse').enabled()
error('No SSE support, but SSE support required via options')
endif
cdata.set('_USE_SSE', has_sse)
opt_arm4_asm = get_option('arm4-asm').enabled()
opt_arm5e_asm = get_option('arm5e-asm').enabled()
opt_blackfin_asm = get_option('blackfin-asm').enabled()
# opt_ti_c55x = get_option('ti-c55x').enabled()
cdata.set('ARM4_ASM', opt_arm4_asm)
cdata.set('ARM5E_ASM', opt_arm5e_asm)
cdata.set('BFIN_ASM', opt_blackfin_asm)
# cdata.set('TI_C55X', opt_ti_c55x) # has_char16=yes
opt_disable_vbr = get_option('vbr').disabled()
opt_disable_float_api = get_option('float-api').disabled()
opt_fixed_point_debug = get_option('fixed-point-debug').enabled()
opt_valgrind = get_option('valgrind').enabled()
opt_vorbis_psy = get_option('vorbis-psy').enabled()
cdata.set('DISABLE_VBR', opt_disable_vbr)
cdata.set('DISABLE_FLOAT_API', opt_disable_float_api)
cdata.set('FIXED_POINT_DEBUG', opt_fixed_point_debug)
cdata.set('ENABLE_VALGRIND', opt_valgrind)
subdir('doc')
subdir('include/speex')
subdir('libspeex')
if not get_option('tools').disabled()
subdir('src')
endif
# config.h
configure_file(output: 'config.h', configuration: cdata)
# summary
building_speex_tools = get_variable('building_speex_tools', false)
opt_disable_vbr = get_option('vbr').disabled()
opt_disable_float_api = get_option('float-api').disabled()
opt_fixed_point_debug = get_option('fixed-point-debug').enabled()
opt_valgrind = get_option('valgrind').enabled()
asms = {
'has_sse': 'SSE',
'opt_arm4_asm': 'ARM4 assembly',
'opt_arm5e_asm': 'ARMv5e assembly',
'opt_blackfin_asm': 'Blackfin assembly',
'opt_ti_c55x': 'TI C55X DSP',
}
optimizations = []
foreach var, desc : asms
if get_variable(var, false)
optimizations += [desc]
endif
endforeach
summary(
{
'Assembly optimizations': optimizations.length() > 0 ? optimizations : false,
'Floating point support': not use_fixed_point,
'Fixed point debugging': use_fixed_point ? opt_fixed_point_debug : 'N/A',
'Float API': not opt_disable_float_api,
'FFT': fft_used,
'VBR + VAD support': not opt_disable_vbr,
'Vorbis psy model': opt_vorbis_psy,
'Tools': building_speex_tools,
},
bool_yn: true,
list_sep: ', ',
)