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

# Constants that represent the different C++ standards. These are set to the
# value of __cplusplus, which allows for unambiguous numeric comparison of C++
# standards.
pw_toolchain_STANDARD = {
  CXX98 = 199711
  CXX11 = 201103
  CXX14 = 201402
  CXX17 = 201703
  CXX20 = 202002
}

if (defined(is_fuchsia_tree) && is_fuchsia_tree) {
  # In the Fuchsia build, this must align with how code is actually being
  # compiled in that build, which is controlled by Fuchsia's build argument.
  import("//build/config/fuchsia_cxx_version.gni")

  # This is not a GN build argument at all when Pigweed is integrated into the
  # Fuchsia build, just a reflection of the Fuchsia build's configuration.
  # **NOTE:** This line will blow up if the value isn't one of the supported
  # ones listed above.
  pw_toolchain_CXX_STANDARD = pw_toolchain_STANDARD["CXX$fuchsia_cxx_version"]
} else {
  declare_args() {
    # Specifies the C++ standard this toolchain is compiling for. The value
    # must be an integer that matches the value of the __cplusplus macro when
    # compiling with that standard. Use the pw_toolchain_CXX_STANDARD_##
    # constants to set this value.
    pw_toolchain_CXX_STANDARD = pw_toolchain_STANDARD.CXX17
  }
}

assert(
    pw_toolchain_CXX_STANDARD == pw_toolchain_STANDARD.CXX98 ||
        pw_toolchain_CXX_STANDARD == pw_toolchain_STANDARD.CXX11 ||
        pw_toolchain_CXX_STANDARD == pw_toolchain_STANDARD.CXX14 ||
        pw_toolchain_CXX_STANDARD == pw_toolchain_STANDARD.CXX17 ||
        pw_toolchain_CXX_STANDARD == pw_toolchain_STANDARD.CXX20,
    "pw_toolchain_CXX_STANDARD ($pw_toolchain_CXX_STANDARD) is an " +
        "unsupported value. The toolchain must set it to one of the " +
        "pw_toolchain_STANDARD constants (e.g. pw_toolchain_STANDARD.CXX17).")

assert(pw_toolchain_CXX_STANDARD >= pw_toolchain_STANDARD.CXX17,
       "Pigweed requires at least C++17.")
