From b22832e9c7e2a87d52e9884258e8aa4f33f10993 Mon Sep 17 00:00:00 2001
From: Jean-Michel Picod <jmichel@google.com>
Date: Wed, 11 Mar 2020 18:20:18 +0100
Subject: [PATCH] Rely on Makefile to build Tock OS

---
 boards/nrf52840_dongle_dfu/Makefile | 29 +++++++++++++++++
 boards/nrf52840_mdk_dfu/Makefile    | 29 +++++++++++++++++
 deploy.py                           | 48 +----------------------------
 3 files changed, 59 insertions(+), 47 deletions(-)
 create mode 100644 boards/nrf52840_dongle_dfu/Makefile
 create mode 100644 boards/nrf52840_mdk_dfu/Makefile

diff --git a/boards/nrf52840_dongle_dfu/Makefile b/boards/nrf52840_dongle_dfu/Makefile
new file mode 100644
index 0000000..723ba0a
--- /dev/null
+++ b/boards/nrf52840_dongle_dfu/Makefile
@@ -0,0 +1,29 @@
+# Makefile for building the tock kernel for the nRF development kit
+
+TOCK_ARCH=cortex-m4
+TARGET=thumbv7em-none-eabi
+PLATFORM=nrf52840_dongle_dfu
+
+include ../../third_party/tock/boards/Makefile.common
+
+TOCKLOADER=tockloader
+
+# Where in the nrf52 flash to load the kernel with `tockloader`
+KERNEL_ADDRESS=0x01000
+
+# Upload programs over uart with tockloader
+ifdef PORT
+  TOCKLOADER_GENERAL_FLAGS += --port $(PORT)
+endif
+
+TOCKLOADER_JTAG_FLAGS = --jlink --arch $(TOCK_ARCH) --board $(PLATFORM) --page-size 4096 --jlink-device nrf52840_xxaa
+
+# Upload the kernel over JTAG
+.PHONY: flash
+flash: target/$(TARGET)/release/$(PLATFORM).bin
+	$(TOCKLOADER) $(TOCKLOADER_GENERAL_FLAGS) flash --address $(KERNEL_ADDRESS) $(TOCKLOADER_JTAG_FLAGS) $<
+
+# Upload the kernel over serial/bootloader
+.PHONY: program
+program: target/$(TARGET)/release/$(PLATFORM).hex
+	$(error Cannot program nRF52 Dongle over USB. Use \`make flash\` and JTAG)
diff --git a/boards/nrf52840_mdk_dfu/Makefile b/boards/nrf52840_mdk_dfu/Makefile
new file mode 100644
index 0000000..e915141
--- /dev/null
+++ b/boards/nrf52840_mdk_dfu/Makefile
@@ -0,0 +1,29 @@
+# Makefile for building the tock kernel for the nRF development kit
+
+TOCK_ARCH=cortex-m4
+TARGET=thumbv7em-none-eabi
+PLATFORM=nrf52840_mdk_dfu
+
+include ../../third_party/tock/boards/Makefile.common
+
+TOCKLOADER=tockloader
+
+# Where in the nrf52 flash to load the kernel with `tockloader`
+KERNEL_ADDRESS=0x01000
+
+# Upload programs over uart with tockloader
+ifdef PORT
+  TOCKLOADER_GENERAL_FLAGS += --port $(PORT)
+endif
+
+TOCKLOADER_JTAG_FLAGS = --jlink --arch $(TOCK_ARCH) --board $(PLATFORM) --page-size 4096 --jlink-device nrf52840_xxaa
+
+# Upload the kernel over JTAG
+.PHONY: flash
+flash: target/$(TARGET)/release/$(PLATFORM).bin
+	$(TOCKLOADER) $(TOCKLOADER_GENERAL_FLAGS) flash --address $(KERNEL_ADDRESS) $(TOCKLOADER_JTAG_FLAGS) $<
+
+# Upload the kernel over serial/bootloader
+.PHONY: program
+program: target/$(TARGET)/release/$(PLATFORM).hex
+	$(error Cannot program nRF52 Dongle over USB. Use \`make flash\` and JTAG)
diff --git a/deploy.py b/deploy.py
index 97a4e4f..ac6c716 100755
--- a/deploy.py
+++ b/deploy.py
@@ -298,58 +298,12 @@ class OpenSKInstaller:
       self.checked_command_output(["rustup", "target", "add", arch])
     info("Rust toolchain up-to-date")
 
-  def search_binary(self, name, start_directory="."):
-    for root, _, files in os.walk(start_directory):
-      for fname in files:
-        if fname == name:
-          return os.path.join(root, fname)
-    return None
-
   def build_tockos(self):
     info("Building Tock OS for board {}".format(self.args.board))
     props = SUPPORTED_BOARDS[self.args.board]
     out_directory = os.path.join(props.path, "target", props.arch, "release")
     os.makedirs(out_directory, exist_ok=True)
-    rust_flags = [
-        "-C",
-        "link-arg=-Tlayout.ld",
-        "-C",
-        "linker=rust-lld",
-        "-C",
-        "linker-flavor=ld.lld",
-        "-C",
-        "relocation-model=dynamic-no-pic",
-        "-C",
-        "link-arg=-zmax-page-size=512",
-        "--remap-path-prefix={}=".format(os.path.realpath(props.path)),
-    ]
-    env = os.environ.copy()
-    env["RUSTFLAGS"] = " ".join(rust_flags)
-    self.checked_command_output(
-        ["cargo", "build", "--release", "--target={}".format(props.arch)],
-        env=env,
-        cwd=props.path)
-    info("Converting Tock OS file into a binary")
-    kernel_name = os.path.basename(props.path)
-    shutil.copyfile(
-        os.path.join(out_directory, kernel_name),
-        os.path.join(out_directory, "{}.elf".format(kernel_name)))
-    # Find appropriate llvm-objcopy
-    llvm_dir = self.checked_command_output(["rustc", "--print=sysroot"],
-                                           cwd=props.path).strip()
-    if not llvm_dir:
-      fatal("Couldn't determine where rustc is installed. "
-            "This shouldn't happen.")
-    if not os.path.isdir(llvm_dir):
-      fatal("Something went wrong while locating llvm-objcopy.")
-    objcopy = self.search_binary("llvm-objcopy", start_directory=llvm_dir)
-    if not objcopy:
-      fatal("Couldn't locate llvm-objcopy binary in your system.")
-    self.checked_command_output([
-        objcopy, "--output-target=binary",
-        os.path.join(out_directory, "{}.elf".format(kernel_name)),
-        os.path.join(out_directory, "{}.bin".format(kernel_name))
-    ])
+    self.checked_command_output(["make"], cwd=props.path)
 
   def build_example(self):
     info("Building example {}".format(self.args.application))
-- 
GitLab