123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- 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: ', ',
- )
|