Skip to content

Commit

Permalink
Merge pull request #28 from es-ude/refactor-upload-script-generation
Browse files Browse the repository at this point in the history
changes creation of upload scripts to macros, adds platforms constrai…
  • Loading branch information
pixelboehm committed Sep 15, 2020
2 parents efe4cdb + 684e7d1 commit b4f8bac
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 70 deletions.
56 changes: 35 additions & 21 deletions AvrToolchain/BUILD.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,48 @@ DFU_UPLOAD_SCRIPT_TEMPLATE = """
"""

AVRDUDE_UPLOAD_SCRIPT_TEMPLATE = """
avrdude -c arduino -p $$1 -P /dev/ttyACM0 -D -V -U flash:w:$$2
avrdude -c {programmer} -p $$1 -D -V -U flash:w:$$2
"""

genrule(
name = "dfu_upload_script",
outs = ["dfu_upload_script.sh"],
cmd = "echo '" + select({
"@AvrToolchain//host_config:dfu_needs_sudo": DFU_UPLOAD_SCRIPT_TEMPLATE.format(
export = "",
sudo = "sudo ",
),
"@AvrToolchain//host_config:dfu_needs_ask_pass": DFU_UPLOAD_SCRIPT_TEMPLATE.format(
export = "export SUDO_ASKPASS=$(ASKPASS)",
sudo = "sudo ",
),
"//conditions:default": DFU_UPLOAD_SCRIPT_TEMPLATE.format(
export = "",
sudo = "",
),
}) + "' > $@",
cmd = "echo '" +
select(
{
"@AvrToolchain//host_config:dfu_needs_sudo": DFU_UPLOAD_SCRIPT_TEMPLATE.format(
export = "",
sudo = "sudo ",
),
"@AvrToolchain//host_config:dfu_needs_ask_pass": DFU_UPLOAD_SCRIPT_TEMPLATE.format(
export = "export SUDO_ASKPASS=$(ASKPASS)",
sudo = "sudo ",
),
"//conditions:default": DFU_UPLOAD_SCRIPT_TEMPLATE.format(
export = "",
sudo = "",
),
},
) +
"' > $@",
)

genrule(
name = "avrdude_upload_script",
outs = ["avrdude_upload_script.sh"],
cmd = " echo '" + select({
"//conditions:default": AVRDUDE_UPLOAD_SCRIPT_TEMPLATE.format(
)
}) + "' > $@",
)
cmd = " echo '" +
select(
{
"@AvrToolchain//platforms/programmer:arduino_config": AVRDUDE_UPLOAD_SCRIPT_TEMPLATE.format(
programmer = "arduino",
),
"@AvrToolchain//platforms/programmer:wiring_config": AVRDUDE_UPLOAD_SCRIPT_TEMPLATE.format(
programmer = "wiring",
),
"//conditions:default": AVRDUDE_UPLOAD_SCRIPT_TEMPLATE.format(
programmer = "",
),
},
) +
"' > $@",
)
45 changes: 23 additions & 22 deletions AvrToolchain/helpers.bzl.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,41 @@ def upload(name, srcs = [], upload_script = "@AvrToolchain//:dfu_upload_script")
native.sh_binary(
name = name,
srcs = [upload_script],
args = get_mcu_as_array() + [
"$(location {input})".format(input = srcs[0])],
args = get_mcu_as_array() + ["$(location {input})".format(input = srcs[0])],
data = [srcs[0]],
)

