# 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("//build_overrides/pigweed_environment.gni")

declare_args() {
  # Enable/disable Arduino builds via group("arduino").
  # Set to the full path of where cores are installed.
  pw_arduino_build_CORE_PATH = ""

  # Expected args for an Arduino build:
  pw_arduino_build_CORE_NAME = ""

  # TODO(tonymd): "teensy/avr" here should match the folders in this dir:
  # "../third_party/arduino/cores/$pw_arduino_build_CORE_NAME/hardware/*")
  # For teensy: "teensy/avr", for adafruit-samd: "samd/1.6.2"
  pw_arduino_build_PACKAGE_NAME = ""
  pw_arduino_build_BOARD = ""

  # Menu options should be a list of strings.
  pw_arduino_build_MENU_OPTIONS = []
}

if (pw_arduino_build_CORE_PATH != "") {
  # Check that enough pw_arduino_build_* args are set to find and use a core.
  _required_args_message =
      "The following build args must all be set: " +
      "pw_arduino_build_CORE_PATH, pw_arduino_build_CORE_NAME, " +
      "pw_arduino_build_PACKAGE_NAME."
  assert(pw_arduino_build_CORE_NAME != "",
         "Missing 'pw_arduino_build_CORE_NAME' build arg. " +
             _required_args_message)
  assert(pw_arduino_build_PACKAGE_NAME != "",
         "Missing 'pw_arduino_build_PACKAGE_NAME' build arg. " +
             _required_args_message)

  _arduino_selected_core_path =
      rebase_path("$pw_arduino_build_CORE_PATH/$pw_arduino_build_CORE_NAME",
                  root_build_dir)

  arduino_builder_script =
      get_path_info("py/pw_arduino_build/__main__.py", "abspath")

  # Check pw_arduino_build_BOARD is set
  assert(pw_arduino_build_BOARD != "",
         "pw_arduino_build_BOARD build arg not set. " +
             "To see supported boards run: " +
             "arduino_builder --arduino-package-path " +
             _arduino_selected_core_path + " --arduino-package-name " +
             pw_arduino_build_PACKAGE_NAME + " list-boards")

  _compiler_path_override =
      rebase_path(pw_env_setup_CIPD_PIGWEED + "/bin", root_build_dir)

  arduino_core_library_path = "$_arduino_selected_core_path/hardware/" +
                              "$pw_arduino_build_PACKAGE_NAME/libraries"

  arduino_global_args = [
    "--arduino-package-path",
    _arduino_selected_core_path,
    "--arduino-package-name",
    pw_arduino_build_PACKAGE_NAME,
    "--compiler-path-override",
    _compiler_path_override,

    # Save config files to "out/arduino_debug/gen/arduino_builder_config.json"
    "--config-file",
    rebase_path(root_gen_dir, root_build_dir) + "/arduino_builder_config.json",
    "--save-config",
  ]

  arduino_board_args = [
    "--build-path",
    ".",
    "--board",
    pw_arduino_build_BOARD,
  ]
  if (pw_arduino_build_MENU_OPTIONS != []) {
    arduino_board_args += [ "--menu-options" ]
    arduino_board_args += pw_arduino_build_MENU_OPTIONS
  }

  arduino_show_command_args = arduino_global_args + [
                                "show",
                                "--delimit-with-newlines",
                              ] + arduino_board_args

  arduino_run_command_args =
      arduino_global_args + [ "run" ] + arduino_board_args
}
