You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SCons 4.x的TryCompile支持yacc源文件编译检测

SCons 4.x版本Yacc配置测试失败解决方案

问题根因

SCons 4.x 重构了Configure上下文的环境隔离逻辑,TryCompile 方法默认仅支持直接编译C/C++等原生编译类型后缀的文件,不会自动继承主环境中yacc工具注册的 .y 后缀到C文件的生成规则,因此无法识别.y文件的编译流程,抛出后缀不支持的错误。

修复方案

调整自定义CheckYacc测试逻辑,给Configure上下文环境手动加载yacc工具的构建规则,同时改用TryBuild显式走完整的.y→.c→目标文件的构建流程,修改后可正常兼容3.x和4.x版本,修改后完整代码如下:

env = Environment(tools = ['default','yacc','lex','swig'])

yacc_test_text = """
%{
#include <stdio.h>

/* MSVC++ needs this before it can swallow Bison output */
#ifdef _MSC_VER
# define __STDC__
#endif
%}
%token MSG
%start ROOT
%%
ROOT:
    MSG { printf("HELLO"); } 
    ;
%%
"""

def CheckYacc(context):
    context.Message("Checking for Yacc ('%s')... " % context.env.get('YACC'))
    # 给上下文环境手动加载yacc工具,注册.y后缀的构建规则
    context.env.Tool('yacc')
    # 显式调用Object构建器,走.y生成.c再编译的完整流程
    is_ok = context.TryBuild(context.env.Object, yacc_test_text, ".y")
    context.Result(is_ok)
    return is_ok
    
conf = Configure(env, custom_tests = {'CheckYacc' : CheckYacc})

conf.env['HAVE_YACC'] = True
if not conf.CheckYacc():
    conf.env['HAVE_YACC'] = False

conf.Finish()

if env['HAVE_YACC']:
    print("yacc is ok")
else:
    print("yacc is broken")

修改点说明

  • 在CheckYacc测试逻辑中新增context.env.Tool('yacc'),给上下文环境手动注册yacc的后缀处理规则
  • 将原本的TryCompile替换为TryBuild(context.env.Object, ...),显式指定用Object构建器处理,完整触发yacc代码生成+编译的全流程
  • 修正了原示例中拼写错误的borken为broken

内容的提问来源于stack exchange,提问作者jdpipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 19:39:03