Skip to content

Modernize rpi-5 build #128

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions Tools/Toolsets/rpi-5-elf.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"schemaVersion": "1.0",
"swiftCompiler": {
"extraCLIOptions": [
"-Xfrontend", "-disable-stack-protector",
"-Xfrontend", "-function-sections",
"-enable-experimental-feature", "Embedded",
"-Xfrontend", "-mergeable-symbols",
"-Xclang-linker", "-fuse-ld=lld",
"-Xclang-linker", "-nostdlib"
]
},
"linker": {
"extraCLIOptions": [
"-T", "Sources/Support/linkerscript.ld",
"--unresolved-symbols=ignore-in-object-files"
]
}
}
61 changes: 40 additions & 21 deletions rpi-4b-blink/Makefile
Original file line number Diff line number Diff line change
@@ -1,28 +1,47 @@
SWIFT_EXEC ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f swift; else which swift; fi)
CLANG ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f clang; else which clang; fi)
LLVM_OBJCOPY ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f llvm-objcopy; else which llvm-objcopy; fi)
##===----------------------------------------------------------------------===##
##
## This source file is part of the Swift open source project
##
## Copyright (c) 2025 Apple Inc. and the Swift project authors.
## Licensed under Apache License v2.0 with Runtime Library Exception
##
## See https://swift.org/LICENSE.txt for license information
##
##===----------------------------------------------------------------------===##

BUILDROOT := $(shell $(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector --show-bin-path)
# Paths
REPOROOT := $(shell git rev-parse --show-toplevel)
TOOLSROOT := $(REPOROOT)/Tools
TOOLSET := $(TOOLSROOT)/Toolsets/rpi-5-elf.json
LLVM_OBJCOPY := llvm-objcopy
SWIFT_BUILD := swift build

.PHONY: all clean
# Flags
ARCH := aarch64
TARGET := $(ARCH)-none-none-elf
SWIFT_BUILD_ARGS := \
--configuration release \
--triple $(TARGET) \
--toolset $(TOOLSET) \
--disable-local-rpath
BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path)

all: kernel8.img
.PHONY: build
build:
@echo "building..."
$(SWIFT_BUILD) \
$(SWIFT_BUILD_ARGS) \
--verbose

kernel8.img: kernel8.elf
@echo "💾 Converting to binary kernel image with llvm-objcopy..."
$(LLVM_OBJCOPY) -O binary kernel8.elf kernel8.img
@echo ""
@echo "🥳 Done! kernel8.img was saved to this directory."
@echo "extracting binary..."
$(LLVM_OBJCOPY) \
-O binary \
"$(BUILDROOT)/Application" \
"$(BUILDROOT)/Application.bin" \

