xref: /freebsd/stand/efi/loader/Makefile (revision a259b98fa211ed87bfee58c575de4e2de94ee0fa)
1LOADER_NET_SUPPORT?=	yes
2LOADER_MSDOS_SUPPORT?=	yes
3LOADER_UFS_SUPPORT?=	yes
4LOADER_CD9660_SUPPORT?=	no
5LOADER_EXT2FS_SUPPORT?=	no
6LOADER_GZ_SUPPORT?=     yes
7LOADER_BZIP2_SUPPORT?=  yes
8LOADER_XZ_SUPPORT?=     yes
9LOADER_MD_SUPPORT?=	yes
10
11.include <bsd.init.mk>
12
13.if ${MACHINE} == "amd64" && ${DO32:U0} == 1
14__arch=	i386
15LOADER?=	loader_ia32
16.else
17__arch=	${MACHINE}
18LOADER?=	loader_${LOADER_INTERP}
19.endif
20PROG=		${LOADER}.sym
21INTERNALPROG=
22WARNS?=		3
23
24# architecture-specific loader code
25SRCS=	autoload.c \
26	bootinfo.c \
27	conf.c \
28	copy.c \
29	decompress.c \
30	efi_main.c \
31	framebuffer.c \
32	main.c \
33	memdisk.c \
34	self_reloc.c \
35	vers.c \
36	gfx_fb.c \
37	8x16.c
38
39SRCS+= acpi_detect.c
40.PATH: ${EFISRC}/acpica
41CFLAGS+=	-I${EFISRC}/acpica/include
42
43CFLAGS+=	-I${.CURDIR}/../loader
44.if ${MK_LOADER_ZFS} != "no"
45CFLAGS+=	-I${SAZFSSRC}
46CFLAGS+=        -I${SYSDIR}/contrib/openzfs/include
47CFLAGS+=        -I${SYSDIR}/contrib/openzfs/include/os/freebsd/zfs
48CFLAGS+=	-DEFI_ZFS_BOOT
49HAVE_ZFS=	yes
50.endif
51
52CFLAGS.bootinfo.c += -I$(SRCTOP)/sys/teken
53CFLAGS.bootinfo.c += -I${SRCTOP}/contrib/pnglite
54CFLAGS.decompress.c += ${ZLIB_CFLAGS} ${BZIP2_CFLAGS} ${ZSTD_CFLAGS} ${XZ_CFLAGS}
55CFLAGS.framebuffer.c += -I$(SRCTOP)/sys/teken
56CFLAGS.framebuffer.c += -I${SRCTOP}/contrib/pnglite
57CFLAGS.main.c += -I$(SRCTOP)/sys/teken
58CFLAGS.main.c += -I${SRCTOP}/contrib/pnglite
59CFLAGS.memdisk.c += -I${.OBJDIR}
60CFLAGS.gfx_fb.c += -I$(SRCTOP)/sys/teken
61CFLAGS.gfx_fb.c += -I${SRCTOP}/sys/cddl/contrib/opensolaris/common/lz4
62CFLAGS.gfx_fb.c += -I${SRCTOP}/contrib/pnglite
63CFLAGS.gfx_fb.c += ${ZLIB_CFLAGS}
64
65# We implement a slightly non-standard %S in that it always takes a
66# CHAR16 that's common in UEFI-land instead of a wchar_t. This only
67# seems to matter on arm64 where wchar_t defaults to an int instead
68# of a short. There's no good cast to use here so just ignore the
69# warnings for now.
70CWARNFLAGS.main.c+=	-Wno-format
71CWARNFLAGS.memdisk.c+=	-Wno-format
72
73.PATH: ${.CURDIR}/../loader
74.PATH: ${.CURDIR}/../loader/arch/${__arch}
75.include "${.CURDIR}/../loader/arch/${__arch}/Makefile.inc"
76
77CFLAGS+=	-Wall
78CFLAGS+=	-I${.CURDIR}
79CFLAGS+=	-I${.CURDIR}/arch/${__arch}
80CFLAGS+=	-I${EFISRC}/include
81CFLAGS+=	-I${EFISRC}/include/${__arch}
82CFLAGS+=	-I${EDK2INC}
83CFLAGS+=	-I${SYSDIR}/contrib/dev/acpica/include
84CFLAGS+=	-I${BOOTSRC}/i386/libi386
85CFLAGS+=	-DEFI
86
87.if defined(HAVE_FDT) && ${MK_FDT} != "no"
88.include	"${BOOTSRC}/fdt.mk"
89LIBEFI_FDT=	${BOOTOBJ}/efi/fdt/libefi_fdt.a
90HELP_FILES+=	${FDTSRC}/help.fdt
91.endif
92
93# Include bcache code.
94HAVE_BCACHE=    yes
95
96.if defined(EFI_STAGING_SIZE)
97CFLAGS+=	-DEFI_STAGING_SIZE=${EFI_STAGING_SIZE}
98.endif
99
100.if ${MK_LOADER_EFI_SECUREBOOT} != "no"
101CFLAGS+= -DEFI_SECUREBOOT
102.endif
103
104NEWVERSWHAT?=	"EFI loader" ${MACHINE}
105VERSION_FILE?=	${.CURDIR}/../loader/version
106HELP_FILENAME=	loader.help.efi
107
108# Always add MI sources
109.include	"${BOOTSRC}/loader.mk"
110
111CLEANFILES+=	8x16.c
112
1138x16.c:		${SRCTOP}/contrib/terminus/ter-u16b.bdf
114	vtfontcvt -f compressed-source -o ${.TARGET} ${.ALLSRC}
115
116FILES+=	${LOADER}.efi
117FILESMODE_${LOADER}.efi=	${BINMODE}
118
119.if ${LOADER_INTERP} == ${LOADER_DEFAULT_INTERP} && ${__arch} != "i386"
120LINKS+=		${BINDIR}/${LOADER}.efi ${BINDIR}/loader.efi
121.endif
122
123LDSCRIPT=	${.CURDIR}/../loader/arch/${__arch}/${__arch}.ldscript
124LDFLAGS+=	-Wl,-T${LDSCRIPT},-Bsymbolic,-znotext -pie
125.if ${LINKER_TYPE} == "bfd" && ${LINKER_VERSION} >= 23400
126LDFLAGS+=	-Wl,--no-dynamic-linker
127.endif
128
129.include <bsd.linker.mk>
130
131.if ${LINKER_TYPE} == "lld" && ${LINKER_FREEBSD_VERSION} < 1500001
132# When lld is using multiple threads, which it does by default, it can
133# result in non-reproducible output with the custom linker script. Work
134# around this by disabling threading.
135LDFLAGS+=	-Wl,--threads=1
136.endif
137
138CLEANFILES+=	${LOADER}.efi
139
140${LOADER}.efi: ${PROG}
141	@if ${NM} ${.ALLSRC} | grep ' U '; then \
142		echo "Undefined symbols in ${.ALLSRC}"; \
143		exit 1; \
144	fi
145	SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} \
146	${EFI_OBJCOPY} -j .peheader -j .text -j .sdata -j .data \
147		-j .dynamic -j .dynsym -j .rel.dyn \
148		-j .rela.dyn -j .reloc -j .eh_frame -j set_Xcommand_set \
149		-j set_X${LOADER_INTERP}_compile_set \
150		--output-target=${EFI_TARGET} ${.ALLSRC} ${.TARGET}
151
152LIBEFI=		${BOOTOBJ}/efi/libefi/libefi.a
153LIBEFI32=	${BOOTOBJ}/efi/libefi32/libefi.a
154
155.if ${__arch} == "i386"
156DPADD=		${LDR_INTERP32} ${LIBEFI32} ${LIBSA32} ${LDSCRIPT}
157LDADD=		${LDR_INTERP32} ${LIBEFI32} ${LIBSA32}
158.else
159DPADD=		${LDR_INTERP} ${LIBEFI} ${LIBSAFDT} ${LIBEFI_FDT} ${LIBSA} ${LDSCRIPT}
160LDADD=		${LDR_INTERP} ${LIBEFI} ${LIBSAFDT} ${LIBEFI_FDT} ${LIBSA}
161.endif
162
163.include <bsd.prog.mk>
164