load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") def _pico_sdk_define_impl(ctx): val = ctx.attr.from_flag[BuildSettingInfo].value if type(val) == "string": # Strings need quotes. val = "\"{}\"".format(val) elif type(val) == "bool": # Convert bools to 0 or 1. val = 1 if val else 0 cc_ctx = cc_common.create_compilation_context( defines = depset( direct = ["{}={}".format(ctx.attr.define_name, val)], ), ) return [CcInfo(compilation_context = cc_ctx)] pico_sdk_define = rule( implementation = _pico_sdk_define_impl, doc = """A simple rule that offers a skylib flag as a define. These can be listed in the `deps` attribute of a `cc_library` to get access to the value of a define. Example: bool_flag( name = "my_flag", build_setting_default = False, ) pico_sdk_define( name = "flag_define", define_name = "MY_FLAG_DEFINE", from_flag = ":my_flag", ) """, attrs = { "define_name": attr.string(mandatory = True), "from_flag": attr.label(mandatory = True), }, )