能否在Bazel中指定含$符号的文件名作为输入文件?
在Bazel中指定含$符号的文件名作为输入
完全可以,问题出在你对$符号的转义时机和方式上,正确处理方式如下:
核心要点
- filegroup的srcs列表无需转义$:直接写原始文件名(比如
"ContextFinder$5.class")即可。Bazel解析文件路径时不会把$当成Make变量语法,之前用$$转义导致Bazel去寻找带两个$的文件(如ContextFinder$$1.class),但实际你的文件是单个$的,自然找不到。 - genrule的cmd属性需通过Bazel变量引用文件:错误提示里的
'$1' syntax is not supported是因为在genrule的cmd中直接写带$的文件名时,shell会把$1当成位置参数解析。解决办法是用Bazel提供的$(locations)或$(location)变量获取文件路径,Bazel会自动处理文件名中的特殊字符,无需手动转义。
正确示例
package(<redacted>) filegroup( name = "class_overrides", srcs = [ "ContextFinder$1.class", "ContextFinder$2.class", "ContextFinder$3.class", "ContextFinder$4.class", "ContextFinder$5.class", "ContextFinder.class" ], ) # 以genrule为例,正确引用带$的文件 genrule( name = "process_classes", srcs = [":class_overrides"], outs = ["processed_output.txt"], cmd = "cat $(locations :class_overrides) > $@", )
补充说明
$(locations :target)会展开为该目标下所有文件的完整路径,自动处理特殊字符;如果是单个文件,用$(location :file_target)即可。- 不要在srcs里转义$,也不要在cmd里直接写带$的文件名,让Bazel通过变量传递文件路径是最稳妥的方式。
内容的提问来源于stack exchange,提问作者merlin2011
相关产品推荐
相关产品推荐

