SPIRV-Tools/build_defs.bzl
Nathan Gauër d8759a140b
build: fix bazel build for c++17 (#5097)
This commit changes the way bazel chooses which version to build.
Before, we had a COPT set to -std=c++17, which is analogous to the cmake
way.
However, googletest decided to follow abseil, meaning this is *not*
recommended at all, and causes a mixed-standard build.

From https://github.com/abseil/abseil-cpp/blob/master/FAQ.md#how-to-i-set-the-c-dialect-used-to-build-abseil
we have 3 options to define the standard. Using a bazelrc is what I
believe to be the simplest, as it "fixes" the repo standard.

Signed-off-by: Nathan Gauër <brioche@google.com>
2023-02-02 14:05:02 +00:00

235 lines
7.4 KiB
Python

"""Constants and macros for spirv-tools BUILD."""
COMMON_COPTS = [
"-DSPIRV_CHECK_CONTEXT",
"-DSPIRV_COLOR_TERMINAL",
] + select({
"@platforms//os:windows": [],
"//conditions:default": [
"-DSPIRV_LINUX",
"-DSPIRV_TIMER_ENABLED",
"-fvisibility=hidden",
"-fno-exceptions",
"-fno-rtti",
"-Wall",
"-Wextra",
"-Wnon-virtual-dtor",
"-Wno-missing-field-initializers",
"-Werror",
"-Wno-long-long",
"-Wshadow",
"-Wundef",
"-Wconversion",
"-Wno-sign-conversion",
],
})
TEST_COPTS = COMMON_COPTS + [
] + select({
"@platforms//os:windows": [
# Disable C4503 "decorated name length exceeded" warning,
# triggered by some heavily templated types.
# We don't care much about that in test code.
# Important to do since we have warnings-as-errors.
"/wd4503",
],
"//conditions:default": [
"-Wno-undef",
"-Wno-self-assign",
"-Wno-shadow",
"-Wno-unused-parameter",
],
})
def incompatible_with(incompatible_constraints):
return select(_merge_dicts([{"//conditions:default": []}, {
constraint: ["@platforms//:incompatible"]
for constraint in incompatible_constraints
}]))
DEBUGINFO_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_ext_inst_debuginfo_grammar_unified1"
CLDEBUGINFO100_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_ext_inst_opencl_debuginfo_100_grammar_unified1"
SHDEBUGINFO100_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_ext_inst_nonsemantic_shader_debuginfo_100_grammar_unified1"
def _merge_dicts(dicts):
merged = {}
for d in dicts:
merged.update(d)
return merged
def generate_core_tables(version):
if not version:
fail("Must specify version", "version")
grammars = dict(
core_grammar = "@spirv_headers//:spirv_core_grammar_{}".format(version),
debuginfo_grammar = DEBUGINFO_GRAMMAR_JSON_FILE,
cldebuginfo_grammar = CLDEBUGINFO100_GRAMMAR_JSON_FILE,
)
outs = dict(
core_insts_output = "core.insts-{}.inc".format(version),
operand_kinds_output = "operand.kinds-{}.inc".format(version),
)
cmd = (
"$(location :generate_grammar_tables)" +
" --spirv-core-grammar=$(location {core_grammar})" +
" --extinst-debuginfo-grammar=$(location {debuginfo_grammar})" +
" --extinst-cldebuginfo100-grammar=$(location {cldebuginfo_grammar})" +
" --core-insts-output=$(location {core_insts_output})" +
" --operand-kinds-output=$(location {operand_kinds_output})" +
" --output-language=c++"
).format(**_merge_dicts([grammars, outs]))
native.genrule(
name = "gen_core_tables_" + version,
srcs = grammars.values(),
outs = outs.values(),
cmd = cmd,
cmd_bat = cmd,
exec_tools = [":generate_grammar_tables"],
visibility = ["//visibility:private"],
)
def generate_enum_string_mapping(version):
if not version:
fail("Must specify version", "version")
grammars = dict(
core_grammar = "@spirv_headers//:spirv_core_grammar_{}".format(version),
debuginfo_grammar = DEBUGINFO_GRAMMAR_JSON_FILE,
cldebuginfo_grammar = CLDEBUGINFO100_GRAMMAR_JSON_FILE,
)
outs = dict(
extension_enum_ouput = "extension_enum.inc",
enum_string_mapping_output = "enum_string_mapping.inc",
)
cmd = (
"$(location :generate_grammar_tables)" +
" --spirv-core-grammar=$(location {core_grammar})" +
" --extinst-debuginfo-grammar=$(location {debuginfo_grammar})" +
" --extinst-cldebuginfo100-grammar=$(location {cldebuginfo_grammar})" +
" --extension-enum-output=$(location {extension_enum_ouput})" +
" --enum-string-mapping-output=$(location {enum_string_mapping_output})" +
" --output-language=c++"
).format(**_merge_dicts([grammars, outs]))
native.genrule(
name = "gen_enum_string_mapping",
srcs = grammars.values(),
outs = outs.values(),
cmd = cmd,
cmd_bat = cmd,
exec_tools = [":generate_grammar_tables"],
visibility = ["//visibility:private"],
)
def generate_opencl_tables(version):
if not version:
fail("Must specify version", "version")
grammars = dict(
opencl_grammar = "@spirv_headers//:spirv_opencl_grammar_{}".format(version),
)
outs = dict(
opencl_insts_output = "opencl.std.insts.inc",
)
cmd = (
"$(location :generate_grammar_tables)" +
" --extinst-opencl-grammar=$(location {opencl_grammar})" +
" --opencl-insts-output=$(location {opencl_insts_output})"
).format(**_merge_dicts([grammars, outs]))
native.genrule(
name = "gen_opencl_tables_" + version,
srcs = grammars.values(),
outs = outs.values(),
cmd = cmd,
cmd_bat = cmd,
exec_tools = [":generate_grammar_tables"],
visibility = ["//visibility:private"],
)
def generate_glsl_tables(version):
if not version:
fail("Must specify version", "version")
grammars = dict(
gsls_grammar = "@spirv_headers//:spirv_glsl_grammar_{}".format(version),
)
outs = dict(
gsls_insts_outs = "glsl.std.450.insts.inc",
)
cmd = (
"$(location :generate_grammar_tables)" +
" --extinst-glsl-grammar=$(location {gsls_grammar})" +
" --glsl-insts-output=$(location {gsls_insts_outs})" +
" --output-language=c++"
).format(**_merge_dicts([grammars, outs]))
native.genrule(
name = "gen_glsl_tables_" + version,
srcs = grammars.values(),
outs = outs.values(),
cmd = cmd,
cmd_bat = cmd,
exec_tools = [":generate_grammar_tables"],
visibility = ["//visibility:private"],
)
def generate_vendor_tables(extension, operand_kind_prefix = ""):
if not extension:
fail("Must specify extension", "extension")
extension_rule = extension.replace("-", "_").replace(".", "_")
grammars = dict(
vendor_grammar = "@spirv_headers//:spirv_ext_inst_{}_grammar_unified1".format(extension_rule),
)
outs = dict(
vendor_insts_output = "{}.insts.inc".format(extension),
)
cmd = (
"$(location :generate_grammar_tables)" +
" --extinst-vendor-grammar=$(location {vendor_grammar})" +
" --vendor-insts-output=$(location {vendor_insts_output})" +
" --vendor-operand-kind-prefix={operand_kind_prefix}"
).format(operand_kind_prefix = operand_kind_prefix, **_merge_dicts([grammars, outs]))
native.genrule(
name = "gen_vendor_tables_" + extension_rule,
srcs = grammars.values(),
outs = outs.values(),
cmd = cmd,
cmd_bat = cmd,
exec_tools = [":generate_grammar_tables"],
visibility = ["//visibility:private"],
)
def generate_extinst_lang_headers(name, grammar = None):
if not grammar:
fail("Must specify grammar", "grammar")
outs = dict(
extinst_output_path = name + ".h",
)
cmd = (
"$(location :generate_language_headers)" +
" --extinst-grammar=$<" +
" --extinst-output-path=$(location {extinst_output_path})"
).format(**outs)
native.genrule(
name = "gen_extinst_lang_headers_{}".format(name),
srcs = [grammar],
outs = outs.values(),
cmd = cmd,
cmd_bat = cmd,
exec_tools = [":generate_language_headers"],
visibility = ["//visibility:private"],
)