def generate_hex(name, input, testonly = 0, tags=[]):
def generate_hex(name, input, testonly = 0, tags = []):
native.genrule(
name = name,
srcs = [input],
tags = tags,
outs = [name + ".hex"],
cmd = select({
"@AvrToolchain//platforms:avr_config": "{avr_objcopy} -O ihex -j .text -j .data -j .bss $(SRCS) $(OUTS); {avr_size} --mcu=",
"@AvrToolchain//host_config:enable_avr_size_injection": "{avr_objcopy} -O ihex -j .text -j .data -j .bss $(SRCS) $(OUTS); $(AVR_SIZE) --mcu=",
"//conditions:default": "echo 'target only valid for avr platforms'; return 1",
}) + get_mcu() + select({
"@AvrToolchain//platforms:avr_config": " --format avr $(SRCS)",
"//conditions:default": ""
}),
cmd = select(
{
"@AvrToolchain//platforms:avr_config": "{avr_objcopy} -O ihex -j .text -j .data -j .bss $(SRCS) $(OUTS); {avr_size} --mcu=",
"@AvrToolchain//host_config:enable_avr_size_injection": "{avr_objcopy} -O ihex -j .text -j .data -j .bss $(SRCS) $(OUTS); $(AVR_SIZE) --mcu=",
"//conditions:default": "echo 'target only valid for avr platforms'; return 1",
},
) +
get_mcu() +
select(
{
"@AvrToolchain//platforms:avr_config": " --format avr $(SRCS)",
"//conditions:default": "",
},
),
testonly = testonly,
)

def default_embedded_binary(name, uploader = "@AvrToolchain//:dfu_upload_script", **kwargs):
native.cc_binary(
name = "_" + name + "ELF",
**kwargs
)
def default_embedded_binary(name, uploader, **kwargs):
native.cc_binary(name = name + "_" + "ELF", **kwargs)
generate_hex(
name = name,
input = "_" + name + "ELF",
input = name + "_" + "ELF",
)
upload(
name = "_" + name + "Upload",
name = name + "_" + "upload",
srcs = [name],
upload_script = uploader,
)
Expand Down Expand Up @@ -76,12 +78,11 @@ def create_unity_library(
unity_output_char_macro = None,
strip_include_prefix = "external/Unity/src/",
defines = [],
**kwargs
):
**kwargs):
_defines = defines
if (unity_output_char_macro != None):
if unity_output_char_macro != None:
_defines.append("UNITY_OUTPUT_CHAR(a)={}(a)".format(unity_output_char_macro))
if (unity_output_start_macro != None):
if unity_output_start_macro != None:
_defines.append("UNITY_OUTPUT_START()={}".format(unity_output_start_macro))
native.cc_library(
name = name,
Expand Down
49 changes: 23 additions & 26 deletions AvrToolchain/platforms/BUILD.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,20 @@ constraint_value(

config_setting(
name = "avr_config",
constraint_values = [
":avr",
]
constraint_values = [":avr"],
)

constraint_value(
name = "bare_metal",
constraint_setting = "@bazel_tools//platforms:os"
constraint_setting = "@bazel_tools//platforms:os",
)

platform(
name = "avr_common",
constraint_values = [
"@AvrToolchain//platforms:bare_metal",
"@AvrToolchain//platforms:avr"
]
"@AvrToolchain//platforms:avr",
],
)

platform(
Expand All @@ -35,7 +33,7 @@ platform(
"@AvrToolchain//platforms/cpu_frequency:8mhz",
"@AvrToolchain//platforms/board_id:motherboard",
],
parents = [":avr_common"]
parents = [":avr_common"],
)

platform(
Expand All @@ -45,41 +43,41 @@ platform(
"@AvrToolchain//platforms/misc:hardware_uart",
"@AvrToolchain//platforms/misc:has_mrf",
"@AvrToolchain//platforms/cpu_frequency:12mhz",
"@AvrToolchain//platforms/board_id:elastic_node_v3"
"@AvrToolchain//platforms/board_id:elastic_node_v3",
],
parents = [":avr_common"]
parents = [":avr_common"],
)

platform(
name = "ElasticNode_v3_monitor",
constraint_values = [
"@AvrToolchain//platforms/cpu_frequency:8mhz",
"@AvrToolchain//platforms/misc:lufa_uart",
"@AvrToolchain//platforms/mcu:atmega32u4",
"@AvrToolchain//platforms/board_id:elastic_node_v3_monitor",
"@AvrToolchain//platforms/cpu_frequency:8mhz",
"@AvrToolchain//platforms/misc:lufa_uart",
"@AvrToolchain//platforms/mcu:atmega32u4",
"@AvrToolchain//platforms/board_id:elastic_node_v3_monitor",
],
parents = [":avr_common"],
)

platform(
name = "ElasticNode_v4",
constraint_values = [
"@AvrToolchain//platforms/cpu_frequency:8mhz",
"@AvrToolchain//platforms/misc:lufa_uart",
"@AvrToolchain//platforms/misc:fpga_connected",
"@AvrToolchain//platforms/mcu:at90usb1287",
"@AvrToolchain//platforms/board_id:elastic_node_v4",
"@AvrToolchain//platforms/cpu_frequency:8mhz",
"@AvrToolchain//platforms/misc:lufa_uart",
"@AvrToolchain//platforms/misc:fpga_connected",
"@AvrToolchain//platforms/mcu:at90usb1287",
"@AvrToolchain//platforms/board_id:elastic_node_v4",
],
parents = [":avr_common"],
)

platform(
name = "ElasticNode_v4_monitor",
constraint_values = [
"@AvrToolchain//platforms/cpu_frequency:8mhz",
"@AvrToolchain//platforms/misc:lufa_uart",
"@AvrToolchain//platforms/mcu:atmega32u4",
"@AvrToolchain//platforms/board_id:elastic_node_v4_monitor",
"@AvrToolchain//platforms/cpu_frequency:8mhz",
"@AvrToolchain//platforms/misc:lufa_uart",
"@AvrToolchain//platforms/mcu:atmega32u4",
"@AvrToolchain//platforms/board_id:elastic_node_v4_monitor",
],
parents = [":avr_common"],
)
Expand All @@ -90,7 +88,8 @@ platform(
"@AvrToolchain//platforms/cpu_frequency:16mhz",
"@AvrToolchain//platforms/misc:hardware_uart",
"@AvrToolchain//platforms/mcu:atmega328p",
"@AvrToolchain//platforms/board_id:arduino_uno"
"@AvrToolchain//platforms/board_id:arduino_uno",
"@AvrToolchain//platforms/programmer:arduino",
],
parents = [":avr_common"],
)
Expand All @@ -102,9 +101,7 @@ platform(
"@AvrToolchain//platforms/misc:hardware_uart",
"@AvrToolchain//platforms/mcu:atmega2560",
"@AvrToolchain//platforms/board_id:arduino_mega",
"@AvrToolchain//platforms/programmer:wiring",
],
parents = [":avr_common"],
)



