# 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_arduino_build/arduino.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_toolchain/generate_toolchain.gni")
pw_doc_group("target_docs") {
  sources = [ "target_docs.rst" ]
}

if (dir_pw_third_party_arduino != "") {
  import("target_toolchains.gni")

  generate_toolchains("target_toolchains") {
    toolchains = pw_target_toolchain_arduino_list
  }

  if (current_toolchain != default_toolchain) {
    config("arduino_build") {
      # Debug: Print out arduinobuilder.py args
      # print(string_join(" ", [rebase_path(arduino_builder_script)] + arduino_show_command_args))

      # Run prebuilds
      # TODO(tonymd) This only needs to be run once but it's happening multiple times.
      exec_script(arduino_builder_script,
                  filter_exclude(arduino_run_command_args,
                                 [ "--save-config" ]) + [ "--run-prebuilds" ],
                  "string")

      _exclude_flags = [ "-std=gnu++14" ]

      _cflags = exec_script(arduino_builder_script,
                            arduino_show_command_args + [ "--c-flags" ],
                            "list lines")
      cflags = filter_exclude(_cflags, _exclude_flags)

      asmflags = exec_script(arduino_builder_script,
                             arduino_show_command_args + [ "--s-flags" ],
                             "list lines")

      _cflags_cc = exec_script(arduino_builder_script,
                               arduino_show_command_args + [ "--cpp-flags" ],
                               "list lines")
      cflags_cc = filter_exclude(_cflags_cc, _exclude_flags)

      _ldflags = exec_script(arduino_builder_script,
                             arduino_show_command_args + [ "--ld-flags" ],
                             "list lines")
      ldflags =
          filter_exclude(_ldflags,
                         [
                           # Remove arguments ending in 'core.a', for example:
                           # C:/Users/username/pigweed/out/core.a
                           "*core.a\b",

                           # Remove .elf output file, for example:
                           # -o C:/Users/username/pigweed/out/pigweed.elf
                           "\b-o\b",
                           "*.elf\b",

                           # Remove the Arduino {object_files} variable
                           "{object_files}",
                         ])
    }

    pw_source_set("pre_init") {
      sources = [ "init.cc" ]
      public_deps = [
        "$dir_pw_sys_io_arduino",
        "$dir_pw_third_party_arduino:arduino_core_sources",
      ]
      deps = [
        "$dir_pw_arduino_build:arduino_init_facade",
        "$dir_pw_preprocessor",
      ]
    }
  }
} else {
  config("arduino_build") {
  }
  group("pre_init") {
  }
}
