# 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")

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(getenv("_PW_ACTUAL_ENVIRONMENT_ROOT") + "/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
}