14 changes: 13 additions & 1 deletion AvrToolchain/platforms/platforms.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ def write_constraints(repository_ctx, paths):
_write_constraints(
repository_ctx,
"uploader",
["dfu_programmer", "avrdude"],
[
"dfu_programmer",
"avrdude",
],
"platforms/uploader/BUILD",
)
_write_constraints(
Expand All @@ -43,5 +46,14 @@ def write_constraints(repository_ctx, paths):
],
"platforms/board_id/BUILD",
)
_write_constraints(
repository_ctx,
"programmer",
[
"arduino",
"wiring",
],
"platforms/programmer/BUILD",
)
repository_ctx.template("platforms/misc/BUILD", paths["@EmbeddedSystemsBuildScripts//AvrToolchain:platforms/misc/BUILD.tpl"])
repository_ctx.template("platforms/BUILD", paths["@EmbeddedSystemsBuildScripts//AvrToolchain:platforms/BUILD.tpl"])
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,3 +156,9 @@ In order to use the mocked header file instead of the original, the include dire
```c
#include "lib/MockFunctions.h"
```

### Known Issues

#### Supported avrdude programmers

`avrdude` works with different programmers for different boards. Amongst other things, they provide the pin configuration. For more information run `man avrdude` in your shell. Currently our build scripts only support the programmers `arduino`, which is used for the ArduinoUno and `wiring`, used for the ArduinoMega.

0 comments on commit b4f8bac

Please sign in to comment.