# Davide Pesavento (LIP6), 2016

def options(opt):
    opt.add_option('--with-sanitizer', action='store', default='', dest='sanitizers',
                   help='Comma-separated list of compiler sanitizers to enable [default=none]')

def configure(conf):
    for san in conf.options.sanitizers.split(','):
        if not san:
            continue

        sanflag = '-fsanitize=%s' % san
        conf.start_msg('Checking if compiler supports %s' % sanflag)

        if conf.check_cxx(cxxflags=['-Werror', sanflag, '-fno-omit-frame-pointer'],
                          linkflags=[sanflag], mandatory=False):
            conf.end_msg('yes')
            conf.env.append_unique('CXXFLAGS', [sanflag, '-fno-omit-frame-pointer'])
            conf.env.append_unique('LINKFLAGS', [sanflag])
        else:
            conf.end_msg('no', color='RED')
            conf.fatal('%s sanitizer is not supported by the current compiler' % san)
