--- /dev/null
+# Code coverage
+
+code_coverage = get_option('code-coverage')
+
+if code_coverage
+ args = ['-U_FORTIFY_SOURCE', '-g', '-O0', '-fprofile-arcs', '-ftest-coverage']
+
+ foreach arg: args
+ if not cxx.has_argument(arg)
+ error('Compiler does not support ' + arg + ', which is needed for code coverage')
+ break
+ endif
+ endforeach
+
+ add_global_arguments(args, language: ['cpp'])
+endif
+
+summary('Code Coverage', code_coverage, bool_yn: true, section: 'Configuration')
--- /dev/null
+# Link-time Optimization
+
+opt_lto = get_option('lto')
+
+if opt_lto == 'thin'
+ compiler_opt = '-flto=thin'
+ if cxx.has_argument(compiler_opt)
+ add_global_arguments(compiler_opt, language: ['c', 'cpp'])
+ add_global_link_arguments(compiler_opt, language: ['c', 'cpp'])
+ else
+ opt_lto = 'auto'
+ endif
+endif
+
+if opt_lto == 'auto'
+ compiler_opt = '-flto=auto'
+ if cxx.has_argument(compiler_opt)
+ add_global_arguments(compiler_opt, language: ['c', 'cpp'])
+ add_global_link_arguments(compiler_opt, language: ['c', 'cpp'])
+ else
+ opt_lto = 'yes'
+ endif
+endif
+
+if opt_lto == 'yes'
+ compiler_opt = '-flto'
+ if cxx.has_argument(compiler_opt)
+ add_global_arguments(compiler_opt, language: ['c', 'cpp'])
+ add_global_link_arguments(compiler_opt, language: ['c', 'cpp'])
+ else
+ error('LTO was requested but is not supported')
+ endif
+endif
+
+summary('LTO', opt_lto, section: 'Configuration')
--- /dev/null
+# TODO Use meson's -Db_coverage option?
+# option('code-coverage', type: 'boolean', value: false, description: 'Enable code coverage')
+# TODO Use meson's -Db_sanitize option?
+# option('sanitizer-address', type: 'boolean', value: false, description: 'Enable the Address Sanitizer')
+# option('sanitizer-memory', type: 'boolean', value: false, description: 'Enable the Memory Sanitizer')
+# option('sanitizer-thread', type: 'boolean', value: false, description: 'Enable the Thread Sanitizer')
+# option('sanitizer-leak', type: 'boolean', value: false, description: 'Enable the Leak Sanitizer')
+# option('sanitizer-undefined', type: 'boolean', value: false, description: 'Enable the Undefined Behavior Sanitizer')
+# TODO Use meson's -Db_lto* options?
+# option('lto', type: 'combo', choices: ['yes', 'no', 'thin', 'auto'], value: 'no', description: 'Enable link-time optimization')
--- /dev/null
+# PIE
+# Inputs: hardening_features conf
+
+prog = '''
+#include <pthread.h>
+__thread unsigned int t_id;
+
+int main() {
+ t_id = 1;
+ return 0;
+}
+'''
+
+found_variant = false
+if system == 'windows' and system == 'cygwin'
+ # All code is position independent on Win32 targets.
+ found_variant = true
+else
+ pie_variants = [
+ [['-fPIE', '-DPIE'], ['-pie']],
+ [['-fPIE', '-DPIE'], ['-Wl,-pie']],
+ ]
+ foreach variant: pie_variants
+ cflags = variant[0]
+ ldflags = variant[1]
+
+ if cxx.links(prog, args: cflags + ldflags, name: 'compiler can build Position Independent Executables')
+ add_global_arguments(cflags, language: ['cpp'])
+ add_global_link_arguments(ldflags, language: ['cpp'])
+ found_variant = true
+ break
+ endif
+ endforeach
+endif
+
+hardening_features += [[found_variant, 'Building position independent executables (PIEs)']]
+conf.set10('PIE', found_variant, description: 'Whether we enable building a Position Independent Executable (PIE)')
+summary('PIE', found_variant, bool_yn: true, section: 'Hardening')