在 Windows 上使用本地 MinGw 作为工具链

问题描述 投票:0回答:1

我尝试让 MinGw 在 Windows 上工作。

@silvergasp 或@Ghostrider,因为您参与了在这个帖子中,我尝试做类似的事情也许您可以提供帮助。我尝试使用本地安装的 MinGw 并将其配置为工具链。 这只是了解如何设置嵌入式工具链的第一步。 但当我尝试遵循这个教程并尝试适应它时,我失败了。

cc_toolchain_config.bzl

load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
load(
    "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
    "feature",
    "flag_group",
    "flag_set",
    "tool_path",
    "action_config",
    "tool",
)

all_link_actions = [
    ACTION_NAMES.cpp_link_executable,
    ACTION_NAMES.cpp_link_dynamic_library,
    ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]

def _impl(ctx):
    tool_paths = [
        tool_path(
            name = "gcc",
            path = "false",
            #path = "C:\\MinGW\\bin\\gcc.exe", # Error 1
        ),
        tool_path(
            name = "ld",
            path = "false",
            #path = "C:\\MinGW\\bin\\ld.exe",  # Error 1
        ),
        tool_path(
            name = "ar",
            path = "false",
        ),
        tool_path(
            name = "cpp",
            path = "false",
        ),
        tool_path(
            name = "gcov",
            path = "false",
        ),
        tool_path(
            name = "nm",
            path = "false",
        ),
        tool_path(
            name = "objdump",
            path = "false",
        ),
        tool_path(
            name = "strip",
            path = "false",
        ),
    ]

    features = [
        feature(
            name = "default_linker_flags",
            enabled = True,
            flag_sets = [
                flag_set(
                    actions = all_link_actions,
                    flag_groups = ([
                        flag_group(
                            flags = [
                                "-lstdc++",
                            ],
                        ),
                    ]),
                ),
            ],
        ),
    ]

    action_configs = [
        action_config (
            action_name = ACTION_NAMES.c_compile,
            tools = [
                # NEW label type tool field introduced in #10967
                tool(
                    # tool = ctx.executable.my_ld),
                    path = "C:\\MinGW\\bin\\gcc.exe" 
                )
            ],
        ),
        action_config (
            action_name = ACTION_NAMES.cpp_link_executable,
            tools = [
                # NEW label type tool field introduced in #10967
                tool(
                    # tool = ctx.executable.my_ld,
                    path = "C:\\MinGW\\bin\\ld.exe"
                )
            ],
        ),
    ]

    return cc_common.create_cc_toolchain_config_info(
        ctx = ctx,
        features = features, # NEW
        cxx_builtin_include_directories = [
            "C:\\MinGW\\lib\\gcc\\mingw32\\6.3.0\\include",
            "C:\\MinGW\\include",
        ],
        toolchain_identifier = "local",
        host_system_name = "local",
        target_system_name = "local",
        target_cpu = "k8",
        target_libc = "unknown",
        compiler = "mingw",
        abi_version = "unknown",
        abi_libc_version = "unknown",
        tool_paths = tool_paths,
        action_configs = action_configs,
    )

cc_toolchain_config = rule(
    implementation = _impl,
    attrs = {},
    provides = [CcToolchainConfigInfo],
)

当我尝试提供 tool_path.path 的路径时,我收到 # 错误 1。