kernel8.elf: $(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o link.ld
@echo "🔗 Linking with clang..."
$(CLANG) --target=aarch64-elf -o kernel8.elf $< $^ -fuse-ld=lld -nostdlib -Wl,--unresolved-symbols=ignore-in-object-files -Wl,-T ./link.ld
@echo ""

$(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o:
@echo "🛠️ Building with Swift Package Manager..."
$(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector
@echo ""

.PHONY: clean
clean:
rm -rf kernel8.elf kernel8.img .build
@echo "cleaning..."
@swift package clean
@rm -rf .build
6 changes: 3 additions & 3 deletions rpi-4b-blink/Package.resolved
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"originHash" : "34c5bcbd964b6dde904b1ee02c0f89612b6ec5884ebfe47bfe412daefc0becd4",
"originHash" : "d0330fea11b0fbdacbddd4f13debd9a4fe72ed5b628ad4959a93972f3572bf1f",
"pins" : [
{
"identity" : "swift-argument-parser",
Expand All @@ -15,8 +15,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-mmio.git",
"state" : {
"branch" : "swift-embedded-examples",
"revision" : "06d96ed4916739f2edafde87f3951b2d2a04df65"
"branch" : "main",
"revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a"
}
},
{
Expand Down
32 changes: 9 additions & 23 deletions rpi-4b-blink/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,19 @@
import PackageDescription

let package = Package(
name: "RPi4B-Blink",
platforms: [
.macOS(.v14)
],
name: "rpi-4b-blink",
products: [
.library(
name: "MainApp",
type: .static,
targets: ["MainApp"])
.executable(name: "Application", targets: ["Application"])
],
dependencies: [
.package(
url: "https://github.com/apple/swift-mmio.git",
branch: "swift-embedded-examples")
.package(url: "https://github.com/apple/swift-mmio.git", branch: "main")
],
targets: [
.target(
name: "MainApp",
.executableTarget(
name: "Application",
dependencies: [
.product(name: "MMIO", package: "swift-mmio")
],
swiftSettings: [
.enableExperimentalFeature("Embedded"),
.unsafeFlags(["-Xfrontend", "-function-sections"]),
]
),
.product(name: "MMIO", package: "swift-mmio"),
"Support",
]),
.target(name: "Support"),

]
)
])
2 changes: 0 additions & 2 deletions rpi-4b-blink/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@
- Build the program, then copy the kernel image to the SD card.
``` console
$ cd rpi-4b-blink
$ export TOOLCHAINS='<toolchain-identifier>' # Your Swift nightly toolchain identifier
$ make
$ cp kernel8.img /Volumes/bootfs
```
- If your original OS is not 64-bit, make sure to set `arm_64bit=1` in `config.txt`.
- Place the SD card in your Raspberry Pi 4B, and connect it to power.
- After the boot sequence, the green (ACT) led will start blinking in a regular pattern.

Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,9 @@ func ledOff() {
}

@main
struct Main {

struct Application {
static func main() {
setLedOutput()

while true {
ledOn()
for _ in 1..<100000 {} // just a delay
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
SECTIONS
{
. = 0x80000; /* Kernel load address for AArch64 */
/* Kernel load address for AArch64 */
. = 0x80000;
.text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) }
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) }
PROVIDE(_data = .);
Expand All @@ -14,6 +15,13 @@ SECTIONS
}
_end = .;

/DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) }
/DISCARD/ : {
*(.comment)
*(.gnu*)
*(.note*)
*(.eh_frame*)
*(.swift_modhash)
}
}
__bss_size = (__bss_end - __bss_start)>>3;

__bss_size = (__bss_end - __bss_start) >> 3;
61 changes: 40 additions & 21 deletions rpi-5-blink/Makefile
Original file line number Diff line number Diff line change
@@ -1,28 +1,47 @@
SWIFT_EXEC ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f swift; else which swift; fi)
CLANG ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f clang; else which clang; fi)
LLVM_OBJCOPY ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f llvm-objcopy; else which llvm-objcopy; fi)
##===----------------------------------------------------------------------===##
##
## This source file is part of the Swift open source project
##
## Copyright (c) 2025 Apple Inc. and the Swift project authors.
## Licensed under Apache License v2.0 with Runtime Library Exception
##
## See https://swift.org/LICENSE.txt for license information
##
##===----------------------------------------------------------------------===##

BUILDROOT := $(shell $(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector --show-bin-path)
# Paths
REPOROOT := $(shell git rev-parse --show-toplevel)
TOOLSROOT := $(REPOROOT)/Tools
TOOLSET := $(TOOLSROOT)/Toolsets/rpi-5-elf.json
LLVM_OBJCOPY := llvm-objcopy
SWIFT_BUILD := swift build

.PHONY: all clean
# Flags
ARCH := aarch64
TARGET := $(ARCH)-none-none-elf
SWIFT_BUILD_ARGS := \
--configuration release \
--triple $(TARGET) \
--toolset $(TOOLSET) \
--disable-local-rpath
BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path)

all: kernel8.img
.PHONY: build
build:
@echo "building..."
$(SWIFT_BUILD) \
$(SWIFT_BUILD_ARGS) \
--verbose

kernel8.img: kernel8.elf
@echo "💾 Converting to binary kernel image with llvm-objcopy..."
$(LLVM_OBJCOPY) -O binary kernel8.elf kernel8.img
@echo ""
@echo "🥳 Done! kernel8.img was saved to this directory."
@echo "extracting binary..."
$(LLVM_OBJCOPY) \
-O binary \
"$(BUILDROOT)/Application" \
"$(BUILDROOT)/Application.bin" \

