要解决“Bazel midl规则生成的C++头文件和winmd文件位于不同的文件夹中”的问题,您可以使用Bazel的自定义规则来实现。
首先,您需要定义一个自定义规则来生成C++头文件和winmd文件。以下是一个示例:
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
# 定义自定义规则
def midl_rule(name, srcs):
# 编译C++头文件
midl_cpp = rule(
implementation = _midl_cpp_impl,
attrs = {
"srcs": attr.label_list(allow_files=True),
"cpp_out": attr.output(),
},
)
# 编译winmd文件
midl_winmd = rule(
implementation = _midl_winmd_impl,
attrs = {
"srcs": attr.label_list(allow_files=True),
"winmd_out": attr.output(),
},
)
# 生成C++头文件和winmd文件
midl_cpp_result = midl_cpp(
name = name + "_cpp",
srcs = srcs,
)
midl_winmd_result = midl_winmd(
name = name + "_winmd",
srcs = srcs,
)
return [midl_cpp_result, midl_winmd_result]
# 实现C++头文件生成规则
def _midl_cpp_impl(ctx):
inputs = ctx.files.srcs
cpp_out = ctx.outputs.cpp_out
# 执行生成C++头文件的命令
ctx.actions.run(
inputs = inputs,
outputs = [cpp_out],
executable = "midl",
arguments = ["-cpp_out", cpp_out.path] + inputs,
)
# 实现winmd文件生成规则
def _midl_winmd_impl(ctx):
inputs = ctx.files.srcs
winmd_out = ctx.outputs.winmd_out
# 执行生成winmd文件的命令
ctx.actions.run(
inputs = inputs,
outputs = [winmd_out],
executable = "midl",
arguments = ["-winmd_out", winmd_out.path] + inputs,
)
然后,您可以在BUILD文件中使用自定义规则来生成C++头文件和winmd文件,并将它们放置在不同的文件夹中。以下是一个示例:
load("//path/to/midl_rule:defs.bzl", "midl_rule")
midl_rule(
name = "my_midl_files",
srcs = glob(["*.idl"]),
cpp_out = "cpp_files",
winmd_out = "winmd_files",
)
上述示例中,cpp_out
和winmd_out
参数可以用来指定生成的C++头文件和winmd文件的输出路径。
使用以上的自定义规则和示例代码,您可以将Bazel midl规则生成的C++头文件和winmd文件放置在不同的文件夹中。