[Mesa-dev] [PATCH 09/15] scons: Prefer winflexbison, and use --wincompat when available.

Brian Paul brianp at vmware.com
Fri Mar 20 08:39:58 PDT 2015


On 03/20/2015 09:30 AM, Jose Fonseca wrote:
> On 20/03/15 14:36, Brian Paul wrote:
>> On 03/20/2015 07:59 AM, Jose Fonseca wrote:
>>> This avoids MSVC the warning
>>>
>>>    warning C4013: 'isatty' undefined; assuming extern returning int
>>>
>>> with certain versions of flex.
>>> ---
>>>   scons/gallium.py | 39 ++++++++++++++++++++++++++++++++-------
>>>   1 file changed, 32 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/scons/gallium.py b/scons/gallium.py
>>> index 9924f1e..9fe2dbd 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,15 @@ def check_cc(env, cc, expr, cpp_opt = '-E'):
>>>       return result
>>>
>>>
>>> +def check_prog(env, prog):
>>
>> Maybe put a """comment""" here to explain what this function does.
>>
>>
>>> +    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 +195,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 +219,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 +233,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 +639,23 @@ def generate(env):
>>>               # disable all MSVC extensions.
>>>               '-DYY_USE_CONST=',
>>>           ])
>>> +    if host_platform.system() == 'Windows':
>>> +        # Prefer winflexbison binaries --
>>> http://winflexbison.sourceforge.net/
>>> +        # --, 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')
>>>
>>>
>>
>> I wasn't aware of winflexbison.
>
> Yeah, I only came across it recently.  I remember searching for a native
> Win32 version of flex/bison that didn't depend on cygwin/msys just 1-2
> years ago and not finding it.
>
>  > We should probably put a link to it on
>> the http://www.mesa3d.org/install.html#prereq-general page.
>
> Sure.  I'll move the link to there.
>
>
> BTW, it would be to have the Windows build instructions that are spread
> between  README.WIN32, install.html, and to some extent llvmpipe.htm, in
> a single place.  I presume that that single place should be install.html?

Maybe there should be a windows.html page which captures all the Windows 
build instructions.  Feel free to do whatever's easiest.

-Brian



More information about the mesa-dev mailing list