blob: 22d78095d05cfe575f42eb33fe0abc9e9ad0ae32 [file] [log] [blame]
"""This module provides the gen_compile_flags_txt_linux_amd64 macro."""
load("@skia_user_config//:copts.bzl", "DEFAULT_COPTS")
load("//:defines.bzl", "DEFAULT_DEFINES", "DEFAULT_LOCAL_DEFINES")
load("//toolchain:linux_amd64_toolchain_config.bzl", "EXTERNAL_TOOLCHAIN")
def _gen_compile_flags_txt_linux_amd64_rule_impl(ctx):
# We need to set the working directory to the workspace root before invoking "bazel info
# output_base", or Bazel will fail with "ERROR: bazel should not be called from a
# bazel output directory.". This error is due to the fact that the script generated by this
# rule will have its working directory set to a path under its runfiles directory.
bazel_output_base = "$(cd $BUILD_WORKSPACE_DIRECTORY && bazel info output_base)"
flags = [
"-xc++", # Treat all files as C++. Without this, clangd treats .h files as C files.
"-I.", # Required for includes relative to the workspace root to work.
# Based on
# https://skia.googlesource.com/skia/+/064f144adedd8ad8ac9c613c54e6354268041912/toolchain/linux_amd64_toolchain_config.bzl#214.
#
# It would be nice to have these in a constant exported by
# //toolchain:linux_amd64_toolchain_config.bzl.
"-isystem",
"%s/%s/include/c++/v1" % (bazel_output_base, EXTERNAL_TOOLCHAIN),
"-isystem",
"%s/%s/include/x86_64-unknown-linux-gnu/c++/v1/" % (bazel_output_base, EXTERNAL_TOOLCHAIN),
"-isystem",
"%s/%s/usr/include" % (bazel_output_base, EXTERNAL_TOOLCHAIN),
"-isystem",
"%s/%s/lib/clang/15.0.1/include" % (bazel_output_base, EXTERNAL_TOOLCHAIN),
"-isystem",
"%s/%s/usr/include/x86_64-linux-gnu" % (bazel_output_base, EXTERNAL_TOOLCHAIN),
# Based on
# https://skia.googlesource.com/skia/+/064f144adedd8ad8ac9c613c54e6354268041912/toolchain/linux_amd64_toolchain_config.bzl#238.
#
# It would be nice to have these in a constant exported by
# //toolchain:linux_amd64_toolchain_config.bzl.
"-std=c++17",
"-stdlib=libc++",
] + [
"-D%s" % define
for define in ctx.attr.defines + ctx.attr.local_defines
] + ctx.attr.flags
script = "#!/bin/sh\n"
for flag in flags:
script += "echo %s\n" % flag
output_file = ctx.actions.declare_file(ctx.attr.name)
ctx.actions.write(output_file, script, is_executable = True)
return [DefaultInfo(executable = output_file)]
_gen_compile_flags_txt_linux_amd64_rule = rule(
doc = """Implements the gen_compile_flags_txt_linux_amd64 macro.
This has to be a rule, rather than a macro, because macros do not evaluate select()
expressions, as is the case with lists such as DEFAULT_COPTS.
""",
implementation = _gen_compile_flags_txt_linux_amd64_rule_impl,
attrs = {
"flags": attr.string_list(
mandatory = True,
),
"defines": attr.string_list(
mandatory = True,
),
"local_defines": attr.string_list(
mandatory = True,
),
},
executable = True,
)
def gen_compile_flags_txt_linux_amd64(name):
"""Generates a compile_flags.txt file for use with clangd.
See entry in //BUILD.bazel for usage instructions.
"""
_gen_compile_flags_txt_linux_amd64_rule(
name = name,
flags = DEFAULT_COPTS,
defines = DEFAULT_DEFINES,
local_defines = DEFAULT_LOCAL_DEFINES,
)