mirror of
https://github.com/mpv-player/mpv
synced 2024-11-18 21:16:10 +01:00
257a2b9646
Directory-opening never worked on Windows because MSVCRT's open() doesn't open directories and its fstat() doesn't recognise directory handles. These are just MSVCRT restrictions, and the Windows API itself has no problem with opening directories as file objects, so reimplement mpv's mp_open and mp_stat to use the Windows API directly. This should fix directory playback. This also populates the st_dev and st_ino fields of struct stat, so filesystem loop checking in demux_playlist.c should now work on Windows. Fixes #4711
86 lines
3.2 KiB
Python
86 lines
3.2 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:
|
|
ctx.check_cc(cflags=flag, uselib_store="compiler", mandatory=False)
|
|
ctx.env.CFLAGS += ctx.env.CFLAGS_compiler
|
|
|
|
def __add_generic_flags__(ctx):
|
|
ctx.env.CFLAGS += ["-D_ISOC99_SOURCE", "-D_GNU_SOURCE",
|
|
"-D_LARGEFILE_SOURCE", "-D_FILE_OFFSET_BITS=64",
|
|
"-D_LARGEFILE64_SOURCE",
|
|
"-std=c99", "-Wall"]
|
|
|
|
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"])
|
|
|
|
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 += ['-municode', '-D__USE_MINGW_ANSI_STDIO=1']
|
|
ctx.env.LAST_LINKFLAGS += ['-municode', '-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__)
|