# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# 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
#
#     http://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.

config("sabi") {
  sabi_json = read_file(sabi_path, "json")
  sabi_variables = sabi_json.variables
  forward_variables_from(sabi_variables, "*")

  arch_uppercase = exec_script("//starboard/build/gyp_functions.py",
                               [
                                 "str_upper",
                                 target_arch,
                               ],
                               "trim string")
  calling_convention_uppercase =
      exec_script("//starboard/build/gyp_functions.py",
                  [
                    "str_upper",
                    calling_convention,
                  ],
                  "trim string")
  floating_point_abi_uppercase =
      exec_script("//starboard/build/gyp_functions.py",
                  [
                    "str_upper",
                    floating_point_abi,
                  ],
                  "trim string")

  sabi_id = exec_script("//starboard/sabi/generate_sabi_id.py",
                        [
                          "-f",
                          rebase_path(sabi_path, root_build_dir),
                        ],
                        "trim string")

  defines = [
    "SB_SABI_JSON_ID=R\"($sabi_id)\"",
    "SB_API_VERSION=$sb_api_version",

    "SB_IS_ARCH_${arch_uppercase}=1",
    "SB_HAS_${calling_convention_uppercase}_CALLING=1",
    "SB_HAS_${floating_point_abi_uppercase}_FLOATS=1",

    "SB_IS_${word_size}_BIT=1",
    "SB_ALIGNMENT_OF_CHAR=${alignment_char}",
    "SB_ALIGNMENT_OF_DOUBLE=${alignment_double}",
    "SB_ALIGNMENT_OF_FLOAT=${alignment_float}",
    "SB_ALIGNMENT_OF_INT=${alignment_int}",
    "SB_ALIGNMENT_OF_LLONG=${alignment_llong}",
    "SB_ALIGNMENT_OF_LONG=${alignment_long}",
    "SB_ALIGNMENT_OF_POINTER=${alignment_pointer}",
    "SB_ALIGNMENT_OF_SHORT=${alignment_short}",
    "SB_SIZE_OF_CHAR=${size_of_char}",
    "SB_SIZE_OF_ENUM=${size_of_enum}",
    "SB_SIZE_OF_DOUBLE=${size_of_double}",
    "SB_SIZE_OF_FLOAT=${size_of_float}",
    "SB_SIZE_OF_INT=${size_of_int}",
    "SB_SIZE_OF_LONG=${size_of_long}",
    "SB_SIZE_OF_LLONG=${size_of_llong}",
    "SB_SIZE_OF_POINTER=${size_of_pointer}",
    "SB_SIZE_OF_SHORT=${size_of_short}",
  ]

  if (endianness == "little") {
    defines += [
      "SB_IS_BIG_ENDIAN=0",
      "SB_IS_LITTLE_ENDIAN=1",
    ]
  } else {
    defines += [
      "SB_IS_BIG_ENDIAN=1",
      "SB_IS_LITTLE_ENDIAN=0",
    ]
  }

  if (signedness_of_char == "signed") {
    defines += [ "SB_HAS_SIGNED_CHAR=1" ]
  } else {
    defines += [ "SB_HAS_SIGNED_CHAR=0" ]
  }

  if (signedness_of_enum == "signed") {
    defines += [ "SB_HAS_SIGNED_ENUM=1" ]
  } else {
    defines += [ "SB_HAS_SIGNED_ENUM=1" ]
  }

  not_needed("*")
}
