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

Jose Fonseca jfonseca at vmware.com
Fri Mar 20 08:30:43 PDT 2015


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?


Jose


More information about the mesa-dev mailing list