kernel8.elf: $(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o link.ld
@echo "🔗 Linking with clang..."
$(CLANG) --target=aarch64-elf -o kernel8.elf $< $^ -fuse-ld=lld -nostdlib -Wl,--unresolved-symbols=ignore-in-object-files -Wl,-T ./link.ld
@echo ""

$(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o:
@echo "🛠️ Building with Swift Package Manager..."
$(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector
@echo ""

.PHONY: clean
clean:
rm -rf kernel8.elf kernel8.img .build
@echo "cleaning..."
@swift package clean
@rm -rf .build
6 changes: 3 additions & 3 deletions rpi-5-blink/Package.resolved
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"originHash" : "193ca3f107e2c8dd2da5d091f6259f64b2cbfd6776d1c26bbcfb195b3a0b5045",
"originHash" : "5bb00fe2bf59115297c70799769d8080cf6ce836d32f4a41d42e7c420afddec6",
"pins" : [
{
"identity" : "swift-argument-parser",
Expand All @@ -15,8 +15,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-mmio.git",
"state" : {
"branch" : "swift-embedded-examples",
"revision" : "06d96ed4916739f2edafde87f3951b2d2a04df65"
"branch" : "main",
"revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a"
}
},
{
Expand Down
32 changes: 9 additions & 23 deletions rpi-5-blink/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,19 @@
import PackageDescription

let package = Package(
name: "RPi5-Blink",
platforms: [
.macOS(.v14)
],
name: "rpi-5-blink",
products: [
.library(
name: "MainApp",
type: .static,
targets: ["MainApp"])
.executable(name: "Application", targets: ["Application"])
],
dependencies: [
.package(
url: "https://github.com/apple/swift-mmio.git",
branch: "swift-embedded-examples")
.package(url: "https://github.com/apple/swift-mmio.git", branch: "main")
],
targets: [
.target(
name: "MainApp",
.executableTarget(
name: "Application",
dependencies: [
.product(name: "MMIO", package: "swift-mmio")
],
swiftSettings: [
.enableExperimentalFeature("Embedded"),
.unsafeFlags(["-Xfrontend", "-function-sections"]),
]
),
.product(name: "MMIO", package: "swift-mmio"),
"Support",
]),
.target(name: "Support"),

]
)
])
2 changes: 0 additions & 2 deletions rpi-5-blink/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,10 @@
- Build the program, then copy the kernel image to the SD card.
``` console
$ cd rpi-5-blink
$ export TOOLCHAINS='<toolchain-identifier>' # Your Swift nightly toolchain identifier
$ make
$ cp kernel8.img /Volumes/bootfs # Copy kernel image to SD card
$ rm /Volumes/bootfs/kernel_2712.img # Delete this kernel image so our kernel8.img is used
$ # You can also rename our kernel8.img to kernel_2712.img, or set it to anything you want and specify "kernel=[your-img-name]" in config.txt.
```
- Place the SD card in your Raspberry Pi 5, and connect it to power.
- After the boot sequence, the green (ACT) led will start blinking in a regular pattern.

Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,9 @@ func ledOff() {
}

@main
struct Main {

struct Application {
static func main() {
setLedOutput()

while true {
ledOn()
for _ in 1..<100000 {} // just a delay
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
SECTIONS
{
. = 0x80000; /* Kernel load address for AArch64 */
/* Kernel load address for AArch64 */
. = 0x80000;
.text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) }
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) }
PROVIDE(_data = .);
Expand All @@ -14,6 +15,13 @@ SECTIONS
}
_end = .;

/DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) }
/DISCARD/ : {
*(.comment)
*(.gnu*)
*(.note*)
*(.eh_frame*)
*(.swift_modhash)
}
}
__bss_size = (__bss_end - __bss_start)>>3;

__bss_size = (__bss_end - __bss_start) >> 3;
Loading