# 'ls arch/' Makefile includes:
# arm     arm32   arm64   i386    loong64 riscv   riscv32 riscv64 x86     x86_64
#
# arm64 could at least build natively and run with devel/binutils LD_ARCHS fixed.
# Others are untested and require unported tooling both native- and cross-builds.
ONLY_FOR_ARCHS =	amd64

CATEGORIES =		net firmware
COMMENT =		PXE network boot firmware
HOMEPAGE =		https://ipxe.org

# Official binaries use latest HEAD, last tagged in 2020.
V =			1.21.1
HEAD =			fb1188936ca29af61709afd8b866ea55d4a05a67
DIST_TUPLE =		github	ipxe	ipxe	${HEAD}	.
WRKSRC =		${WRKDIST}/src
# What 'gmake version' would print for a git checkout.
VERSION =		${V}+ (g${HEAD:C/^(.{5}).+/\1/})

# Our patch-level is the number of post-tag commits from output mentioned above.
PKGNAME =		ipxe-${IPXE_ARCH}-${V}pl1152
FULLPKGNAME =		${PKGNAME}
PKG_ARCH =		*

# MI elf(5) headers missing from our <elf.h>;  required by EFI builds.
DISTFILES.elf =		elf_common.h
SITES.elf =		https://github.com/freebsd/freebsd-src/raw/refs/heads/releng/15.0/sys/sys/
# Only provide relocation macros, see util/elf2efi.c patch.
EXTRACT_CASES =		${DISTFILES.elf})  grep -x '\#define[[:space:]]R_.*' \
			    ${DISTDIR}/$$archive >| ${WRKSRC}/util/$$archive ;;

# amd64 BIOS bootloader for USB and ISO images.
DISTFILES.lin =		syslinux-6.03.tar.xz
SITES.lin =		https://www.kernel.org/pub/linux/utils/boot/syslinux/
EXTRACT_CASES +=	${DISTFILES.lin})  xz -T${MAKE_JOBS} -d \
			    <${DISTDIR}/$$archive | ${TAR} -xf - -s ',.*/,,' \
			    \*/{ldlinux.c32,isolinux.bin} ;;

# iPXE:         GPLv2+, UBDL
# elf_common.h: BSD-2-Clause
# syslinux:     GPLv2
PERMIT_PACKAGE =	Yes

MAINTAINER =		Klemens Nanni <kn@openbsd.org>

# Cross-compilation architectures.
FLAVORS =		aarch64
FLAVOR ?=		# native build

.if empty(FLAVOR)
IPXE_ARCH =		${MACHINE_ARCH:amd64=x86_64}
COMPILER =		ports-gcc
COMPILER_LANGS =	c
BUILD_DEPENDS = 	devel/binutils>=2.45.1p1 \
			devel/gas
GNU_PREFIX =		g
CROSS_CC =		${CC}
.else
.  if ${FLAVOR:Maarch64}
IPXE_ARCH =		${FLAVOR:aarch64=arm64}
CROSS_CC =		${FLAVOR}-none-elf-gcc
BUILD_DEPENDS = 	devel/arm-none-eabi/binutils,${FLAVOR} \
			devel/arm-none-eabi/gcc,${FLAVOR}
.  endif
GNU_PREFIX =		${FLAVOR}-none-elf-
CROSS_CC =		${GNU_PREFIX}gcc
.endif

# See https://ipxe.org/appnote/buildtargets for all supported variations.
AVAIL_PLATFORMS =	efi pcbios
BUILD_PLATFORMS ?=	# empty, no architecture-independent default

.if ${IPXE_ARCH:Mx86_64} || \
    ${IPXE_ARCH:Marm64}
BUILD_PLATFORMS +=	efi
DRIVERS-efi =		snp snponly
EXTENSIONS-efi =	efi
.endif

.if ${IPXE_ARCH:Mx86_64}
BUILD_PLATFORMS +=	pcbios
DRIVERS-pcbios =	undionly
EXTENSIONS-pcbios =	kpxe lkrn pxe usb
.endif

.for platform in ${BUILD_PLATFORMS}
.  for driver in ipxe ${DRIVERS-${platform}}
.    for extension in iso ${EXTENSIONS-${platform}}
TARGETS-${platform} +=	bin-${IPXE_ARCH}-${platform}/${driver}.${extension}
.    endfor
.  endfor
.endfor

USE_GMAKE =		Yes
MAKE_FLAGS =		ARCH=${IPXE_ARCH} \
			CC=${CROSS_CC} \
			HOST_CC=${CC} \
			HOST_CFLAGS=${HOST_CFLAGS:Q} \
			V=1 \
			VERSION=${VERSION:Q}

.for util in as objcopy ld
MAKE_FLAGS +=		${util:U}=/usr/local/bin/${GNU_PREFIX}${util}
.endfor

# Disable stack protector guard in Makefile.efi:
# ... undefined reference to `__guard_local'
# ... undefined reference to `__stack_smash_handler'
MAKE_FLAGS +=		SPG_TEST=false

# Avoid image changes on rebuilds.
BUILD_ID_CMD =		cksum -s OpenBSD -q | cut -d' ' -f1
MAKE_FLAGS +=		BUILD_ID_CMD=${BUILD_ID_CMD:Q} \
			SOURCE_DATE_EPOCH=0

BUILD_DEPENDS +=	archivers/xz \
			sysutils/libisoburn,-xorriso \
			sysutils/mtools \
			sysutils/truncate

# lzma.h
HOST_CFLAGS +=		-I/usr/local/include

# util/genfsimg relies on mktemp(1).
MAKE_ENV =		TMPDIR=${WRKDIR}

NO_TEST =		Yes

DATA_DIR =		${PREFIX}/share/ipxe/${IPXE_ARCH}
PKG_ARGS =		${AVAIL_PLATFORMS:=-D%=0} \
			${BUILD_PLATFORMS:=-D%=1}
SUBST_VARS =		BUILD_PLATFORMS \
			IPXE_ARCH

# Most config/*.h include config/local/*.h, use that to provide port defaults.
# See https://ipxe.org/appnote/named_config and config/named.h for more.
do-configure:
	cp ${FILESDIR}/*.h ${WRKSRC}/config/local/

do-build:
.for platform in ${BUILD_PLATFORMS}
	@${ECHO_MSG} \## platform: ${platform}
	@${ECHO_MSG} \### targets: ${TARGETS-${platform}:T}
	@${SETENV} ${MAKE_ENV} ${MAKE_PROGRAM} -C ${WRKBUILD} -f ${MAKE_FILE} \
	    ${MAKE_FLAGS} ${TARGETS-${platform}}
.endfor

do-install:
	${INSTALL_DATA_DIR} ${DATA_DIR}
.for platform in ${BUILD_PLATFORMS}
	${INSTALL_DATA_DIR} ${DATA_DIR}/${platform}
	cd ${WRKBUILD} && ${INSTALL_DATA} ${TARGETS-${platform}} \
	    ${DATA_DIR}/${platform}/
.endfor

.include <bsd.port.mk>
