{{- /* Collect all the conditionals used by all targets in this directory */}}
{{- $AllConditionals := $.DecomposedConditionals}}
load("//src/tint:flags.bzl", "COPTS")
load("@bazel_skylib//lib:selects.bzl", "selects")
{{/* newline */}}

{{- Eval "TargetIfNotEmpty" ($.Project.Target $ "lib")}}
{{- Eval "TargetIfNotEmpty" ($.Project.Target $ "test")}}
{{- Eval "TargetIfNotEmpty" ($.Project.Target $ "bench")}}
{{- Eval "TargetIfNotEmpty" ($.Project.Target $ "cmd")}}
{{- Eval "TargetIfNotEmpty" ($.Project.Target $ "test_cmd")}}
{{- Eval "TargetIfNotEmpty" ($.Project.Target $ "bench_cmd")}}

{{- Eval "ConditionalRules" $AllConditionals}}


{{- /*
--------------------------------------------------------------------------------
-- Emits a Bazel target if it contains any files
--------------------------------------------------------------------------------
*/ -}}
{{- define "TargetIfNotEmpty"}}
{{-   if $}}
{{-     if len $.SourceFiles}}{{Eval "Target" $}}{{end}}
{{-   end}}
{{- end}}


{{- /*
--------------------------------------------------------------------------------
-- Emits a Bazel target
--------------------------------------------------------------------------------
*/ -}}
{{- define "Target"}}
{{- $Conditionals := $.Conditionals}}
{{- if      $.Kind.IsLib -}}
cc_library(
  name = "{{$.Directory.Name}}",
{{- else if $.Kind.IsTest -}}
cc_library(
  name = "test",
  alwayslink = True,
{{- else if $.Kind.IsBench -}}
cc_library(
  name = "bench",
  alwayslink = True,
{{- else if $.Kind.IsCmd -}}
cc_binary(
  name = "cmd",
{{- else if $.Kind.IsTestCmd -}}
cc_binary(
  name = "test_cmd",
{{- else if $.Kind.IsBenchCmd -}}
cc_binary(
  name = "bench_cmd",
{{- end}}
  srcs = [
{{-   range $File := $.UnconditionalSourceFiles}}
{{-     if or (not $.Kind.IsLib) (HasSuffix $File.Name ".cc")}}
    "{{TrimPrefix $File.Name $.Directory.Path}}",
{{-     end}}
{{-   end}}
  ]
{{-   if $Conditionals.HasSourceFiles}}
{{-     range $Cond := $Conditionals}} + select({
{{-       if $Cond.SourceFiles}}
    ":{{Eval "ConditionTarget" $Cond.Condition}}": [
{{-         range $File := $Cond.SourceFiles}}
      "{{TrimPrefix $File.Name $.Directory.Path}}",
{{-         end}}
    ],
{{-       end}}
    "//conditions:default": [],
  })
{{-     end}}
{{-   end}},
{{- if $.Kind.IsLib}}
  hdrs = [
{{-   range $File := $.UnconditionalSourceFiles}}
{{-     if not (HasSuffix $File.Name ".cc")}}
    "{{TrimPrefix $File.Name $.Directory.Path}}",
{{-     end}}
{{-   end}}
  ],
{{-   end}}
  deps = [
{{- /* Emit unconditional internal dependencies */}}
{{-   range $Dep := $.Dependencies.UnconditionalInternal}}
    "{{Eval "Dependency" $Dep}}",
{{-   end}}

{{- /* Emit unconditional external dependencies */}}
{{-   range $Dep := $.Dependencies.UnconditionalExternal}}
    {{Eval "ExternalDependencyTarget" $Dep}}
{{-   end}}
  ]
{{-   if $Conditionals.HasDependencies}}
{{-     range $Cond := $Conditionals}} + select({
{{-       if or $Cond.InternalDependencies $Cond.ExternalDependencies}}
    ":{{Eval "ConditionTarget" $Cond.Condition}}": [
{{-         range $Dep := $Cond.InternalDependencies}}
      "{{Eval "Dependency" $Dep}}",
{{-         end}}
{{-         range $Dep := $Cond.ExternalDependencies}}
      {{Eval "ExternalDependencyTarget" $Dep}}
{{-         end}}
    ],
{{-       end}}
    "//conditions:default": [],
  })
{{-     end}}
{{-   end}},
  copts = COPTS,
  visibility = ["//visibility:public"],
)
{{/* newline */}}
{{- end}}


{{- /*
--------------------------------------------------------------------------------
-- Emits a dependency target name
--------------------------------------------------------------------------------
*/ -}}
{{- define "Dependency" -}}
{{-   if      $.Kind.IsLib      -}}//src/tint/{{$.Directory.Path}}
{{-   else if $.Kind.IsTest     -}}//src/tint/{{$.Directory.Path}}:test
{{-   else if $.Kind.IsBench    -}}//src/tint/{{$.Directory.Path}}:bench
{{-   else if $.Kind.IsCmd      -}}//src/tint/{{$.Directory.Path}}:cmd
{{-   else if $.Kind.IsTestCmd  -}}//src/tint/{{$.Directory.Path}}:test_cmd
{{-   else if $.Kind.IsBenchCmd -}}//src/tint/{{$.Directory.Path}}:bench_cmd
{{-   end}}
{{- end}}


{{- /*
--------------------------------------------------------------------------------
-- Emits comma separated, quoted external dependency target name(s) with a trailing comma
-- External target names are declared in tools/src/cmd/gen/build/externals.json
--------------------------------------------------------------------------------
*/ -}}
{{- define "ExternalDependencyTarget"}}
{{-        if eq $.Name "abseil"                -}}"@abseil_cpp//absl/strings",
{{-   else if eq $.Name "dl"                    -}}{{/* unsupported */}}
{{-   else if eq $.Name "dxc-include"           -}}{{/* unsupported */}}
{{-   else if eq $.Name "dxcompiler-for-fuzzer" -}}{{/* unsupported */}}
{{-   else if eq $.Name "glslang-res-limits"    -}}{{/* unsupported */}}
{{-   else if eq $.Name "glslang"               -}}{{/* unsupported */}}
{{-   else if eq $.Name "gmock"                 -}}"@gtest",
{{-   else if eq $.Name "google-benchmark"      -}}"@benchmark",
{{-   else if eq $.Name "gtest"                 -}}"@gtest",
{{-   else if eq $.Name "jsoncpp"               -}}{{/* unsupported */}}
{{-   else if eq $.Name "langsvr"               -}}{{/* unsupported */}}
{{-   else if eq $.Name "metal"                 -}}{{/* unsupported */}}
{{-   else if eq $.Name "spirv-headers"         -}}"@spirv_headers//:spirv_cpp11_headers", "@spirv_headers//:spirv_c_headers",
{{-   else if eq $.Name "spirv-opt-internal"    -}}"@spirv_tools//:spirv_tools_opt",
{{-   else if eq $.Name "spirv-tools"           -}}"@spirv_tools",
{{-   else if eq $.Name "thread"                -}}{{/* unsupported */}}
{{-   else if eq $.Name "winsock"               -}}{{/* unsupported */}}
{{-   else if eq $.Name "src_utils"             -}}"//src/utils",
{{-   else                                      -}}{{Error (printf "unhandled external dependency '%v'" $.Name)}}
{{-   end}}
{{- end}}


{{- /*
--------------------------------------------------------------------------------
-- Emits all the conditional rules required by the targets
--------------------------------------------------------------------------------
*/ -}}
{{- define "ConditionalRules"}}
{{-   if $.Unarys}}
{{-     range $Unary := $.Unarys}}
alias(
  name = "{{Eval "ConditionTarget" $Unary}}",
  actual = "//src/tint:{{$Unary.Var}}_{{not $Unary.Negate}}",
)
{{/* newline */}}
{{-     end}}
{{-   end}}
{{-   if $.Ors}}
{{-     range $Ors := $.Ors}}
selects.config_setting_group(
    name = "{{Eval "ConditionTarget" $Ors}}",
    match_any = [
{{-       range $Unary := $Ors}}
        "{{Eval "ConditionTarget" $Unary}}",
{{-       end}}
    ],
)
{{/* newline */}}
{{-     end}}
{{-   end}}
{{-   if $.Ands}}
{{-     range $Ands := $.Ands}}
selects.config_setting_group(
    name = "{{Eval "ConditionTarget" $Ands}}",
    match_all = [
{{-       range $Ors := $Ands}}
        ":{{Eval "ConditionTarget" $Ors}}",
{{-       end}}
    ],
)
{{-     end}}
{{/* newline */}}
{{-   end}}
{{- end}}


{{- /*
--------------------------------------------------------------------------------
-- Emits a target name for a condition expression
--------------------------------------------------------------------------------
*/ -}}
{{- define "ConditionTarget" -}}
{{- $C := $.String}}
{{- $C := Replace $C " && " "_and_"}}
{{- $C := Replace $C " || " "_or_"}}
{{- $C := Replace $C "!" "not_"}}
{{- $C := Replace $C "(" "_"}}
{{- $C := Replace $C ")" "_"}}
{{- $C := Replace $C " " "_"}}
{{- $C}}
{{- end}}
