| project('opus', 'c', |
| version: run_command('meson/get-version.py', '--package-version', check: true).stdout().strip(), |
| meson_version: '>=0.54.0', |
| default_options: ['warning_level=2', |
| 'c_std=gnu99', |
| 'buildtype=debugoptimized']) |
| |
| libversion = run_command('meson/get-version.py', '--libtool-version', check: true).stdout().strip() |
| macosversion = run_command('meson/get-version.py', '--darwin-version', check: true).stdout().strip() |
| |
| cc = meson.get_compiler('c') |
| host_system = host_machine.system() |
| host_cpu_family = host_machine.cpu_family() |
| top_srcdir = meson.current_source_dir() |
| top_builddir = meson.current_build_dir() |
| |
| opus_includes = include_directories('.', 'include', 'celt', 'silk') |
| opus_public_includes = include_directories('include') |
| |
| add_project_arguments('-DOPUS_BUILD', language: 'c') |
| add_project_arguments('-DHAVE_CONFIG_H', language: 'c') |
| |
| if host_system == 'windows' |
| if cc.get_argument_syntax() == 'msvc' |
| add_project_arguments('-D_CRT_SECURE_NO_WARNINGS', language: 'c') |
| endif |
| endif |
| |
| if cc.get_argument_syntax() == 'gnu' |
| add_project_arguments('-D_FORTIFY_SOURCE=2', language: 'c') |
| endif |
| |
| # Check for extra compiler args |
| additional_c_args = [] |
| if cc.get_argument_syntax() != 'msvc' |
| additional_c_args += [ |
| '-fvisibility=hidden', |
| '-Wcast-align', |
| '-Wnested-externs', |
| '-Wshadow', |
| '-Wstrict-prototypes', |
| ] |
| |
| # On Windows, -fstack-protector-strong adds a libssp-0.dll dependency and |
| # prevents static linking |
| if host_system != 'windows' |
| additional_c_args += ['-fstack-protector-strong'] |
| endif |
| endif |
| |
| foreach arg : additional_c_args |
| if cc.has_argument(arg) |
| add_project_arguments(arg, language: 'c') |
| endif |
| endforeach |
| |
| # Windows MSVC warnings |
| if cc.get_id() == 'msvc' |
| # Ignore several spurious warnings. |
| # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it |
| # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once |
| # NOTE: Only add warnings here if you are sure they're spurious |
| add_project_arguments('/wd4035', '/wd4715', '/wd4116', '/wd4046', '/wd4068', |
| '/wd4820', '/wd4244', '/wd4255', '/wd4668', |
| language : 'c') |
| endif |
| |
| opus_version = meson.project_version() |
| |
| opus_conf = configuration_data() |
| opus_conf.set('PACKAGE_BUGREPORT', '"opus@xiph.org"') |
| opus_conf.set('PACKAGE_NAME', '"opus"') |
| opus_conf.set('PACKAGE_STRING', '"opus @0@"'.format(opus_version)) |
| opus_conf.set('PACKAGE_TARNAME', '"opus"') |
| opus_conf.set('PACKAGE_URL', '""') |
| opus_conf.set('PACKAGE_VERSION', '"@0@"'.format(opus_version)) |
| |
| # FIXME: optional Ne10 dependency |
| have_arm_ne10 = false |
| |
| libm = cc.find_library('m', required : false) |
| |
| opus_conf.set('HAVE_LRINTF', cc.has_function('lrintf', prefix: '#include <math.h>', dependencies: libm)) |
| opus_conf.set('HAVE_LRINT', cc.has_function('lrint', prefix: '#include <math.h>', dependencies: libm)) |
| opus_conf.set('HAVE___MALLOC_HOOK', cc.has_function('__malloc_hook', prefix: '#include <malloc.h>')) |
| opus_conf.set('HAVE_STDINT_H', cc.check_header('stdint.h')) |
| |
| # Check for restrict keyword |
| restrict_tmpl = ''' |
| typedef int * int_ptr; |
| int foo (int_ptr @0@ ip, int * @0@ baz[]) { |
| return ip[0]; |
| } |
| int main (int argc, char ** argv) { |
| int s[1]; |
| int * @0@ t = s; |
| t[0] = 0; |
| return foo(t, (void *)0); |
| }''' |
| # Define restrict to the equivalent of the C99 restrict keyword, or to |
| # nothing if this is not supported. Do not define if restrict is |
| # supported directly. |
| if not cc.compiles(restrict_tmpl.format('restrict'), name : 'restrict keyword') |
| if cc.compiles(restrict_tmpl.format('__restrict'), name : '__restrict') |
| opus_conf.set('restrict', '__restrict') |
| elif cc.compiles(restrict_tmpl.format('__restrict__'), name : '__restrict__') |
| opus_conf.set('restrict', '__restrict') |
| elif cc.compiles(restrict_tmpl.format('_Restrict'), name : '_Restrict') |
| opus_conf.set('restrict', '_Restrict') |
| else |
| opus_conf.set('restrict', '/**/') |
| endif |
| endif |
| |
| # Check for C99 variable-size arrays, or alloca() as fallback |
| msg_use_alloca = false |
| if cc.compiles('''static int x; |
| char some_func (void) { |
| char a[++x]; |
| a[sizeof a - 1] = 0; |
| int N; |
| return a[0]; |
| }''', name : 'C99 variable-size arrays') |
| opus_conf.set('VAR_ARRAYS', 1) |
| msg_use_alloca = 'NO (using C99 variable-size arrays instead)' |
| elif cc.compiles('''#include <alloca.h> |
| void some_func (void) { |
| int foo=10; |
| int * array = alloca(foo); |
| }''', name : 'alloca (alloca.h)') |
| opus_conf.set('USE_ALLOCA', true) |
| opus_conf.set('HAVE_ALLOCA_H', true) |
| msg_use_alloca = true |
| elif cc.compiles('''#include <malloc.h> |
| #include <stdlib.h> |
| void some_func (void) { |
| int foo=10; |
| int * array = alloca(foo); |
| }''', name : 'alloca (std)') |
| opus_conf.set('USE_ALLOCA', true) |
| msg_use_alloca = true |
| endif |
| |
| opts = [ |
| [ 'fixed-point', 'FIXED_POINT' ], |
| [ 'fixed-point-debug', 'FIXED_DEBUG' ], |
| [ 'custom-modes', 'CUSTOM_MODES' ], |
| [ 'float-approx', 'FLOAT_APPROX' ], |
| [ 'assertions', 'ENABLE_ASSERTIONS' ], |
| [ 'hardening', 'ENABLE_HARDENING' ], |
| [ 'fuzzing', 'FUZZING' ], |
| [ 'check-asm', 'OPUS_CHECK_ASM' ], |
| ] |
| |
| foreach opt : opts |
| # we assume these are all boolean options |
| opt_foo = get_option(opt[0]) |
| if opt_foo |
| opus_conf.set(opt[1], 1) |
| endif |
| set_variable('opt_' + opt[0].underscorify(), opt_foo) |
| endforeach |
| |
| opt_asm = get_option('asm') |
| opt_rtcd = get_option('rtcd') |
| opt_intrinsics = get_option('intrinsics') |
| extra_programs = get_option('extra-programs') |
| opt_tests = get_option('tests') |
| |
| disable_float_api = not get_option('float-api') |
| if disable_float_api |
| opus_conf.set('DISABLE_FLOAT_API', 1) |
| endif |
| |
| # This is for the description in the pkg-config .pc file |
| if opt_fixed_point |
| pc_build = 'fixed-point' |
| else |
| pc_build = 'floating-point' |
| endif |
| if opt_custom_modes |
| pc_build = pc_build + ', custom modes' |
| endif |
| |
| rtcd_support = [] |
| # With GCC, Clang, ICC, etc, we differentiate between 'may support this SIMD' |
| # and 'presume we have this SIMD' by checking whether the SIMD / intrinsics can |
| # be compiled by the compiler as-is (presume) or with SIMD cflags (may have). |
| # With MSVC, the compiler will always build SIMD/intrinsics targeting all |
| # specific instruction sets supported by that version of the compiler. No |
| # special arguments are ever needed. If runtime CPU detection is not disabled, |
| # we must always assume that we only 'may have' it. |
| opus_can_presume_simd = true |
| if cc.get_argument_syntax() == 'msvc' |
| if opt_rtcd.disabled() |
| warning('Building with an MSVC-like compiler and runtime CPU detection is disabled. Outputs may not run on all @0@ CPUs.'.format(host_cpu_family)) |
| else |
| opus_can_presume_simd = false |
| endif |
| endif |
| |
| opus_arm_external_asm = false |
| |
| asm_tmpl = ''' |
| int main (int argc, char ** argv) { |
| __asm__("@0@"); |
| return 0; |
| }''' |
| |
| asm_optimization = [] |
| inline_optimization = [] |
| if not opt_asm.disabled() |
| # Currently we only have inline asm for fixed-point |
| if host_cpu_family == 'arm' and opt_fixed_point |
| opus_conf.set('OPUS_ARM_ASM', true) |
| |
| # Check if compiler supports gcc-style inline assembly |
| if cc.compiles('''#ifdef __GNUC_MINOR__ |
| #if (__GNUC__ * 1000 + __GNUC_MINOR__) < 3004 |
| #error GCC before 3.4 has critical bugs compiling inline assembly |
| #endif |
| #endif |
| __asm__ (""::)''', |
| name : 'compiler supports gcc-style inline assembly') |
| |
| opus_conf.set('OPUS_ARM_INLINE_ASM', 1) |
| |
| # AS_ASM_ARM_EDSP |
| if cc.compiles(asm_tmpl.format('qadd r3,r3,r3'), |
| name : 'assembler supports EDSP instructions on ARM') |
| opus_conf.set('OPUS_ARM_INLINE_EDSP', 1) |
| inline_optimization += ['ESDP'] |
| endif |
| |
| # AS_ASM_ARM_MEDIA |
| if cc.compiles(asm_tmpl.format('shadd8 r3,r3,r3'), |
| name : 'assembler supports ARMv6 media instructions on ARM') |
| opus_conf.set('OPUS_ARM_INLINE_MEDIA', 1) |
| inline_optimization += ['Media'] |
| endif |
| |
| # AS_ASM_ARM_NEON |
| if cc.compiles(asm_tmpl.format('vorr d0,d0,d0'), |
| name : 'assembler supports NEON instructions on ARM') |
| opus_conf.set('OPUS_ARM_INLINE_NEON', 1) |
| inline_optimization += ['NEON'] |
| endif |
| endif |
| |
| # We need Perl to translate RVCT-syntax asm to gas syntax |
| perl = find_program('perl', required: get_option('asm')) |
| if perl.found() |
| opus_arm_external_asm = true |
| # opus_arm_presume_* mean we can and will use those instructions |
| # directly without doing runtime CPU detection. |
| # opus_arm_may_have_* mean we can emit those instructions, but we can |
| # only use them after runtime detection. |
| # The same rules apply for x86 assembly and intrinsics. |
| |
| opus_arm_may_have_edsp = opus_conf.has('OPUS_ARM_INLINE_EDSP') |
| opus_arm_presume_edsp = opus_arm_may_have_edsp and opus_can_presume_simd |
| |
| opus_arm_may_have_media = opus_conf.has('OPUS_ARM_INLINE_MEDIA') |
| opus_arm_presume_media = opus_arm_may_have_media and opus_can_presume_simd |
| |
| opus_arm_may_have_neon = opus_conf.has('OPUS_ARM_INLINE_NEON') |
| opus_arm_presume_neon = opus_arm_may_have_neon and opus_can_presume_simd |
| |
| if not opt_rtcd.disabled() |
| if not opus_arm_may_have_edsp |
| message('Trying to force-enable armv5e EDSP instructions...') |
| # AS_ASM_ARM_EDSP_FORCE |
| opus_arm_may_have_edsp = cc.compiles(asm_tmpl.format('.arch armv5te\n.object_arch armv4t\nqadd r3,r3,r3'), |
| name : 'Assembler supports EDSP instructions on ARM (forced)') |
| endif |
| if not opus_arm_may_have_media |
| message('Trying to force-enable ARMv6 media instructions...') |
| opus_arm_may_have_media = cc.compiles(asm_tmpl.format('.arch armv6\n.object_arch armv4t\nshadd8 r3,r3,r3'), |
| name : 'Assembler supports ARMv6 media instructions on ARM (forced)') |
| endif |
| if not opus_arm_may_have_neon |
| message('Trying to force-enable NEON instructions...') |
| opus_arm_may_have_neon = cc.compiles(asm_tmpl.format('.arch armv7-a\n.fpu neon\n.object_arch armv4t\nvorr d0,d0,d0'), |
| name : 'Assembler supports NEON instructions on ARM (forced)') |
| endif |
| endif |
| |
| if opus_arm_may_have_edsp |
| opus_conf.set('OPUS_ARM_MAY_HAVE_EDSP', 1) |
| if opus_arm_presume_edsp |
| opus_conf.set('OPUS_ARM_PRESUME_EDSP', 1) |
| asm_optimization += ['EDSP'] |
| else |
| rtcd_support += ['EDSP'] |
| endif |
| endif |
| if opus_arm_may_have_media |
| opus_conf.set('OPUS_ARM_MAY_HAVE_MEDIA', 1) |
| if opus_arm_presume_media |
| opus_conf.set('OPUS_ARM_PRESUME_MEDIA', 1) |
| asm_optimization += ['Media'] |
| else |
| rtcd_support += ['Media'] |
| endif |
| endif |
| if opus_arm_may_have_neon |
| opus_conf.set('OPUS_ARM_MAY_HAVE_NEON', 1) |
| if opus_arm_presume_neon |
| opus_conf.set('OPUS_ARM_PRESUME_NEON', 1) |
| asm_optimization += ['NEON'] |
| else |
| rtcd_support += ['NEON'] |
| endif |
| endif |
| |
| if cc.get_define('__APPLE__') |
| arm2gnu_args = ['--apple'] |
| else |
| arm2gnu_args = [] |
| endif |
| endif # found perl |
| else # arm + enable fixed point |
| if opt_asm.enabled() |
| error('asm option is enabled, but no assembly support for ' + host_cpu_family) |
| endif |
| endif |
| endif # enable asm |
| |
| # Check whether we require assembly and we support assembly on this arch, |
| # but none were detected. Can happen because of incorrect compiler flags, such |
| # as missing -mfloat-abi=softfp on ARM32 softfp architectures. |
| if opt_asm.enabled() and (asm_optimization.length() + inline_optimization.length()) == 0 |
| error('asm option was enabled, but no assembly support was detected') |
| endif |
| |
| # XXX: NEON has hardfp vs softfp compiler configuration issues |
| # When targeting ARM32 softfp, we sometimes need to explicitly pass |
| # -mfloat-abi=softfp to enable NEON. F.ex., on Android. It should |
| # be set in the cross file. |
| arm_neon_intr_link_args = ['-mfpu=neon'] |
| |
| have_sse = false |
| have_sse2 = false |
| have_sse4_1 = false |
| have_avx = false # no avx opus code yet |
| have_neon_intr = false |
| |
| intrinsics_support = [] |
| if not opt_intrinsics.disabled() |
| if host_cpu_family in ['arm', 'aarch64'] |
| # Check for ARMv7/AArch64 neon intrinsics |
| intrin_check = ''' |
| #include <arm_neon.h> |
| int main (void) { |
| static float32x4_t A0, A1, SUMM; |
| SUMM = vmlaq_f32(SUMM, A0, A1); |
| return (int)vgetq_lane_f32(SUMM, 0); |
| }''' |
| intrin_name = 'ARMv7/AArch64 NEON' |
| if cc.links(intrin_check, |
| name: 'compiler supports @0@ intrinsics'.format(intrin_name)) |
| opus_arm_presume_neon_intr = opus_can_presume_simd |
| opus_arm_may_have_neon_intr = true |
| else |
| opus_arm_presume_neon_intr = false |
| if cc.links(intrin_check, |
| args: arm_neon_intr_link_args, |
| name: 'compiler supports @0@ intrinsics with @1@'.format(intrin_name, ' '.join(arm_neon_intr_link_args))) |
| opus_arm_may_have_neon_intr = true |
| else |
| opus_arm_may_have_neon_intr = false |
| endif |
| endif |
| |
| if opus_arm_may_have_neon_intr |
| have_neon_intr = true |
| intrinsics_support += [intrin_name] |
| opus_conf.set('OPUS_ARM_MAY_HAVE_NEON_INTR', 1) |
| if opus_arm_presume_neon_intr |
| opus_conf.set('OPUS_ARM_PRESUME_NEON_INTR', 1) |
| else |
| rtcd_support += [intrin_name] |
| opus_neon_intr_args = arm_neon_intr_link_args |
| endif |
| else |
| message('Compiler does not support @0@ intrinsics'.format(intrin_name)) |
| endif |
| |
| # Check for aarch64 neon intrinsics |
| intrin_check = ''' |
| #include <arm_neon.h> |
| int main (void) { |
| static int32_t IN; |
| static int16_t OUT; |
| OUT = vqmovns_s32(IN); |
| }''' |
| intrin_name = 'AArch64 NEON' |
| if cc.links(intrin_check, |
| name: 'compiler supports @0@ intrinsics'.format(intrin_name)) |
| opus_arm_presume_aarch64_neon_intr = opus_can_presume_simd |
| opus_arm_may_have_aarch64_neon_intr = true |
| else |
| opus_arm_presume_aarch64_neon_intr = false |
| if cc.links(intrin_check, |
| args: arm_neon_intr_link_args, |
| name: 'compiler supports @0@ intrinsics with @1@'.format(intrin_name, ' '.join(arm_neon_intr_link_args))) |
| opus_arm_may_have_aarch64_neon_intr = true |
| else |
| opus_arm_may_have_aarch64_neon_intr = false |
| endif |
| endif |
| |
| if opus_arm_may_have_aarch64_neon_intr |
| intrinsics_support += [intrin_name] |
| opus_conf.set('OPUS_X86_MAY_HAVE_AARCH64_NEON_INTR', 1) |
| if opus_arm_presume_aarch64_neon_intr |
| opus_conf.set('OPUS_X86_PRESUME_AARCH64_NEON_INTR', 1) |
| endif |
| else |
| message('Compiler does not support @0@ intrinsics'.format(intrin_name)) |
| endif |
| elif host_cpu_family in ['x86', 'x86_64'] |
| # XXX: allow external override/specification of the flags |
| x86_intrinsics = [ |
| [ 'SSE', 'xmmintrin.h', '__m128', '_mm_setzero_ps()', ['-msse'] ], |
| [ 'SSE2', 'emmintrin.h', '__m128i', '_mm_setzero_si128()', ['-msse2'] ], |
| [ 'SSE4.1', 'smmintrin.h', '__m128i', '_mm_setzero_si128(); mtest = _mm_cmpeq_epi64(mtest, mtest)', ['-msse4.1'] ], |
| [ 'AVX', 'immintrin.h', '__m256', '_mm256_setzero_ps()', ['-mavx'] ], |
| ] |
| |
| foreach intrin : x86_intrinsics |
| intrin_check = '''#include <@0@> |
| int main (int argc, char ** argv) { |
| static @1@ mtest; |
| mtest = @2@; |
| return *((unsigned char *) &mtest) != 0; |
| }'''.format(intrin[1],intrin[2],intrin[3]) |
| intrin_name = intrin[0] |
| # Intrinsics arguments are not available with MSVC-like compilers |
| intrin_args = cc.get_argument_syntax() == 'msvc' ? [] : intrin[4] |
| if cc.links(intrin_check, name : 'compiler supports @0@ intrinsics'.format(intrin_name)) |
| may_have_intrin = true |
| presume_intrin = opus_can_presume_simd |
| elif intrin_args.length() > 0 |
| presume_intrin = false |
| if cc.links(intrin_check, |
| args : intrin_args, |
| name : 'compiler supports @0@ intrinsics with @1@'.format(intrin_name, ' '.join(intrin_args))) |
| may_have_intrin = true |
| else |
| may_have_intrin = false |
| endif |
| endif |
| if may_have_intrin |
| intrinsics_support += [intrin_name] |
| intrin_lower_name = intrin_name.to_lower().underscorify() |
| set_variable('have_' + intrin_lower_name, true) |
| opus_conf.set('OPUS_X86_MAY_HAVE_' + intrin_name.underscorify(), 1) |
| if presume_intrin |
| opus_conf.set('OPUS_X86_PRESUME_' + intrin_name.underscorify(), 1) |
| else |
| rtcd_support += [intrin_name] |
| set_variable('opus_@0@_args'.format(intrin_lower_name), intrin_args) |
| endif |
| else |
| message('Compiler does not support @0@ intrinsics'.format(intrin_name)) |
| endif |
| endforeach |
| |
| if not opt_rtcd.disabled() |
| get_cpuid_by_asm = false |
| cpuid_asm_code = ''' |
| #include <stdio.h> |
| int main (int argc, char ** argv) { |
| unsigned int CPUInfo0; |
| unsigned int CPUInfo1; |
| unsigned int CPUInfo2; |
| unsigned int CPUInfo3; |
| unsigned int InfoType; |
| #if defined(__i386__) && defined(__PIC__) |
| __asm__ __volatile__ ( |
| "xchg %%ebx, %1\n" |
| "cpuid\n" |
| "xchg %%ebx, %1\n": |
| "=a" (CPUInfo0), |
| "=r" (CPUInfo1), |
| "=c" (CPUInfo2), |
| "=d" (CPUInfo3) : |
| "a" (InfoType), "c" (0) |
| ); |
| #else |
| __asm__ __volatile__ ( |
| "cpuid": |
| "=a" (CPUInfo0), |
| "=b" (CPUInfo1), |
| "=c" (CPUInfo2), |
| "=d" (CPUInfo3) : |
| "a" (InfoType), "c" (0) |
| ); |
| #endif |
| return 0; |
| }''' |
| cpuid_c_code = ''' |
| #include <cpuid.h> |
| int main (int argc, char ** argv) { |
| unsigned int CPUInfo0; |
| unsigned int CPUInfo1; |
| unsigned int CPUInfo2; |
| unsigned int CPUInfo3; |
| unsigned int InfoType; |
| __get_cpuid(InfoType, &CPUInfo0, &CPUInfo1, &CPUInfo2, &CPUInfo3); |
| return 0; |
| }''' |
| cpuid_msvc_code = ''' |
| #include <intrin.h> |
| int main (void) { |
| int CPUInfo, InfoType; |
| __cpuid(&CPUInfo, InfoType); |
| }''' |
| if cc.links(cpuid_asm_code, name : 'Get X86 CPU info via inline assembly') |
| opus_conf.set('CPU_INFO_BY_ASM', 1) |
| elif cc.links(cpuid_c_code, name : 'Get X86 CPU info via C method') |
| opus_conf.set('CPU_INFO_BY_C', 1) |
| elif cc.get_define('_MSC_VER') != '' and cc.links(cpuid_msvc_code) |
| message('Getting X86 CPU info via __cpuid') |
| else |
| if opt_intrinsics.enabled() and opt_rtcd.enabled() |
| error('intrinsics and rtcd options are enabled, but no Get CPU Info method detected') |
| endif |
| warning('Get CPU Info method not detected, no rtcd for intrinsics') |
| endif |
| endif # opt_rtcd |
| else |
| if opt_intrinsics.enabled() |
| error('intrinsics option enabled, but no intrinsics support for ' + host_machine.get_cpu()) |
| endif |
| warning('No intrinsics support for ' + host_machine.get_cpu()) |
| endif |
| endif |
| |
| # Check whether we require intrinsics and we support intrinsics on this arch, |
| # but none were detected. Can happen because of incorrect compiler flags, such |
| # as missing -mfloat-abi=softfp on ARM32 softfp architectures. |
| if opt_intrinsics.enabled() and intrinsics_support.length() == 0 |
| error('intrinsics option was enabled, but none were detected') |
| endif |
| |
| if opt_rtcd.disabled() |
| rtcd_support = 'disabled' |
| else |
| if rtcd_support.length() > 0 |
| opus_conf.set('OPUS_HAVE_RTCD', 1) |
| else |
| if intrinsics_support.length() == 0 |
| rtcd_support = 'none' |
| if opt_rtcd.enabled() |
| error('rtcd option is enabled, but no support for intrinsics or assembly is available') |
| endif |
| else |
| rtcd_support = 'not needed' |
| endif |
| endif |
| endif |
| |
| # extract source file lists from .mk files |
| mk_files = ['silk_sources.mk', 'opus_headers.mk', 'opus_sources.mk', 'silk_headers.mk', 'celt_sources.mk', 'celt_headers.mk'] |
| lines = run_command('meson/read-sources-list.py', mk_files, check: true).stdout().strip().split('\n') |
| sources = {} |
| foreach l : lines |
| a = l.split(' = ') |
| var_name = a[0] |
| file_list = a[1].split() |
| sources += {var_name: files(file_list)} |
| endforeach |
| |
| subdir('include') |
| subdir('silk') |
| subdir('celt') |
| subdir('src') |
| |
| configure_file(output: 'config.h', configuration: opus_conf) |
| |
| if not opt_tests.disabled() |
| subdir('celt/tests') |
| subdir('silk/tests') |
| subdir('tests') |
| endif |
| |
| # pkg-config files (not using pkg module so we can use the existing .pc.in file) |
| pkgconf = configuration_data() |
| |
| pkgconf.set('prefix', join_paths(get_option('prefix'))) |
| pkgconf.set('exec_prefix', '${prefix}') |
| pkgconf.set('libdir', '${prefix}/@0@'.format(get_option('libdir'))) |
| pkgconf.set('includedir', '${prefix}/@0@'.format(get_option('includedir'))) |
| pkgconf.set('VERSION', opus_version) |
| pkgconf.set('PC_BUILD', pc_build) |
| pkgconf.set('LIBM', libm.found() ? '-lm' : '') |
| |
| pkg_install_dir = '@0@/pkgconfig'.format(get_option('libdir')) |
| |
| configure_file(input : 'opus.pc.in', |
| output : 'opus.pc', |
| configuration : pkgconf, |
| install_dir : pkg_install_dir) |
| |
| # The uninstalled one has hardcoded libtool + static lib stuff, skip it for now |
| #configure_file(input : 'opus-uninstalled.pc.in', |
| # output : 'opus-uninstalled.pc', |
| # configuration : pkgconf, |
| # install : false) |
| |
| doxygen = find_program('doxygen', required: get_option('docs')) |
| if doxygen.found() |
| subdir('doc') |
| endif |
| |
| summary( |
| { |
| 'C99 var arrays': opus_conf.has('VAR_ARRAYS'), |
| 'C99 lrintf': opus_conf.has('HAVE_LRINTF'), |
| 'Use alloca': msg_use_alloca, |
| }, |
| section: 'Compiler support', |
| bool_yn: true, |
| list_sep: ', ', |
| ) |
| |
| # Parse optimization status |
| foreach status : [['inline_optimization', opt_asm], |
| ['asm_optimization', opt_asm], |
| ['intrinsics_support', opt_intrinsics]] |
| res = status[0] |
| opt = status[1] |
| resval = get_variable(res) |
| if opt.disabled() |
| set_variable(res, 'disabled') |
| elif resval.length() == 0 |
| if host_cpu_family not in ['arm', 'aarch64', 'x86', 'x86_64'] |
| set_variable(res, 'No optimizations for your platform, please send patches') |
| else |
| set_variable(res, 'none') |
| endif |
| endif |
| endforeach |
| |
| summary( |
| { |
| 'Floating point support': not opt_fixed_point, |
| 'Fast float approximations': opt_float_approx, |
| 'Fixed point debugging': opt_fixed_point_debug, |
| 'Inline assembly optimizations': inline_optimization, |
| 'External assembly optimizations': asm_optimization, |
| 'Intrinsics optimizations': intrinsics_support, |
| 'Run-time CPU detection': rtcd_support, |
| }, |
| section: 'Optimizations', |
| bool_yn: true, |
| list_sep: ', ', |
| ) |
| summary( |
| { |
| 'Custom modes': opt_custom_modes, |
| 'Assertions': opt_assertions, |
| 'Hardening': opt_hardening, |
| 'Fuzzing': opt_fuzzing, |
| 'Check ASM': opt_check_asm, |
| 'API documentation': doxygen.found(), |
| 'Extra programs': not extra_programs.disabled(), |
| 'Tests': not opt_tests.disabled(), |
| }, |
| section: 'General configuration', |
| bool_yn: true, |
| list_sep: ', ', |
| ) |