From 9c1c657e19ff373315b517ca58f87227b336f3b7 Mon Sep 17 00:00:00 2001 From: Jose Fonseca Date: Thu, 19 Mar 2015 13:30:19 +0000 Subject: [PATCH] scons: Prefer winflexbison, and use --wincompat when available. This avoids MSVC the warning warning C4013: 'isatty' undefined; assuming extern returning int with certain versions of flex. Reviewed-by: Brian Paul v2: Add win flex-bison link to docs/install.html. --- docs/install.html | 4 ++-- scons/gallium.py | 40 +++++++++++++++++++++++++++++++++------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/docs/install.html b/docs/install.html index 9dbfce58b51..a90c2b27d58 100644 --- a/docs/install.html +++ b/docs/install.html @@ -55,8 +55,8 @@ Versions 2.5.35 and 2.4.1, respectively, (or later) should work.
On Windows with MinGW, install flex and bison with:
mingw-get install msys-flex msys-bison
-For MSVC on Windows, you can find flex/bison programs on the -Mesa ftp site. +For MSVC on Windows, install +Win flex-bison. diff --git a/scons/gallium.py b/scons/gallium.py index 9924f1e7dce..15649709079 100755 --- a/scons/gallium.py +++ b/scons/gallium.py @@ -35,7 +35,7 @@ import os import os.path import re import subprocess -import platform as _platform +import platform as host_platform import sys import tempfile @@ -147,6 +147,17 @@ def check_cc(env, cc, expr, cpp_opt = '-E'): return result +def check_prog(env, prog): + """Check whether this program exists.""" + + sys.stdout.write('Checking for %s ... ' % prog) + + result = env.Detect(prog) + + sys.stdout.write(' %s\n' % ['no', 'yes'][int(bool(result))]) + return result + + def generate(env): """Common environment generation code""" @@ -186,7 +197,7 @@ def generate(env): env['gcc'] = 0 env['clang'] = 0 env['msvc'] = 0 - if _platform.system() == 'Windows': + if host_platform.system() == 'Windows': env['msvc'] = check_cc(env, 'MSVC', 'defined(_MSC_VER)', '/E') if not env['msvc']: env['gcc'] = check_cc(env, 'GCC', 'defined(__GNUC__) && !defined(__clang__)') @@ -210,10 +221,10 @@ def generate(env): # Determine whether we are cross compiling; in particular, whether we need # to compile code generators with a different compiler as the target code. - host_platform = _platform.system().lower() - if host_platform.startswith('cygwin'): - host_platform = 'cygwin' - host_machine = os.environ.get('PROCESSOR_ARCHITEW6432', os.environ.get('PROCESSOR_ARCHITECTURE', _platform.machine())) + hosthost_platform = host_platform.system().lower() + if hosthost_platform.startswith('cygwin'): + hosthost_platform = 'cygwin' + host_machine = os.environ.get('PROCESSOR_ARCHITEW6432', os.environ.get('PROCESSOR_ARCHITECTURE', host_platform.machine())) host_machine = { 'x86': 'x86', 'i386': 'x86', @@ -224,7 +235,7 @@ def generate(env): 'AMD64': 'x86_64', 'x86_64': 'x86_64', }.get(host_machine, 'generic') - env['crosscompile'] = platform != host_platform + env['crosscompile'] = platform != hosthost_platform if machine == 'x86_64' and host_machine != 'x86_64': env['crosscompile'] = True env['hostonly'] = False @@ -630,7 +641,22 @@ def generate(env): # disable all MSVC extensions. '-DYY_USE_CONST=', ]) + if host_platform.system() == 'Windows': + # Prefer winflexbison binaries, as not only they are easier to install + # (no additional dependencies), but also better Windows support. + if check_prog(env, 'win_flex'): + env["LEX"] = 'win_flex' + env.Append(LEXFLAGS = [ + # windows compatibility (uses instead of and + # _isatty, _fileno functions) + '--wincompat' + ]) + env.Tool('yacc') + if host_platform.system() == 'Windows': + if check_prog(env, 'win_bison'): + env["YACC"] = 'win_bison' + if env['llvm']: env.Tool('llvm') -- 2.30.2