Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for Bzlmod #6

Open
Vertexwahn opened this issue Aug 23, 2023 · 0 comments
Open

Add support for Bzlmod #6

Vertexwahn opened this issue Aug 23, 2023 · 0 comments

Comments

@Vertexwahn
Copy link
Owner

Vertexwahn commented Aug 23, 2023

Currently, rules_ispc only supports the traditional WORKSPACE approach. I want to add Bzlmod support to this ruleset. When looking at other rulesets, such as rules_ruby the final usage of those rules could look like this in MODULE.bazel file:

// add this to your MODULE.bazel file
bazel_dep(name = "rules_ispc", version = "0.0.5")

ispc = use_extension("@rules_ispc//ispc:extension.bzl", "ispc")
ispc.toolchain(
  name = "ispc",
  version = "1.23.0",
)
use_repo(ispc, "ispc")

register_toolchains("@ispc_toolchains//:all")

In a BUILD file, I want then to use something like this:

load("@rules_ispc//:ispc.bzl", "ispc_cc_library")

ispc_cc_library(
    name = "square",
    srcs = ["square.ispc"],
    out = "square.h",
    ispc_main_source_file = "square.ispc",
)

cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    deps = [":square"],
)

I wonder if this is the proper way to go in bzlmod?

I have created an extension.bzl file:

"""Module extensions used by bzlmod"""

ispc_toolchain = tag_class(attrs = {
    "name": attr.string(doc = "Base name for generated repositories, allowing multiple to be registered."),
    "version": attr.string(doc = "Explicit version of ISPC."),
})

def _ispc_module_extension(module_ctx):
    registrations = {}
    
    # Does it make sense to call here register_toolchains?
    # native.register_toolchains(...)
    # How can I do this for different pre-compiled binaries of ISPC?


ispc = module_extension(
    implementation = _ispc_module_extension,
    tag_classes = {
        "toolchain": ispc_toolchain,
    },
)

I have also created a toolchain.bzl file that looks like this:

"""Toolchain for ISPC compiler."""

IspcToolchainInfo = provider(
    doc = "Information about how to invoke ISPC.",
    fields = [
        "ispc_path",
        "default_target",
        "default_target_os",
        "default_arch",
    ],
)

def _ispc_toolchain_impl(ctx):
    expand_ispc_path = ctx.expand_location(ctx.attr.ispc_cmd, ctx.attr.data)
    toolchain_info = platform_common.ToolchainInfo(
        ispc_info = IspcToolchainInfo(
            ispc_path = expand_ispc_path,
            default_target = ctx.attr.default_target,
            default_target_os = ctx.attr.default_target_os,
            default_arch = ctx.attr.default_arch,
        ),
    )
    return [toolchain_info]

ispc_toolchain = rule(
    implementation = _ispc_toolchain_impl,
    attrs = {
        "ispc_cmd": attr.string(),
        "default_target": attr.string(),
        "default_target_os": attr.string(),
        "default_arch": attr.string(),
        "data": attr.label_list(allow_files = True),
    },
)

I am unsure how to connect the dots to get this working. Also, I am not sure if this is the right approach. Any hints are welcome.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant