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

# gn-format disable
import("//build_overrides/pigweed.gni")
declare_args() {
  # Expected args for an Arduino build:
  arduino_core_name = "teensy"
  arduino_package_name = "teensy/avr"
  arduino_board = "teensy40"

  # Menu options should be a list of strings.
  arduino_menu_options = [
    "menu.usb.serial",
    "menu.keys.en-us",
  ]

  # Enable/disable Arduino builds via group("arduino").
  # Set to the full path of ./third_party/arduino
  dir_pw_third_party_arduino = ""
}

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

_arduino_core_path =
    rebase_path("../third_party/arduino/cores/$arduino_core_name")
_compiler_path_override =
    rebase_path(getenv("_PW_ACTUAL_ENVIRONMENT_ROOT") + "/cipd/pigweed/bin")

arduino_global_args = [
  "--arduino-package-path",
  _arduino_core_path,
  "--arduino-package-name",
  arduino_package_name,
  "--compiler-path-override",
  _compiler_path_override,
]

arduino_board_args = [
  "--build-path",
  rebase_path(root_build_dir),
  "--board",
  arduino_board,
  "--menu-options",
]
arduino_board_args += arduino_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
