diff options
Diffstat (limited to 'src/engine/SCons/Tool/lex.py')
| -rw-r--r-- | src/engine/SCons/Tool/lex.py | 54 | 
1 files changed, 49 insertions, 5 deletions
diff --git a/src/engine/SCons/Tool/lex.py b/src/engine/SCons/Tool/lex.py index e185b93..4831776 100644 --- a/src/engine/SCons/Tool/lex.py +++ b/src/engine/SCons/Tool/lex.py @@ -9,7 +9,7 @@ selection method.  """  # -# Copyright (c) 2001 - 2017 The SCons Foundation +# Copyright (c) 2001 - 2019 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -31,16 +31,25 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/lex.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" +__revision__ = "src/engine/SCons/Tool/lex.py e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan"  import os.path +import sys  import SCons.Action  import SCons.Tool  import SCons.Util +from SCons.Platform.mingw import MINGW_DEFAULT_PATHS +from SCons.Platform.cygwin import CYGWIN_DEFAULT_PATHS +from SCons.Platform.win32 import CHOCO_DEFAULT_PATH  LexAction = SCons.Action.Action("$LEXCOM", "$LEXCOMSTR") +if sys.platform == 'win32': +    BINS = ['flex', 'lex', 'win_flex'] +else: +    BINS = ["flex", "lex"] +  def lexEmitter(target, source, env):      sourceBase, sourceExt = os.path.splitext(SCons.Util.to_String(source[0])) @@ -64,6 +73,29 @@ def lexEmitter(target, source, env):                  target.append(fileName)      return (target, source) +def get_lex_path(env, append_paths=False): +    """ +    Find the path to the lex tool, searching several possible names + +    Only called in the Windows case, so the default_path +    can be Windows-specific + +    :param env: current construction environment +    :param append_paths: if set, add the path to the tool to PATH +    :return: path to lex tool, if found +    """ +    for prog in BINS: +        bin_path = SCons.Tool.find_program_path( +            env, +            prog, +            default_paths=CHOCO_DEFAULT_PATH + MINGW_DEFAULT_PATHS + CYGWIN_DEFAULT_PATHS ) +        if bin_path: +            if append_paths: +                env.AppendENVPath('PATH', os.path.dirname(bin_path)) +            return bin_path +    SCons.Warnings.Warning('lex tool requested, but lex or flex binary not found in ENV PATH') + +  def generate(env):      """Add Builders and construction variables for lex to an Environment."""      c_file, cxx_file = SCons.Tool.createCFileBuilders(env) @@ -83,12 +115,24 @@ def generate(env):      cxx_file.add_action(".ll", LexAction)      cxx_file.add_emitter(".ll", lexEmitter) -    env["LEX"]      = env.Detect("flex") or "lex"      env["LEXFLAGS"] = SCons.Util.CLVar("") -    env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET" + +    if sys.platform == 'win32': +        # ignore the return - we do not need the full path here +        _ = get_lex_path(env, append_paths=True) +        env["LEX"] = env.Detect(BINS) +        if not env.get("LEXUNISTD"): +            env["LEXUNISTD"] = SCons.Util.CLVar("") +        env["LEXCOM"] = "$LEX $LEXUNISTD $LEXFLAGS -t $SOURCES > $TARGET" +    else: +        env["LEX"] = env.Detect(BINS) +        env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET"  def exists(env): -    return env.Detect(["flex", "lex"]) +    if sys.platform == 'win32': +        return get_lex_path(env) +    else: +        return env.Detect(BINS)  # Local Variables:  # tab-width:4  | 
