пользовательский cc_toolchain, используемый в правиле bazel - PullRequest
0 голосов
/ 24 января 2020

Я пытался написать правило bazel, чтобы обернуть компиляцию для исходных файлов ris c -v, делает что-то еще, например c, но у меня были некоторые проблемы с получением CcToolchainInfo Поставщик.

У меня есть правило, которое работает как

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

, чтобы предоставить информацию о конфигурации. У меня есть следующее в toolchains/BUILD:

load(":cc_toolchain_config.bzl", "rv_cc_toolchain_config")

package(default_visibility = ['//visibility:public'])


rv_cc_toolchain_config(name="rv_toolchain_cfg")


cc_toolchain(
    name='rv_toolchain',
    toolchain_identifier='rv-toolchain',
    toolchain_config=':rv_toolchain_cfg',
    all_files=':nofile',
    strip_files=':nofile',
    objcopy_files=':nofile',
    dwp_files=':nofile',
    compiler_files=':nofile',
    linker_files=':nofile',
)

Кажется, все работает нормально; Затем у меня есть мое пользовательское правило для компиляции с помощью riscv:

def _compile_impl(ctx):
    deps = []
    cc_toolchain = find_cpp_toolchain(ctx)
    print(ctx.attr._cc_toolchain)
    compilation_contexts = [dep[CcInfo].compilation_context for dep in deps]
    print(type(cc_toolchain))
    feature_configuration = cc_common.configure_features( #fails here
        ctx = ctx,
        cc_toolchain = cc_toolchain,
        requested_features = ctx.features,  #currently does nothing
        unsupported_features = ctx.disabled_features,
    )




rv_compile = rule(
    _compile_impl,
    output_to_genfiles = True,
    attrs = {
        "srcs": attr.label_list(
            doc = "List of source files",
            mandatory = False,
            allow_files = [".cc", ".cpp", ".h", ".c"],
        ),
        "hdrs": attr.label_list(
            doc = "List of header files",
            allow_files = [".h"],
        ),
        "_cc_toolchain": attr.label(
            #default = Label("@bazel_tools//tools/cpp:current_cc_toolchain"),
            default = Label("//toolchains:rv_toolchain")
        ),
    },
    provides = [
        DefaultInfo,
        CcInfo,
    ],
    toolchains = [
        "@bazel_tools//tools/cpp:toolchain_type",
    ],
    fragments = ["cpp"]
)

. При неудачном завершении попытки сконфигурировать набор инструментов, потому что cc_toolchain имеет тип ToolchainInfo, а не обязательный CcToolchainInfo. У кого-нибудь есть понимание того, как предоставить CcToolchainInfo в правиле? Или есть лучший способ сделать это? Документация кажется go темной на этом.

1 Ответ

1 голос
/ 24 января 2020

Упс - разобрался с этим после троллинга через github. Оказывается, проблема в том, что прямая ссылка cc_toolchain неверна, и что CcToolchainInfo предоставляется через cc_toolchain_suite

, обновляя toolchains/BUILD, чтобы он выглядел как

load(":cc_toolchain_config.bzl", "rv_cc_toolchain_config")

package(default_visibility = ['//visibility:public'])


rv_cc_toolchain_config(name="rv_toolchain_cfg")


filegroup(name = 'empty')
cc_toolchain(
    name='rv_toolchain',
    toolchain_identifier='sanity-toolchain',
    toolchain_config=':rv_toolchain_cfg',
    all_files=':empty',
    strip_files=':empty',
    objcopy_files=':empty',
    dwp_files=':empty',
    compiler_files=':empty',
    linker_files=':empty',
)


cc_toolchain_suite(
    name='rv',
    toolchains={
        'darwin': ':rv_toolchain', #use whatever OS you need here... 
    }
)

и правило компиляции rv что-то вроде


rv_compile = rule(
    _compile_impl,
    output_to_genfiles = True,
    attrs = {
        "srcs": attr.label_list(
            doc = "List of source files",
            mandatory = False,
            allow_files = [".cc", ".cpp", ".h", ".c"],
        ),
        "hdrs": attr.label_list(
            doc = "List of header files",
            allow_files = [".h"],
        ),
        "_cc_toolchain": attr.label(
            #default = Label("@bazel_tools//tools/cpp:current_cc_toolchain"),
            default = Label("//toolchains:rv")
        ),
    },
    provides = [
        DefaultInfo,
        CcInfo,
    ],
    toolchains = [
        "@bazel_tools//tools/cpp:toolchain_type",
    ],
    fragments = ["cpp"]
)

работает как заклинание :) любой, кто читает это, должен также включить экспериментальный жаворонок cpp apis. если кто-нибудь знает, как сделать cc_toolchain_suite cpu agnosti c, я хотел бы услышать это. веселит.

...