blob: 551a41ac6d609c138a23d802d7d95f880b591d68 [file]
# Copyright 2024 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Generates a module map for the include directories."""
load("@bazel_skylib//lib:paths.bzl", "paths")
load("@bazel_skylib//rules/directory:providers.bzl", "DirectoryInfo")
def _impl(ctx):
module_map_file = ctx.actions.declare_file("module.modulemap")
header_paths = list()
files = list()
for directory in ctx.attr.include_directories:
header_paths.append(directory[DirectoryInfo].path)
files.append(directory[DirectoryInfo].transitive_files)
# The paths in the module map must be relative to the path to the module map
# itself, but the header_paths provided as arguments must be relative to
# the execroot. This prefix is just enough ../ to transform between the two.
prefix = "../" * len(paths.dirname(module_map_file.path).split("/"))
ctx.actions.run(
inputs = depset([], transitive = files),
executable = ctx.executable._module_map_generator,
arguments = [module_map_file.path, prefix] + header_paths,
outputs = [module_map_file],
)
return [DefaultInfo(files = depset([module_map_file]))]
builtin_module_map = rule(
implementation = _impl,
attrs = {
"include_directories": attr.label_list(
providers = [DirectoryInfo],
doc = """Directories in which to search for builtin headers.""",
),
"_module_map_generator": attr.label(
default = Label("//pw_toolchain/cc:generate_module_map"),
executable = True,
cfg = "exec",
),
},
provides = [DefaultInfo],
doc = """Generates a module map for the include directories.""",
)