Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定制C++;使用cc_公共API的规则 我试图编写自定义规则来使用CcUng+API编写C++代码。以下是我当前的实现尝试: load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "C_COMPILE_ACTION_NAME") def _impl(ctx): cc_toolchain = find_cpp_toolchain(ctx) feature_configuration = cc_common.configure_features( cc_toolchain = cc_toolchain, unsupported_features = ctx.disabled_features, ) compiler = cc_common.get_tool_for_action( feature_configuration=feature_configuration, action_name=C_COMPILE_ACTION_NAME ) compile_variables = cc_common.create_compile_variables( feature_configuration = feature_configuration, cc_toolchain = cc_toolchain, ) compiler_options = cc_common.get_memory_inefficient_command_line( feature_configuration = feature_configuration, action_name = C_COMPILE_ACTION_NAME, variables = compile_variables, ) outfile = ctx.actions.declare_file("test.o") args = ctx.actions.args() args.add_all(compiler_options) ctx.actions.run( outputs = [outfile], inputs = ctx.files.srcs, executable = compiler, arguments = [args], ) return [DefaultInfo(files = depset([outfile]))]_Bazel - Fatal编程技术网

定制C++;使用cc_公共API的规则 我试图编写自定义规则来使用CcUng+API编写C++代码。以下是我当前的实现尝试: load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "C_COMPILE_ACTION_NAME") def _impl(ctx): cc_toolchain = find_cpp_toolchain(ctx) feature_configuration = cc_common.configure_features( cc_toolchain = cc_toolchain, unsupported_features = ctx.disabled_features, ) compiler = cc_common.get_tool_for_action( feature_configuration=feature_configuration, action_name=C_COMPILE_ACTION_NAME ) compile_variables = cc_common.create_compile_variables( feature_configuration = feature_configuration, cc_toolchain = cc_toolchain, ) compiler_options = cc_common.get_memory_inefficient_command_line( feature_configuration = feature_configuration, action_name = C_COMPILE_ACTION_NAME, variables = compile_variables, ) outfile = ctx.actions.declare_file("test.o") args = ctx.actions.args() args.add_all(compiler_options) ctx.actions.run( outputs = [outfile], inputs = ctx.files.srcs, executable = compiler, arguments = [args], ) return [DefaultInfo(files = depset([outfile]))]

定制C++;使用cc_公共API的规则 我试图编写自定义规则来使用CcUng+API编写C++代码。以下是我当前的实现尝试: load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "C_COMPILE_ACTION_NAME") def _impl(ctx): cc_toolchain = find_cpp_toolchain(ctx) feature_configuration = cc_common.configure_features( cc_toolchain = cc_toolchain, unsupported_features = ctx.disabled_features, ) compiler = cc_common.get_tool_for_action( feature_configuration=feature_configuration, action_name=C_COMPILE_ACTION_NAME ) compile_variables = cc_common.create_compile_variables( feature_configuration = feature_configuration, cc_toolchain = cc_toolchain, ) compiler_options = cc_common.get_memory_inefficient_command_line( feature_configuration = feature_configuration, action_name = C_COMPILE_ACTION_NAME, variables = compile_variables, ) outfile = ctx.actions.declare_file("test.o") args = ctx.actions.args() args.add_all(compiler_options) ctx.actions.run( outputs = [outfile], inputs = ctx.files.srcs, executable = compiler, arguments = [args], ) return [DefaultInfo(files = depset([outfile]))],bazel,Bazel,但是,此操作失败,错误为“execvp(外部/本地\u配置\u cc/wrapped\u clang,…”:没有这样的文件或目录。我假设这是因为get\u tool\u for\u action返回一个表示路径的字符串,而不是文件对象,因此Bazel不会将wrapped\u clang添加到沙箱中。在禁用沙箱的情况下执行规则似乎证实了这一点,因为它已成功完成 有没有办法在不禁用沙箱的情况下实现此自定义规则 如果使用ctx.actions.run\u shell可以将与工具链关联的文件添加到输入中

但是,此操作失败,错误为“execvp(外部/本地\u配置\u cc/wrapped\u clang,…”:没有这样的文件或目录。我假设这是因为
get\u tool\u for\u action
返回一个表示路径的字符串,而不是文件对象,因此Bazel不会将
wrapped\u clang
添加到沙箱中。在禁用沙箱的情况下执行规则似乎证实了这一点,因为它已成功完成


有没有办法在不禁用沙箱的情况下实现此自定义规则

如果使用
ctx.actions.run\u shell
可以将与工具链关联的文件添加到输入中(
ctx.attr.\u cc\u toolchain.files
)。此外,您还需要添加编译器环境变量。例如

srcs = depset(ctx.files.srcs)
tools = ctx.attr._cc_toolchain.files
...
compiler_env = cc_common.get_environment_variables(
   feature_configuration = feature_configuration,
   action_name = C_COMPILE_ACTION_NAME,
   variables = compiler_variables,
)
...
args = ctx.actions.args()
args.add_all(compiler_options)
ctx.actions.run_shell(
    outputs = [outfile],
    inputs = depset(transitive = [srcs, tools]), # Merge src and tools depsets
    command = "{compiler} $*".format(compiler = compiler),
    arguments = [args],
    env = compiler_env,
)

Bazel不会自动添加文件作为操作输入,您必须明确地添加文件,就像您在第二种方法(
ctx.attr.\u cc\u toolchain.files
)中所做的那样。这样,
ctx.actions.run
应该可以正常工作。

这个问题是我不确定如何从
cc_common.get_tool_for_action
返回的字符串中获取与该工具相关联的实际文件(实际上,我仍然不确定如何做-使用
ctx.attr.\u cc_toolchain.files
似乎是一种黑客行为。)我知道这些文件不是自动添加的。ctx.attr.\u cc\u toolchain.files是从隐式依赖项获取FileToBuildProvider的基本方法。所以没必要担心。从cc_工具链生成的文件与这些文件的路径之间存在(非常不幸的)分离。理想情况下,get_tool_for_操作将返回一个工件和一组相关的dep。我们现在不在这里,get_tool_for_action返回一个字符串,实际操作输入来自cc_toolchain.files。