Mesa (master): scons: Prefer winflexbison, and use --wincompat when available.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Sun Mar 22 08:23:37 UTC 2015


Module: Mesa
Branch: master
Commit: 9c1c657e19ff373315b517ca58f87227b336f3b7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9c1c657e19ff373315b517ca58f87227b336f3b7

Author: Jose Fonseca <jfonseca at vmware.com>
Date:   Thu Mar 19 13:30:19 2015 +0000

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 <brianp at vmware.com>

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 9dbfce5..a90c2b2 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.
 <br>
 On Windows with MinGW, install flex and bison with:
 <pre>mingw-get install msys-flex msys-bison</pre>
-For MSVC on Windows, you can find flex/bison programs on the
-<a href="ftp://ftp.freedesktop.org/pub/mesa/windows-utils/">Mesa ftp site</a>.
+For MSVC on Windows, install
+<a href="http://winflexbison.sourceforge.net/">Win flex-bison</a>.
 </li>
 </ul>
 
diff --git a/scons/gallium.py b/scons/gallium.py
index 9924f1e..1564970 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 <io.h> instead of <unistd.h> 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')
     




More information about the mesa-commit mailing list