如何让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
相关产品推荐
相关产品推荐

