Bazel 的 Mingw-w64 工具链(Ubuntu 20.04.1)
Mingw-w64 toolchain for Bazel (Ubuntu 20.04.1 )
我正在尝试使用 Bazel 在 Ubuntu 上为 mingw-w64 创建我的工具链。我正在学习本教程:https://docs.bazel.build/versions/master/tutorial/cc-toolchain-config.html。但是,当我尝试将编译器的路径调整为我的 mingw64 安装路径时,出现以下错误:
bazel build --config=mingw_config -s //main:hello-world --verbose_failures
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (16 packages loaded, 46 targets configured).
INFO: Found 1 target...
SUBCOMMAND: # //main:hello-world [action 'Compiling main/hello-world.cc', configuration: a79594d39f0782b210e102e89b8a67dda26e295f95805aa9c0140f6281fdd3f5, execution platform: @local_config_platform//:host]
(cd /home/federica/.cache/bazel/_bazel_federica/fb36143429cca4c38e61a5e83150e333/execroot/__main__ && \
exec env - \
PATH=/home/federica/.cache/bazelisk/downloads/bazelbuild/bazel-3.5.0-linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
PWD=/proc/self/cwd \
/usr/bin/x86_64-w64-mingw32-gcc -MD -MF bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.d '-frandom-seed=bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o' -iquote . -iquote bazel-out/k8-fastbuild/bin -iquote external/bazel_tools -iquote bazel-out/k8-fastbuild/bin/external/bazel_tools -c main/hello-world.cc -o bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o)
SUBCOMMAND: # //main:hello-world [action 'Linking main/hello-world', configuration: a79594d39f0782b210e102e89b8a67dda26e295f95805aa9c0140f6281fdd3f5, execution platform: @local_config_platform//:host]
(cd /home/federica/.cache/bazel/_bazel_federica/fb36143429cca4c38e61a5e83150e333/execroot/__main__ && \
exec env - \
PATH=/home/federica/.cache/bazelisk/downloads/bazelbuild/bazel-3.5.0-linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
PWD=/proc/self/cwd \
/usr/bin/x86_64-w64-mingw32-gcc -o bazel-out/k8-fastbuild/bin/main/hello-world bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o -Wl,-S -lstdc++)
ERROR: /home/federica/examples/cpp_mingw_toolchain/stage1/main/BUILD:3:10: output 'main/hello-world' was not created
ERROR: /home/federica/examples/cpp_mingw_toolchain/stage1/main/BUILD:3:10: not all outputs were created or valid
Target //main:hello-world failed to build
INFO: Elapsed time: 9.390s, Critical Path: 0.58s
INFO: 2 processes: 2 linux-sandbox.
FAILED: Build did NOT complete successfully
如果我查看内部 bazel-out/k8-fastbuild/bin/main/hello-world
,则不会创建可执行文件。
但是,如果我尝试在 bash 中 运行 从 verbose_failures:
指示的单个命令
cd /home/federica/.cache/bazel/_bazel_federica/fb36143429cca4c38e61a5e83150e333/execroot/__main__ && \
exec env - \
PATH=/home/federica/.cache/bazelisk/downloads/bazelbuild/bazel-3.5.0-linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
PWD=/proc/self/cwd \
/usr/bin/x86_64-w64-mingw32-gcc -o bazel-out/k8-fastbuild/bin/main/hello-world bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o -Wl,-S -lstdc++
可执行文件'Hello-world.exe'创建成功。
有什么问题的建议吗?
下面是我的工具链 BUILD 文件
package(default_visibility = ["//visibility:public"])
cc_toolchain_suite(
name = "mingw_suite",
toolchains = {
"k8": ":k8_toolchain",
},
)
filegroup(name = "empty")
cc_toolchain(
name = "k8_toolchain",
toolchain_identifier = "k8-toolchain",
toolchain_config = ":k8_toolchain_config",
all_files = ":empty",
compiler_files = ":empty",
dwp_files = ":empty",
linker_files = ":empty",
objcopy_files = ":empty",
strip_files = ":empty",
supports_param_files = 0,
)
load(":cc_toolchain_config.bzl", "cc_toolchain_config")
cc_toolchain_config(name = "k8_toolchain_config")
和 cc_toolchain_config.bzl:
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
# NEW
load(
"@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
"feature",
"flag_group",
"flag_set",
"tool_path",
)
all_link_actions = [ # NEW
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]
def _impl(ctx):
tool_paths = [ # NEW
tool_path(
name = "gcc",
path = "/usr/bin/x86_64-w64-mingw32-gcc",
),
tool_path(
name = "ld",
path = "/usr/bin/x86_64-w64-mingw32-ld",
),
tool_path(
name = "ar",
path = "/usr/bin/x86_64-w64-mingw32-ld",
),
tool_path(
name = "cpp",
path = "/bin/false",
),
tool_path(
name = "gcov",
path = "/bin/false",
),
tool_path(
name = "nm",
path = "/bin/false",
),
tool_path(
name = "objdump",
path = "/bin/false",
),
tool_path(
name = "strip",
path = "/bin/false",
),
]
features = [ # NEW
feature(
name = "default_linker_flags",
enabled = True,
flag_sets = [
flag_set(
actions = all_link_actions,
flag_groups = ([
flag_group(
flags = [
"-lstdc++",
],
),
]),
),
],
),
]
return cc_common.create_cc_toolchain_config_info(
ctx = ctx,
features = features, # NEW
cxx_builtin_include_directories = [ # NEW
"/usr/x86_64-w64-mingw32/include",
"/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include/c++",
"/usr/share/mingw-w64/include",
"/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include",
"/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include-fixed",
"/usr/include",
],
toolchain_identifier = "k8-toolchain",
host_system_name = "local",
target_system_name = "local",
target_cpu = "k8",
target_libc = "unknown",
compiler = "i686-w64-mingw32-gcc",
abi_version = "unknown",
abi_libc_version = "unknown",
tool_paths = tool_paths,
)
cc_toolchain_config = rule(
implementation = _impl,
attrs = {},
provides = [CcToolchainConfigInfo],
)
非常感谢您的帮助!
这个问题比较容易漏掉,其实你的问题里已经包含了,错误是hello-world
没有创建,而hello-world.exe
显然已经生成了就好了。也就是说,我们实际上已经构建了一个带有 .exe
后缀的文件,但没有通过它的工具链配置告诉 bazel
是这种情况,没有它就无法预期输出。
为了解决这个问题,您还可以从 @bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl
加载:artifact_name_pattern
和其他符号,然后设置 cc_common.create_cc_toolchain_config_info()
的 artifact_name_patterns
属性:
artifact_name_patterns = [
artifact_name_pattern(
category_name = "executable",
prefix = "",
extension = ".exe",
),
]
我正在尝试使用 Bazel 在 Ubuntu 上为 mingw-w64 创建我的工具链。我正在学习本教程:https://docs.bazel.build/versions/master/tutorial/cc-toolchain-config.html。但是,当我尝试将编译器的路径调整为我的 mingw64 安装路径时,出现以下错误:
bazel build --config=mingw_config -s //main:hello-world --verbose_failures
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (16 packages loaded, 46 targets configured).
INFO: Found 1 target...
SUBCOMMAND: # //main:hello-world [action 'Compiling main/hello-world.cc', configuration: a79594d39f0782b210e102e89b8a67dda26e295f95805aa9c0140f6281fdd3f5, execution platform: @local_config_platform//:host]
(cd /home/federica/.cache/bazel/_bazel_federica/fb36143429cca4c38e61a5e83150e333/execroot/__main__ && \
exec env - \
PATH=/home/federica/.cache/bazelisk/downloads/bazelbuild/bazel-3.5.0-linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
PWD=/proc/self/cwd \
/usr/bin/x86_64-w64-mingw32-gcc -MD -MF bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.d '-frandom-seed=bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o' -iquote . -iquote bazel-out/k8-fastbuild/bin -iquote external/bazel_tools -iquote bazel-out/k8-fastbuild/bin/external/bazel_tools -c main/hello-world.cc -o bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o)
SUBCOMMAND: # //main:hello-world [action 'Linking main/hello-world', configuration: a79594d39f0782b210e102e89b8a67dda26e295f95805aa9c0140f6281fdd3f5, execution platform: @local_config_platform//:host]
(cd /home/federica/.cache/bazel/_bazel_federica/fb36143429cca4c38e61a5e83150e333/execroot/__main__ && \
exec env - \
PATH=/home/federica/.cache/bazelisk/downloads/bazelbuild/bazel-3.5.0-linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
PWD=/proc/self/cwd \
/usr/bin/x86_64-w64-mingw32-gcc -o bazel-out/k8-fastbuild/bin/main/hello-world bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o -Wl,-S -lstdc++)
ERROR: /home/federica/examples/cpp_mingw_toolchain/stage1/main/BUILD:3:10: output 'main/hello-world' was not created
ERROR: /home/federica/examples/cpp_mingw_toolchain/stage1/main/BUILD:3:10: not all outputs were created or valid
Target //main:hello-world failed to build
INFO: Elapsed time: 9.390s, Critical Path: 0.58s
INFO: 2 processes: 2 linux-sandbox.
FAILED: Build did NOT complete successfully
如果我查看内部 bazel-out/k8-fastbuild/bin/main/hello-world
,则不会创建可执行文件。
但是,如果我尝试在 bash 中 运行 从 verbose_failures:
cd /home/federica/.cache/bazel/_bazel_federica/fb36143429cca4c38e61a5e83150e333/execroot/__main__ && \
exec env - \
PATH=/home/federica/.cache/bazelisk/downloads/bazelbuild/bazel-3.5.0-linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
PWD=/proc/self/cwd \
/usr/bin/x86_64-w64-mingw32-gcc -o bazel-out/k8-fastbuild/bin/main/hello-world bazel-out/k8-fastbuild/bin/main/_objs/hello-world/hello-world.o -Wl,-S -lstdc++
可执行文件'Hello-world.exe'创建成功。
有什么问题的建议吗?
下面是我的工具链 BUILD 文件
package(default_visibility = ["//visibility:public"])
cc_toolchain_suite(
name = "mingw_suite",
toolchains = {
"k8": ":k8_toolchain",
},
)
filegroup(name = "empty")
cc_toolchain(
name = "k8_toolchain",
toolchain_identifier = "k8-toolchain",
toolchain_config = ":k8_toolchain_config",
all_files = ":empty",
compiler_files = ":empty",
dwp_files = ":empty",
linker_files = ":empty",
objcopy_files = ":empty",
strip_files = ":empty",
supports_param_files = 0,
)
load(":cc_toolchain_config.bzl", "cc_toolchain_config")
cc_toolchain_config(name = "k8_toolchain_config")
和 cc_toolchain_config.bzl:
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
# NEW
load(
"@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
"feature",
"flag_group",
"flag_set",
"tool_path",
)
all_link_actions = [ # NEW
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]
def _impl(ctx):
tool_paths = [ # NEW
tool_path(
name = "gcc",
path = "/usr/bin/x86_64-w64-mingw32-gcc",
),
tool_path(
name = "ld",
path = "/usr/bin/x86_64-w64-mingw32-ld",
),
tool_path(
name = "ar",
path = "/usr/bin/x86_64-w64-mingw32-ld",
),
tool_path(
name = "cpp",
path = "/bin/false",
),
tool_path(
name = "gcov",
path = "/bin/false",
),
tool_path(
name = "nm",
path = "/bin/false",
),
tool_path(
name = "objdump",
path = "/bin/false",
),
tool_path(
name = "strip",
path = "/bin/false",
),
]
features = [ # NEW
feature(
name = "default_linker_flags",
enabled = True,
flag_sets = [
flag_set(
actions = all_link_actions,
flag_groups = ([
flag_group(
flags = [
"-lstdc++",
],
),
]),
),
],
),
]
return cc_common.create_cc_toolchain_config_info(
ctx = ctx,
features = features, # NEW
cxx_builtin_include_directories = [ # NEW
"/usr/x86_64-w64-mingw32/include",
"/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include/c++",
"/usr/share/mingw-w64/include",
"/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include",
"/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/include-fixed",
"/usr/include",
],
toolchain_identifier = "k8-toolchain",
host_system_name = "local",
target_system_name = "local",
target_cpu = "k8",
target_libc = "unknown",
compiler = "i686-w64-mingw32-gcc",
abi_version = "unknown",
abi_libc_version = "unknown",
tool_paths = tool_paths,
)
cc_toolchain_config = rule(
implementation = _impl,
attrs = {},
provides = [CcToolchainConfigInfo],
)
非常感谢您的帮助!
这个问题比较容易漏掉,其实你的问题里已经包含了,错误是hello-world
没有创建,而hello-world.exe
显然已经生成了就好了。也就是说,我们实际上已经构建了一个带有 .exe
后缀的文件,但没有通过它的工具链配置告诉 bazel
是这种情况,没有它就无法预期输出。
为了解决这个问题,您还可以从 @bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl
加载:artifact_name_pattern
和其他符号,然后设置 cc_common.create_cc_toolchain_config_info()
的 artifact_name_patterns
属性:
artifact_name_patterns = [
artifact_name_pattern(
category_name = "executable",
prefix = "",
extension = ".exe",
),
]