1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-25 16:33:02 +00:00
mpv/waftools/detections/compiler.py
wm4 a1812e2a46 build: add -fno-math-errno
glibc/gcc make certain math functions set errno by default. This is not
required by the standard, and makes everything complexer and slower
(well done glibc). It typically prevents inlining certain math functions
too, where the compiler can turn a function call to a single
instruction, such as observed with lrint().

So this has possibly some minor performance advantages, and no
disadvantages.
2020-05-09 18:02:57 +02:00

93 lines
3.4 KiB
Python

from waflib import Utils
def __get_cc_env_vars__(cc):
cmd = cc + ['-dM', '-E', '-']
try:
p = Utils.subprocess.Popen(cmd, stdin=Utils.subprocess.PIPE,
stdout=Utils.subprocess.PIPE,
stderr=Utils.subprocess.PIPE)
p.stdin.write('\n'.encode())
return p.communicate()[0]
except Exception:
return ""
def __test_and_add_flags__(ctx, flags):
for flag in flags:
if ctx.check_cc(cflags='-Werror ' + flag, mandatory=False):
ctx.env.CFLAGS += [flag]
def __add_generic_flags__(ctx):
ctx.env.CFLAGS += ["-D_ISOC99_SOURCE", "-D_GNU_SOURCE",
"-D_FILE_OFFSET_BITS=64", "-Wall"]
if ctx.check_cc(cflags="-std=c11", mandatory=False):
ctx.env.CFLAGS += ["-std=c11"]
else:
ctx.env.CFLAGS += ["-std=c99"]
if ctx.is_optimization():
ctx.env.CFLAGS += ['-O2']
if ctx.is_debug_build():
ctx.env.CFLAGS += ['-g']
__test_and_add_flags__(ctx, ["-Werror=implicit-function-declaration",
"-Wno-error=deprecated-declarations",
"-Wno-error=unused-function",
"-Wempty-body",
"-Wdisabled-optimization",
"-Wstrict-prototypes",
"-Wno-format-zero-length",
"-Werror=format-security",
"-Wno-redundant-decls",
"-Wvla",
"-Wno-format-truncation",
"-Wimplicit-fallthrough",
])
__test_and_add_flags__(ctx, ["-fno-math-errno"])
def __add_gcc_flags__(ctx):
ctx.env.CFLAGS += ["-Wall", "-Wundef", "-Wmissing-prototypes", "-Wshadow",
"-Wno-switch", "-Wparentheses", "-Wpointer-arith",
"-Wno-pointer-sign",
# GCC bug 66425
"-Wno-unused-result"]
def __add_clang_flags__(ctx):
ctx.env.CFLAGS += ["-Wno-logical-op-parentheses", "-fcolor-diagnostics",
"-Wno-tautological-compare",
"-Wno-tautological-constant-out-of-range-compare"]
def __add_mswin_flags__(ctx):
ctx.env.CFLAGS += ['-D_WIN32_WINNT=0x0602', '-DUNICODE', '-DCOBJMACROS',
'-DINITGUID', '-U__STRICT_ANSI__']
ctx.env.LAST_LINKFLAGS += ['-Wl,--major-os-version=6,--minor-os-version=0',
'-Wl,--major-subsystem-version=6,--minor-subsystem-version=0']
def __add_mingw_flags__(ctx):
__add_mswin_flags__(ctx)
ctx.env.CFLAGS += ['-D__USE_MINGW_ANSI_STDIO=1']
ctx.env.LAST_LINKFLAGS += ['-mwindows']
def __add_cygwin_flags__(ctx):
__add_mswin_flags__(ctx)
ctx.env.CFLAGS += ['-mwin32']
__compiler_map__ = {
'__GNUC__': __add_gcc_flags__,
'__clang__': __add_clang_flags__,
'__MINGW32__': __add_mingw_flags__,
'__CYGWIN__': __add_cygwin_flags__,
}
def __apply_map__(ctx, fnmap):
if not getattr(ctx, 'CC_ENV_VARS', None):
ctx.CC_ENV_VARS = str(__get_cc_env_vars__(ctx.env.CC))
for k, fn in fnmap.items():
if ctx.CC_ENV_VARS.find(k) > 0:
fn(ctx)
def configure(ctx):
__add_generic_flags__(ctx)
__apply_map__(ctx, __compiler_map__)