| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675 | 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')  endifendifif cc.get_argument_syntax() == 'gnu'  add_project_arguments('-D_FORTIFY_SOURCE=2', language: 'c')endif# Check for extra compiler argsadditional_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']  endifendifforeach arg : additional_c_args  if cc.has_argument(arg)    add_project_arguments(arg, language: 'c')  endifendforeach# Windows MSVC warningsif 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')endifopus_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 dependencyhave_arm_ne10 = falselibm = 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 keywordrestrict_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', '/**/')  endifendif# Check for C99 variable-size arrays, or alloca() as fallbackmsg_use_alloca = falseif 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 = trueelif 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 = trueendifopts = [  [ '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)endforeachopt_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 fileif opt_fixed_point  pc_build = 'fixed-point'else  pc_build = 'floating-point'endifif opt_custom_modes  pc_build = pc_build + ', custom modes'endifrtcd_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 = trueif 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  endifendifopus_arm_external_asm = falseasm_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  endifendif # 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 = falsehave_sse2 = falsehave_sse4_1 = falsehave_avx = false # no avx opus code yethave_neon_intr = falseintrinsics_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())  endifendif# 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')endifif 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  endifendif# extract source file lists from .mk filesmk_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)}endforeachsubdir('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')endifsummary(  {    '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 statusforeach 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  endifendforeachsummary(  {    '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: ', ',)
 |