# Copyright 2020 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.

import("//build_overrides/pigweed.gni")

import("$dir_pw_toolchain/clang_tools.gni")

declare_args() {
  # Sets the sanitizer to pass to clang. Valid values are "address", "memory",
  # "thread", "undefined".
  pw_toolchain_SANITIZERS = []

  # Indicates if this build is a part of OSS-Fuzz, which needs to be able to
  # provide its own compiler and flags. This violates the build hermeticisim and
  # should only be used for OSS-Fuzz.
  pw_toolchain_OSS_FUZZ_ENABLED = false
}

# Specifies the tools used by host Clang toolchains.
_host_clang_toolchain = {
  if (pw_toolchain_OSS_FUZZ_ENABLED) {
    # Just use the "llvm-ar" on the system path.
    ar = "llvm-ar"
    cc = getenv("CC")
    cxx = getenv("CXX")
  } else {
    forward_variables_from(pw_toolchain_clang_tools, "*")
  }

  is_host_toolchain = true

  # Enable static analysis for host clang based toolchains,
  # even with OSS-Fuzz enabled.
  static_analysis = true
}

# Common default scope shared by all host Clang toolchains.
_defaults = {
  # TODO(b/234888755) amend toolchain declaration process to
  # remove this hack.
  default_configs = []
  default_configs = [
    "$dir_pw_build:extra_debugging",
    "$dir_pw_toolchain/host_clang:no_system_libcpp",
    "$dir_pw_toolchain/host_clang:xcode_sysroot",
  ]

  # OSS-Fuzz uses -stdlib=libc++, which isn't included in the CIPD-provided
  # Linux sysroot (it instead provides libstdc++).
  if (!pw_toolchain_OSS_FUZZ_ENABLED) {
    default_configs += [ "$dir_pw_toolchain/host_clang:linux_sysroot" ]
  }
}

pw_toolchain_host_clang = {
  debug = {
    name = "host_clang_debug"
    forward_variables_from(_host_clang_toolchain, "*")
    defaults = {
      forward_variables_from(_defaults, "*")
      default_configs += [ "$dir_pw_build:optimize_debugging" ]
      foreach(sanitizer, pw_toolchain_SANITIZERS) {
        default_configs +=
            [ "$dir_pw_toolchain/host_clang:sanitize_$sanitizer" ]
      }
    }
  }

  speed_optimized = {
    name = "host_clang_speed_optimized"
    forward_variables_from(_host_clang_toolchain, "*")
    defaults = {
      forward_variables_from(_defaults, "*")
      default_configs += [ "$dir_pw_build:optimize_speed" ]
      foreach(sanitizer, pw_toolchain_SANITIZERS) {
        default_configs +=
            [ "$dir_pw_toolchain/host_clang:sanitize_$sanitizer" ]
      }
    }
  }

  size_optimized = {
    name = "host_clang_size_optimized"
    forward_variables_from(_host_clang_toolchain, "*")
    defaults = {
      forward_variables_from(_defaults, "*")
      default_configs += [ "$dir_pw_build:optimize_size_clang" ]
      foreach(sanitizer, pw_toolchain_SANITIZERS) {
        default_configs +=
            [ "$dir_pw_toolchain/host_clang:sanitize_$sanitizer" ]
      }
    }
  }

  fuzz = {
    name = "host_clang_fuzz"
    forward_variables_from(_host_clang_toolchain, "*")
    defaults = {
      forward_variables_from(_defaults, "*")

      # Fuzz faster.
      default_configs += [ "$dir_pw_build:optimize_speed" ]

      if (pw_toolchain_SANITIZERS == []) {
        # Default to ASan for fuzzing, which is what we typically care about.
        pw_toolchain_SANITIZERS = [ "address" ]
      }
      foreach(sanitizer, pw_toolchain_SANITIZERS) {
        default_configs +=
            [ "$dir_pw_toolchain/host_clang:sanitize_$sanitizer" ]
      }

      if (pw_toolchain_OSS_FUZZ_ENABLED) {
        default_configs += [ "$dir_pw_fuzzer:oss_fuzz_extra" ]
      }
    }
  }

  asan = {
    name = "host_clang_asan"
    forward_variables_from(_host_clang_toolchain, "*")
    defaults = {
      forward_variables_from(_defaults, "*")

      # Use debug mode to get proper debug information.
      default_configs += [ "$dir_pw_build:optimize_debugging" ]
      default_configs += [ "$dir_pw_toolchain/host_clang:sanitize_address" ]
    }
  }

  ubsan = {
    name = "host_clang_ubsan"
    forward_variables_from(_host_clang_toolchain, "*")
    defaults = {
      forward_variables_from(_defaults, "*")

      # Use debug mode to get proper debug information.
      default_configs += [ "$dir_pw_build:optimize_debugging" ]
      default_configs += [ "$dir_pw_toolchain/host_clang:sanitize_undefined" ]
    }
  }

  ubsan_heuristic = {
    name = "host_clang_ubsan_heuristic"
    forward_variables_from(_host_clang_toolchain, "*")
    defaults = {
      forward_variables_from(_defaults, "*")

      # Use debug mode to get proper debug information.
      default_configs += [ "$dir_pw_build:optimize_debugging" ]
      default_configs +=
          [ "$dir_pw_toolchain/host_clang:sanitize_undefined_heuristic" ]
    }
  }

  msan = {
    name = "host_clang_msan"
    forward_variables_from(_host_clang_toolchain, "*")
    defaults = {
      forward_variables_from(_defaults, "*")

      # Use debug mode to get proper debug information.
      default_configs += [ "$dir_pw_build:optimize_debugging" ]
      default_configs += [ "$dir_pw_toolchain/host_clang:sanitize_memory" ]
    }
  }

  tsan = {
    name = "host_clang_tsan"
    forward_variables_from(_host_clang_toolchain, "*")
    defaults = {
      forward_variables_from(_defaults, "*")

      # Use debug mode to get proper debug information.
      default_configs += [ "$dir_pw_build:optimize_debugging" ]
      default_configs += [ "$dir_pw_toolchain/host_clang:sanitize_thread" ]
    }
  }
}

# Describes host clang toolchains.
pw_toolchain_host_clang_list = [
  pw_toolchain_host_clang.debug,
  pw_toolchain_host_clang.speed_optimized,
  pw_toolchain_host_clang.size_optimized,
  pw_toolchain_host_clang.fuzz,
  pw_toolchain_host_clang.asan,
  pw_toolchain_host_clang.ubsan,
  pw_toolchain_host_clang.ubsan_heuristic,
  pw_toolchain_host_clang.msan,
  pw_toolchain_host_clang.tsan,
]
