使用Bazel构建Envoy时genrule的cmd参数报缺少终止双引号错误
问题根因
你遇到的报错是Bazel genrule的cmd字符串转义层数不匹配导致的,genrule的cmd内容会经过两次解析:
- 首先Bazel的Starlark语法层会解析一次字符串转义
- 之后生成的命令会交给shell层做第二次解析
你现有写法中的转义规则经过两次解析后,shell执行时会出现双引号匹配逻辑混乱,最终抛出missing terminating '"'错误。
解决方案
推荐以下两种改动方案,任选一种即可:
方案1:调整引号嵌套规则,规避转义冲突
将原有genrule的cmd参数替换为以下写法,用单引号包裹静态字符串部分,避免多层转义:
genrule( name = "generate_version_number", srcs = ["//:VERSION"], outs = ["version_number.h"], cmd = """echo '#define BUILD_VERSION_NUMBER "'$$(cat $<)'"' > $@""", visibility = ["//visibility:private"], )
方案2:改用printf代替echo,兼容性更强
不同系统的shell对echo命令的转义处理逻辑存在差异,改用行为统一的printf可以彻底避免这类问题:
genrule( name = "generate_version_number", srcs = ["//:VERSION"], outs = ["version_number.h"], cmd = """printf '#define BUILD_VERSION_NUMBER "%s"\n' "$$(cat $<)" > $@""", visibility = ["//visibility:private"], )
内容的提问来源于stack exchange,提问作者Joe Schmo
相关产品推荐
相关产品推荐

