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_cpu_family)
    endif
    warning('No intrinsics support for ' + host_cpu_family)
  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: ', ',
)