D:\BazelBuild\examples\cpp-tutorial\stage1>bazel build --config=mingw_config //main:hello-world
Analyzing: target //main:hello-world (0 packages loaded, 0 targets configured)
FATAL: bazel crashed due to an internal error. Printing stack trace:
java.lang.RuntimeException: Unrecoverable error while evaluating node 'ConfiguredTargetKey{label=//toolchain:x86_toolchain_config, config=BuildConfigurationValue.Key[02e79dd9de174d25399e85bf1b0833ded09d49738442a403231bf1994cd72e28]}' (requested by nodes 'ConfiguredTargetKey{label=//toolchain:x86_toolchain, config=BuildConfigurationValue.Key[02e79dd9de174d25399e85bf1b0833ded09d49738442a403231bf1994cd72e28]}')
        at com.google.devtools.build.skyframe.AbstractParallelEvaluator$Evaluate.run(AbstractParallelEvaluator.java:674)
        at com.google.devtools.build.lib.concurrent.AbstractQueueVisitor$WrappedRunnable.run(AbstractQueueVisitor.java:382)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Caused by: net.starlark.java.eval.Starlark$UncheckedEvalException: IllegalStateException thrown during Starlark evaluation (//toolchain:x86_toolchain_config)
        at <starlark>.create_cc_toolchain_config_info(<builtin>:0)
        at <starlark>._impl(D:/bazelbuild/examples/cpp-tutorial/stage1/toolchain/cc_toolchain_config.bzl:73)
Caused by: java.lang.IllegalStateException: com.google.protobuf.TextFormat$ParseException: 4:16: Invalid escape sequence: '\M'
        at com.google.devtools.build.lib.rules.cpp.CppActionConfigs.getLegacyActionConfigs(CppActionConfigs.java:1372)
        at com.google.devtools.build.lib.rules.cpp.CcModule.ccToolchainConfigInfoFromStarlark(CcModule.java:1250)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.base/java.lang.reflect.Method.invoke(Unknown Source)
        at net.starlark.java.eval.MethodDescriptor.call(MethodDescriptor.java:162)
        at net.starlark.java.eval.BuiltinFunction.fastcall(BuiltinFunction.java:77)
        at net.starlark.java.eval.Starlark.fastcall(Starlark.java:619)
        at net.starlark.java.eval.Eval.evalCall(Eval.java:672)
        at net.starlark.java.eval.Eval.eval(Eval.java:489)
        at net.starlark.java.eval.Eval.execReturn(Eval.java:249)
        at net.starlark.java.eval.Eval.exec(Eval.java:288)
        at net.starlark.java.eval.Eval.execStatements(Eval.java:82)
        at net.starlark.java.eval.Eval.execFunctionBody(Eval.java:66)
        at net.starlark.java.eval.StarlarkFunction.fastcall(StarlarkFunction.java:191)
        at net.starlark.java.eval.Starlark.fastcall(Starlark.java:619)
        at com.google.devtools.build.lib.analysis.starlark.StarlarkRuleConfiguredTargetUtil.buildRule(StarlarkRuleConfiguredTargetUtil.java:99)
        at com.google.devtools.build.lib.analysis.ConfiguredTargetFactory.createRule(ConfiguredTargetFactory.java:353)
...

当我尝试通过行动提供它时,我得到了这个。

D:\BazelBuild\examples\cpp-tutorial\stage1_toolchain_1>bazelisk build --config=asmjs //main:hello-world
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (38 packages loaded, 162 targets configured).
INFO: Found 1 target...
ERROR: D:/bazelbuild/examples/cpp-tutorial/stage1_toolchain_1/main/BUILD:3:10: Compiling main/hello-world.cc failed: missing input file '//toolchain:empty'
ERROR: D:/bazelbuild/examples/cpp-tutorial/stage1_toolchain_1/main/BUILD:3:10: Compiling main/hello-world.cc failed: 1 input file(s) do not exist
Target //main:hello-world failed to build
Use --verbose_failures to see the command lines of failed build steps.
ERROR: D:/bazelbuild/examples/cpp-tutorial/stage1_toolchain_1/main/BUILD:3:10 Compiling main/hello-world.cc failed: 1 input file(s) do not exist
INFO: Elapsed time: 3.749s, Critical Path: 0.02s
INFO: 1 process: 1 internal.
FAILED: Build did NOT complete successfully

如果您能为我指明正确的方向,那就太好了。 第二个问题是,是否有任何教程展示如何使用本地安装的工具/exe,而不将其包装在脚本中?

cross-compiling bazel toolchain
1个回答
0
投票

对我来说,在工具链文件夹中创建“空”文件解决了这个问题。所以请创建 “ 空”文件

查看这些问题: https://github.com/bazelbuild/bazel/issues/12856 https://github.com/bazelbuild/bazel/issues/16247

© www.soinside.com 2019 - 2024. All rights reserved.