blob: 05b75d58c7c8bc0729d8c36ee1eb96e3ecb1e6e0 [file]
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2024-2026 Jarkko Sakkinen <jarkko@kernel.org>
# Build system
SHELL := bash
.ONESHELL:
.SHELLFLAGS := -euo pipefail -c
# Versions
BUILDROOT_VERSION ?= 2026.05
# URLs and hashes
BUILDROOT_HASH ?= 9d2f3af10fcac763a61ff6e41894a033f9ecf9267ba13dd0912eedcd3be2b22a
BUILDROOT_URL ?= https://buildroot.org/downloads/buildroot-$(BUILDROOT_VERSION).tar.xz
# Directories
BUILD_DIR ?= build
BOARD_DIR := $(abspath $(BUILD_DIR)/$(BOARD))
STAMP_DIR := $(BOARD_DIR)/stamp
CACHE_DIR := $(HOME)/.cache/tpmdd/buildroot
DOWNLOAD_DIR := $(CACHE_DIR)/download
# Stamps
VERIFY_STAMP := $(STAMP_DIR)/$(BUILDROOT_VERSION)/verify
UNPACK_STAMP := $(STAMP_DIR)/$(BUILDROOT_VERSION)/unpack
PATCH_STAMP := $(STAMP_DIR)/$(BUILDROOT_VERSION)/patch
# Artifacts
BUILDROOT_TARBALL := $(DOWNLOAD_DIR)/buildroot-$(BUILDROOT_VERSION).tar.xz
# Buildroot invocation helper
define buildroot
make -C "$(BOARD_DIR)/src/buildroot-$(BUILDROOT_VERSION)" O="$(BOARD_DIR)" \
BR2_EXTERNAL="$(CURDIR)" BR2_DL_DIR="$(DOWNLOAD_DIR)" \
$(1)
endef
ifneq ($(filter-out default help list clean download,$(MAKECMDGOALS)),)
ifndef BOARD
$(error BOARD is required, e.g.: make build BOARD=tpmdd_amd64_efi)
endif
endif
.PHONY: default help list download dependencies configure build burn clean
default: help
help: ## Show this help
@awk -F ':[^#]*## ?' '/^[a-z_-]+:[^#]*##/{printf " make %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
list: ## List available defconfigs
@cd configs && ls *_defconfig | sed 's/_defconfig//'
$(BUILDROOT_TARBALL):
@mkdir -p "$(DOWNLOAD_DIR)"
wget -q --show-progress -O "$@.partial" "$(BUILDROOT_URL)"
mv "$@.partial" "$@"
download: $(BUILDROOT_TARBALL) ## Prime the Buildroot download cache
$(VERIFY_STAMP): $(BUILDROOT_TARBALL)
@echo "$(BUILDROOT_HASH) $(BUILDROOT_TARBALL)" | sha256sum --status -c -
mkdir -p "$(dir $@)"
touch "$@"
$(UNPACK_STAMP): $(VERIFY_STAMP)
@path_abs="$(BOARD_DIR)"
src_dir="$$path_abs/src/buildroot-$(BUILDROOT_VERSION)"
rm -rf "$$src_dir"
mkdir -p "$$src_dir"
tar -xf "$(BUILDROOT_TARBALL)" --strip-components=1 -C "$$src_dir"
mkdir -p "$(dir $@)"
touch "$@"
$(PATCH_STAMP): $(UNPACK_STAMP)
@path_abs="$(BOARD_DIR)"
src_dir="$$path_abs/src/buildroot-$(BUILDROOT_VERSION)"
patches_dir="$(CURDIR)/patches/buildroot"
if [ -d "$$patches_dir" ]; then
for p in "$$patches_dir"/*.patch; do
[ -f "$$p" ] || continue
patch -d "$$src_dir" -p1 -i "$$p"
done
fi
mkdir -p "$(dir $@)"
touch "$@"
dependencies:
@if [ ! -f "$(CURDIR)/configs/$(BOARD)_defconfig" ]; then
echo "error: missing configs/$(BOARD)_defconfig" >&2
exit 1
fi
configure: dependencies $(PATCH_STAMP) ## Run <BOARD>_defconfig
@mkdir -p "$(BOARD_DIR)"
$(call buildroot,$(BOARD)_defconfig)
build: configure ## Build <BOARD>
$(call buildroot,)
burn: build ## Write <BOARD> disk image to DEVICE
@if [ ! -b "$(DEVICE)" ]; then
echo "error: $(DEVICE) is not a block device" >&2
exit 1
fi
sudo dd if="$(BOARD_DIR)/images/disk.img" \
of="$(DEVICE)" bs=1M status=progress oflag=sync
clean: ## Remove build artifacts
rm -rf "$(CURDIR)/$(BUILD_DIR)"