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

# gn-format disable
import("//build_overrides/pigweed.gni")

import("$dir_pw_build/target_types.gni")
pw_executable("single_write_snprintf") {
  sources = [ "format_single.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [ "USE_FORMAT=0" ]
}

pw_executable("single_write_format") {
  sources = [ "format_single.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [ "USE_FORMAT=1" ]
}

pw_executable("multiple_writes_snprintf") {
  sources = [ "format_multiple.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [ "USE_FORMAT=0" ]
}

pw_executable("multiple_writes_format") {
  sources = [ "format_multiple.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [ "USE_FORMAT=1" ]
}

pw_executable("many_writes_snprintf") {
  sources = [ "format_many_without_error_handling.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [ "USE_FORMAT=0" ]
}

pw_executable("many_writes_format") {
  sources = [ "format_many_without_error_handling.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [ "USE_FORMAT=1" ]
}

pw_executable("build_string_with_snprintf_no_base_snprintf") {
  sources = [ "string_builder_size_report.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [
    "USE_STRING_BUILDER=0",
    "PROVIDE_BASE_SNPRINTF=0",
  ]
}

pw_executable("build_string_with_string_builder_no_base_snprintf") {
  sources = [ "string_builder_size_report.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [
    "USE_STRING_BUILDER=1",
    "PROVIDE_BASE_SNPRINTF=0",
  ]
}

pw_executable("build_string_with_snprintf") {
  sources = [ "string_builder_size_report.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [
    "USE_STRING_BUILDER=0",
    "PROVIDE_BASE_SNPRINTF=1",
  ]
}

pw_executable("build_string_with_string_builder") {
  sources = [ "string_builder_size_report.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [
    "USE_STRING_BUILDER=1",
    "PROVIDE_BASE_SNPRINTF=1",
  ]
}

pw_executable("build_string_incremental_with_snprintf") {
  sources = [ "string_builder_size_report_incremental.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [ "USE_STRING_BUILDER=0" ]
}

pw_executable("build_string_incremental_with_string_builder") {
  sources = [ "string_builder_size_report_incremental.cc" ]
  deps = [
    "$dir_pw_bloat:bloat_this_binary",
    "..",
  ]
  defines = [ "USE_STRING_BUILDER=1" ]
}
