4c0d37
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
4c0d37
From: Peter Jones <pjones@redhat.com>
4c0d37
Date: Wed, 13 Nov 2019 15:24:41 -0500
4c0d37
Subject: [PATCH] Supply makefile templates.
4c0d37
4c0d37
This supplies template makefiles for applications consuming gnu-efi to
4c0d37
use as:
4c0d37
4c0d37
include efi.mk
4c0d37
4c0d37
Signed-off-by: Peter Jones <pjones@redhat.com>
4c0d37
---
4c0d37
 Make.defaults   |   6 +-
4c0d37
 inc/.gitignore  |   2 +
4c0d37
 inc/Makefile    |  25 ++++++++-
4c0d37
 inc/aa64.mk     |  21 +++++++
4c0d37
 inc/arm.mk      |  21 +++++++
4c0d37
 inc/efi.mk.3.in | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4c0d37
 inc/efi.mk.in   | 126 +++++++++++++++++++++++++++++++++++++++++
4c0d37
 inc/ia32.mk     |  30 ++++++++++
4c0d37
 inc/ia64.mk     |  19 +++++++
4c0d37
 inc/mips64el.mk |  22 ++++++++
4c0d37
 inc/x64.mk      |  31 ++++++++++
4c0d37
 11 files changed, 470 insertions(+), 4 deletions(-)
4c0d37
 create mode 100644 inc/.gitignore
4c0d37
 create mode 100644 inc/aa64.mk
4c0d37
 create mode 100644 inc/arm.mk
4c0d37
 create mode 100644 inc/efi.mk.3.in
4c0d37
 create mode 100644 inc/efi.mk.in
4c0d37
 create mode 100644 inc/ia32.mk
4c0d37
 create mode 100644 inc/ia64.mk
4c0d37
 create mode 100644 inc/mips64el.mk
4c0d37
 create mode 100644 inc/x64.mk
4c0d37
4c0d37
diff --git a/Make.defaults b/Make.defaults
4c0d37
index 7231e9bced2..01269660ab8 100755
4c0d37
--- a/Make.defaults
4c0d37
+++ b/Make.defaults
4c0d37
@@ -82,12 +82,14 @@ HOSTARCH     ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed \
4c0d37
 			-e s,amd64,x64, -e s,x86_64,x64, \
4c0d37
 			-e s,aarch64,aa64, \
4c0d37
 			-e 's,armv[[:digit:]].*,arm,' \
4c0d37
+			-e 's,mips64.*,mips64el,g' \
4c0d37
 			)
4c0d37
 ARCH         ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed \
4c0d37
 			-e s,i[3456789]86,ia32, \
4c0d37
 			-e s,amd64,x64, -e s,x86_64,x64, \
4c0d37
 			-e s,aarch64,aa64, \
4c0d37
 			-e 's,armv[[:digit:]].*,arm,' \
4c0d37
+			-e 's,mips64.*,mips64el,g' \
4c0d37
 			)
4c0d37
 BFD_ARCH     ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed \
4c0d37
 			-e s,i[3456789]86,ia32, \
4c0d37
@@ -102,6 +104,7 @@ ifneq ($(CROSS_COMPILE),)
4c0d37
 			-e s,amd64,x64, -e s,x86_64,x64, \
4c0d37
 			-e s,aarch64,aa64, \
4c0d37
 			-e 's,armv[[:digit:]].*,arm,' \
4c0d37
+			-e 's,mips64.*,mips64el,g' \
4c0d37
 			)
4c0d37
 endif
4c0d37
 
4c0d37
@@ -161,7 +164,8 @@ ifneq (,$(filter $(ARCH),ia32 x64))
4c0d37
 endif
4c0d37
 
4c0d37
 ifeq ($(ARCH),mips64el)
4c0d37
-  CFLAGS += -march=mips64r2
4c0d37
+  CFLAGS += -march=mips64r2 -EL
4c0d37
+  LDFLAGS += -EL
4c0d37
   ARCH3264 = -mabi=64
4c0d37
 endif
4c0d37
 
4c0d37
diff --git a/inc/.gitignore b/inc/.gitignore
4c0d37
new file mode 100644
4c0d37
index 00000000000..91716c91aab
4c0d37
--- /dev/null
4c0d37
+++ b/inc/.gitignore
4c0d37
@@ -0,0 +1,2 @@
4c0d37
+efi.mk
4c0d37
+efi.mk.3
4c0d37
diff --git a/inc/Makefile b/inc/Makefile
4c0d37
index e8123fd3115..c7f1406f026 100644
4c0d37
--- a/inc/Makefile
4c0d37
+++ b/inc/Makefile
4c0d37
@@ -5,19 +5,38 @@ TOPDIR = $(SRCDIR)/..
4c0d37
 
4c0d37
 include $(SRCDIR)/../Make.defaults
4c0d37
 
4c0d37
+# deliberately not putting efi.mk and efi.mk.3 in all, because PREFIX is often
4c0d37
+# not passed before "make install".
4c0d37
 all:
4c0d37
 
4c0d37
 clean:
4c0d37
+	@rm -vf efi.mk
4c0d37
+
4c0d37
+efi.mk efi.mk.3 : % : %.in
4c0d37
+	sed \
4c0d37
+		-e 's,@@CC@@,$(CC),g' \
4c0d37
+		-e 's,@@PREFIX@@,$(PREFIX),g' \
4c0d37
+		-e 's,@@INCDIR@@,$(PREFIX)/include/efi,g' \
4c0d37
+		-e 's,@@GNUEFIDIR@@,$(LIBDIR)/gnuefi/$$(EFI_ARCH),g' \
4c0d37
+		-e 's,@@LIBEFIDIR@@,$(LIBDIR)/gnuefi/$$(EFI_ARCH),g' \
4c0d37
+		$^ > $@
4c0d37
 
4c0d37
 SOURCE=$(realpath $(SRCDIR))
4c0d37
-DEST=$(INSTALLROOT)$(PREFIX)/include/efi
4c0d37
+DESTINCDIR=$(INSTALLROOT)$(PREFIX)/include
4c0d37
+DEST=$(DESTINCDIR)/efi
4c0d37
 INCLUDEDIRS=$(sort $(shell find $(SOURCE) -type d))
4c0d37
+MANDIR ?= $(PREFIX)/share/man
4c0d37
 
4c0d37
-install:
4c0d37
+install: efi.mk efi.mk.3
4c0d37
 	@$(foreach d,$(INCLUDEDIRS), \
4c0d37
 		$(INSTALL) -v -m 755 -d $(subst $(SOURCE),$(DEST),$(d)); \
4c0d37
-		$(INSTALL) -v -m 644 -t $(subst $(SOURCE),$(DEST),$(d)) $(wildcard $(d)/*.h); \
4c0d37
+		$(INSTALL) -v -m 644 -t $(subst $(SOURCE),$(DEST),$(d)) $(wildcard $(d)/*.h $(d)/*.mk); \
4c0d37
 	)
4c0d37
+	@$(INSTALL) -v -m 644 -t $(DESTINCDIR) efi.mk
4c0d37
+	@$(INSTALL) -v -m 755 -d $(INSTALLROOT)$(MANDIR)/man3
4c0d37
+	@$(INSTALL) -v -m 644 -t $(INSTALLROOT)$(MANDIR)/man3 efi.mk.3
4c0d37
+
4c0d37
+.PHONY: install
4c0d37
 
4c0d37
 install_compat: install
4c0d37
 	@if [ ! -h $(DEST)/x86_64 ]; then $(SYMLINK) x64/ $(DEST)/x86_64 ; fi
4c0d37
diff --git a/inc/aa64.mk b/inc/aa64.mk
4c0d37
new file mode 100644
4c0d37
index 00000000000..406915ef742
4c0d37
--- /dev/null
4c0d37
+++ b/inc/aa64.mk
4c0d37
@@ -0,0 +1,21 @@
4c0d37
+#
4c0d37
+# efi-aa64.mk
4c0d37
+# Peter Jones, 2019-11-13 14:27
4c0d37
+#
4c0d37
+ifeq ($(EFI_ARCH),aa64)
4c0d37
+
4c0d37
+EFI_ARCH_3264 :=
4c0d37
+EFI_ARCH_SUBSYSTEM := 0xa
4c0d37
+
4c0d37
+EFI_ARCH_CFLAGS := -mstrict-align -DPAGE_SIZE=4096 -DPAGE_SHIFT=12
4c0d37
+EFI_ARCH_LDFLAGS := --defsym=EFI_SUBSYSTEM=$(EFI_ARCH_SUBSYSTEM)
4c0d37
+EFI_ARCH_FORMAT := -O binary
4c0d37
+EFI_ARCH_SUFFIX := aa64
4c0d37
+EFI_ARCH_SUFFIX_UPPER := AA64
4c0d37
+EFI_ARCH_TIMESTAMP_LOCATION := 72
4c0d37
+EFI_ARCH_HAVE_OBJCOPY := y
4c0d37
+
4c0d37
+export EFI_ARCH_CCLDFLAGS EFI_ARCH_CFLAGS EFI_ARCH_CPPFLAGS EFI_ARCH_LDFLAGS
4c0d37
+export EFI_ARCH_FORMAT EFI_ARCH_SUBSYSTEM EFI_ARCH_SUFFIX EFI_ARCH_SUFFIX_UPPER
4c0d37
+export EFI_ARCH_TIMESTAMP_LOCATION EFI_ARCH_3264 EFI_ARCH_HAVE_OBJCOPY
4c0d37
+endif
4c0d37
diff --git a/inc/arm.mk b/inc/arm.mk
4c0d37
new file mode 100644
4c0d37
index 00000000000..b47c9c7c61e
4c0d37
--- /dev/null
4c0d37
+++ b/inc/arm.mk
4c0d37
@@ -0,0 +1,21 @@
4c0d37
+#
4c0d37
+# efi-arm.mk
4c0d37
+# Peter Jones, 2019-11-13 14:27
4c0d37
+#
4c0d37
+ifeq ($(EFI_ARCH),arm)
4c0d37
+
4c0d37
+EFI_ARCH_3264 :=
4c0d37
+EFI_ARCH_SUBSYSTEM := 0xa
4c0d37
+
4c0d37
+EFI_ARCH_CFLAGS := -mno-unaligned-access -DPAGE_SIZE=4096 -DPAGE_SHIFT=12
4c0d37
+EFI_ARCH_LDFLAGS := --defsym=EFI_SUBSYSTEM=$(EFI_ARCH_SUBSYSTEM)
4c0d37
+EFI_ARCH_FORMAT := -O binary
4c0d37
+EFI_ARCH_SUFFIX := arm
4c0d37
+EFI_ARCH_SUFFIX_UPPER := ARM
4c0d37
+EFI_ARCH_TIMESTAMP_LOCATION := 72
4c0d37
+EFI_ARCH_HAVE_OBJCOPY := y
4c0d37
+
4c0d37
+export EFI_ARCH_CFLAGS EFI_ARCH_CPPFLAGS EFI_ARCH_LDFLAGS
4c0d37
+export EFI_ARCH_FORMAT EFI_ARCH_SUBSYSTEM EFI_ARCH_SUFFIX EFI_ARCH_SUFFIX_UPPER
4c0d37
+export EFI_ARCH_TIMESTAMP_LOCATION EFI_ARCH_3264 EFI_ARCH_HAVE_OBJCOPY
4c0d37
+endif
4c0d37
diff --git a/inc/efi.mk.3.in b/inc/efi.mk.3.in
4c0d37
new file mode 100644
4c0d37
index 00000000000..c0bf3f123ed
4c0d37
--- /dev/null
4c0d37
+++ b/inc/efi.mk.3.in
4c0d37
@@ -0,0 +1,171 @@
4c0d37
+.TH efi.mk 3 "Thu Nov 21 2019"
4c0d37
+.SH NAME
4c0d37
+efi.mk
4c0d37
+.SH SYNOPSIS
4c0d37
+.nf
4c0d37
+.B include efi.mk
4c0d37
+.SH DESCRIPTION
4c0d37
+.ad l
4c0d37
+.nh
4c0d37
+The \fBgnu-efi\fR library provides a set of makefiles which produce \fBEFI\fR
4c0d37
+binaries on the supported platforms, as well as a number of make variables
4c0d37
+which can be set to control how each step gets built.  These can be set in your
4c0d37
+makefile or on the command line, but are normally set to reasonable defaults.
4c0d37
+Usually you'll just want to use the \fI+=\fR operator, as shown in the
4c0d37
+.BR EXAMPLES
4c0d37
+section below, rather than fully replacing these.
4c0d37
+.SS make variables
4c0d37
+.RS 4
4c0d37
+.TP
4c0d37
+.B \fBEFI_ARCH_CFLAGS\fR
4c0d37
+Architecture specific \fBgcc\fR command line options for building a \fI.efi.o\fR
4c0d37
+.TP
4c0d37
+.B \fBEFI_ARCH_LDFLAGS\fR
4c0d37
+Architecture specific \fBld\fR command line options for building the \fI.efi.so\fR
4c0d37
+.TP
4c0d37
+.B \fBEFI_ARCH_FORMAT\fR
4c0d37
+Architecture specific \fBobjcopy\fR arguments for building the final \fI.efi\fR binary
4c0d37
+.TP
4c0d37
+.B \fBCROSS_COMPILE\fR
4c0d37
+Compiler prefix for cross-compilation.  For example, "\fIaarch64-linux-gnu-\fR".
4c0d37
+.TP
4c0d37
+.B \fBEFI_CC\fR
4c0d37
+\p The C compiler.  Defaults to either \fI$(CROSS_COMPILE)gcc\fR or \fI$(CROSS_COMPILE)clang\fR,
4c0d37
+depending on what \fI$(CC)\fR was set to when \fBgnu-efi\fR was built.
4c0d37
+.TP
4c0d37
+.B \fBEFI_HOSTCC\fR
4c0d37
+Defaults to whatever \fI$(CC)\fR was set to when \fBgnu-efi\fR was built.
4c0d37
+.TP
4c0d37
+.B \fBEFI_HOSTARCH\fR
4c0d37
+One of \fIaa64\fR, \fIarm\fR, \fIia32\fR, \fIia64\fR, \fIx64\fR, or
4c0d37
+\fImips64el\fR, representing the \fBEFI\fR architecture name of the host machine
4c0d37
+during the build.
4c0d37
+.TP
4c0d37
+.B \fBEFI_ARCH\fR
4c0d37
+One of \fIaa64\fR, \fIarm\fR, \fIia32\fR, \fIia64\fR, \fIx64\fR, or
4c0d37
+\fImips64el\fR, representing the \fBEFI\fR architecture name of the target.
4c0d37
+.TP
4c0d37
+.B \fBEFI_BFDARCH\fR
4c0d37
+The architecture name for the BFD target for objcopy.
4c0d37
+.TP
4c0d37
+.B \fBEFI_ARCH_3264\fR
4c0d37
+Usually empty; if you're cross compiling, this will default to e.g. \fI-m64\fR if
4c0d37
+you're building for an \fIx64\fR target on an \fIi686\fR host.
4c0d37
+.TP
4c0d37
+.B \fBEFI_CC_INCLUDES\fR
4c0d37
+The list of default include path for the compiler, as a \fBgcc\fR command line
4c0d37
+argument.  Defaults to the output of \fI$(EFI_CC) $(EFI_ARCH_3264)
4c0d37
+-print-file-name=include\fR, for example
4c0d37
+\fI/usr/lib/gcc/x86_64-redhat-linux/9/include\fR.  Note that there is no
4c0d37
+\fI-I\fR prefix on these.
4c0d37
+.TP
4c0d37
+.B \fBEFI_INCLUDES\fR
4c0d37
+The \fBgnu-efi\fR include paths.  Note that there is no \fI-I\fR prefix on these.
4c0d37
+.TP
4c0d37
+.B \fBEFI_CPPFLAGS\fR
4c0d37
+Flags passed to \fBgcc\fR regardless of the build target.
4c0d37
+.TP
4c0d37
+.B \fBEFI_CFLAGS\fR
4c0d37
+Flags passed to \fBgcc\fR for building any binary target.  Defaults to
4c0d37
+\fI$(EFI_CPPFLAGS) $(EFI_ARCH_CFLAGS)\fR.
4c0d37
+.TP
4c0d37
+.B \fBEFI_LDSCRIPT\fR
4c0d37
+The linker script passed to \fBld -T\fR for linking \fI.efi.so\fR build targets.
4c0d37
+Defaults to \fI@@PREFIX@@/lib/gnuefi/$(EFI_ARCH)/efi.lds\fR.
4c0d37
+.TP
4c0d37
+.B \fBEFI_LIBGCC\fR
4c0d37
+The path to \fBlibgcc\fR.  Defaults to the result of
4c0d37
+\fI$(EFI_CC) $(EFI_ARCH_3264) -print-libgcc-file-name\fR
4c0d37
+.TP
4c0d37
+.B \fBEFI_LDFLAGS\fR
4c0d37
+Other command line to pass to \fBld\fR
4c0d37
+.ul
4c0d37
+before
4c0d37
+object names. Defaults to
4c0d37
+\fI-nostdlib --warn-common --no-undefined --fatal-warnings \
4c0d37
+--build-id=sha1 -shared -Bsymbolic -L@@PREFIX@@/lib/gnuefi/$(EFI_ARCH) \
4c0d37
+@@PREFIX@@/lib/gnuefi/$(EFI_ARCH)/crt0.o\fR
4c0d37
+.TP
4c0d37
+.B \fBEFI_CCLDFLAGS\fR
4c0d37
+Normally derived from \fI$(EFI_LDFLAGS)\fR.
4c0d37
+.TP
4c0d37
+.B \fBEFI_LDLIBS\fR
4c0d37
+Libraries to pass to \fBld\fR
4c0d37
+.ul
4c0d37
+after
4c0d37
+target object names.  Defaults
4c0d37
+to \fI-lefi -lgnuefi $(EFI_LIBGCC) -T $(EFI_LDSCRIPT)\fR
4c0d37
+.TP
4c0d37
+.B \fBEFI_CCLDLIBS\fR
4c0d37
+Derived from \fI$(EFI_LDLIBS)\fR.
4c0d37
+.TP
4c0d37
+.B \fBEFI_ARFLAGS\fR
4c0d37
+Flags to pass to ar to make a \fI.efi.a\fR target.  Defaults to "\fIrDv\fR".
4c0d37
+.TP
4c0d37
+.B \fBEFI_ASFLAGS\fR
4c0d37
+Flags to pass to gcc to make a \fI.efi.o\fR object from a \fI.S\fR file.
4c0d37
+.TP
4c0d37
+.B \fBEFI_OBJCOPY_FLAGS\fR
4c0d37
+Flags to pass to objcopy to make a \fI.efi\fR binary target.  Defaults to
4c0d37
+\fI--file-alignment 512 --section-alignment 4096 -D\fR
4c0d37
+.TP
4c0d37
+.B \fBEFI_BIN_SECTIONS\fR
4c0d37
+Names of sections to go into \fI.efi\fR binary targets.  If you have special
4c0d37
+sections, add them here.
4c0d37
+.TP
4c0d37
+.B \fBEFI_DEBUG_SECTIONS\fR
4c0d37
+Names of sections to go into \fI.efi.debug\fR targets.  If you have special
4c0d37
+debug sections, add them here.
4c0d37
+.RE
4c0d37
+.TP
4c0d37
+In addition, there are several make rules defined, which those variables affect
4c0d37
+as appropriate:
4c0d37
+.RS 4
4c0d37
+.TP
4c0d37
+.B \fB%.efi : %.efi.so\fB
4c0d37
+Build a \fI.efi\fR binary
4c0d37
+.TP
4c0d37
+.B \fB%.efi.debug : %efi.so\fR
4c0d37
+Build debuginfo
4c0d37
+.TP
4c0d37
+.B \fB%.efi.so :\fR
4c0d37
+Build the intermediate \fI.efi.so\fR to be linked as a \fI.efi\fR binary.  Add
4c0d37
+\fI.o\fR files as dependencies to a concrete \fI.efi.so\fR rule in order to
4c0d37
+define targets.
4c0d37
+.TP
4c0d37
+.B \fB%.efi.a :\fR
4c0d37
+Build an intermediate archive file for linking into a \fI.efi.so\fR
4c0d37
+.TP
4c0d37
+.B \fB%.efi.o : %.c\fR
4c0d37
+Build an object file from a \fI.c\fR file
4c0d37
+.TP
4c0d37
+.B \fB%.efi.o : %.S\fR
4c0d37
+Build an object file from a \fI.S\fR file
4c0d37
+.TP
4c0d37
+.B \fBefi_clean :\fR
4c0d37
+Remove all files in the current working directory with the suffixes
4c0d37
+\fI.efi\fR, \fI.efi.a\fR, \fI.efi.debug\fR, \fI.efi.o\fR, or \fI.efi.so\fR.
4c0d37
+.SH EXAMPLES
4c0d37
+This is a simple makefile used to build an \fBEFI\fR binary named \fIfoo.efi\fR from source files \fIfoo.c\fR and \fIbar.c\fR.  It includes the special section \fI.weird\fR in the final binary, and the name of that is defined within the \fI.c\fR source files using the macro \fIWEIRD_SECTION_NAME\fR:
4c0d37
+.RS 4
4c0d37
+\p include efi.mk
4c0d37
+.br
4c0d37
+\p all : foo.efi
4c0d37
+.br
4c0d37
+\p %.efi.o : | EFI_CFLAGS+=-DWEIRD_SECTION_NAME=\\".weird\\"
4c0d37
+.br
4c0d37
+\p foo.efi : | EFI_BIN_SECTIONS+=.weird
4c0d37
+.br
4c0d37
+foo.efi.so : foo.efi.o bar.efi.o
4c0d37
+.br
4c0d37
+\p clean : efi_clean
4c0d37
+.RE
4c0d37
+\p The following example shows how to cross-compile a binary for another architecture (in this case, \fIARM Aarch64\fR, which \fBEFI\fR calls \fIaa64\fR).  This assumes that you have the \fIcrt0.o\fR, \fIefi.lds\fR, \fIlibgnuefi.a\fR, and \fIlibefi.a\fR files for \fIAarch64\fR installed in \fI@@PREFIX@@/lib/gnuefi/aa64/\fR\.
4c0d37
+.RS 4
4c0d37
+\p $ make CROSS_COMPILE=aarch64-linux-gnu- EFI_ARCH=aa64 foo.efi
4c0d37
+.RE
4c0d37
+.fi
4c0d37
+.SH AUTHORS
4c0d37
+.nf
4c0d37
+Peter Jones <pjones@redhat.com>
4c0d37
+.fi
4c0d37
diff --git a/inc/efi.mk.in b/inc/efi.mk.in
4c0d37
new file mode 100644
4c0d37
index 00000000000..3de783a5a05
4c0d37
--- /dev/null
4c0d37
+++ b/inc/efi.mk.in
4c0d37
@@ -0,0 +1,126 @@
4c0d37
+#
4c0d37
+# efi.mk
4c0d37
+# Peter Jones, 2019-11-13 14:11
4c0d37
+#
4c0d37
+
4c0d37
+_efi_comma=,
4c0d37
+_efi_empty=
4c0d37
+_efi_space=$(_efi_empty) $(_efi_empty)
4c0d37
+
4c0d37
+CROSS_COMPILE ?=
4c0d37
+OBJCOPY ?= $(CROSS_COMPILE)objcopy
4c0d37
+LD ?= $(CROSS_COMPILE)ld
4c0d37
+
4c0d37
+EFI_OBJCOPY_GTE224  = $(shell expr `$(OBJCOPY) --version |grep ^"GNU objcopy" | sed 's/^.*\((.*)\|version\) //g' | cut -f1-2 -d.` \>= 2.24)
4c0d37
+
4c0d37
+EFI_CC ?= $(CROSS_COMPILE)@@CC@@
4c0d37
+EFI_HOSTCC ?= @@CC@@
4c0d37
+
4c0d37
+EFI_HOSTARCH ?= $(shell $(EFI_HOSTCC) -dumpmachine | cut -f1 -d- | \
4c0d37
+		sed \
4c0d37
+			-e s,i[3456789]86,ia32, \
4c0d37
+                        -e s,amd64,x64, \
4c0d37
+			-e s,x86_64,x64, \
4c0d37
+                        -e s,aarch64,aa64, \
4c0d37
+			-e 's,armv[[:digit:]].*,arm,' \
4c0d37
+                        )
4c0d37
+EFI_ARCH ?= $(shell $(EFI_CC) -dumpmachine | cut -f1 -d- | \
4c0d37
+		sed \
4c0d37
+			-e s,i[3456789]86,ia32, \
4c0d37
+                        -e s,amd64,x64, \
4c0d37
+			-e s,x86_64,x64, \
4c0d37
+                        -e s,aarch64,aa64, \
4c0d37
+			-e 's,armv[[:digit:]].*,arm,' \
4c0d37
+                        )
4c0d37
+EFI_BFDARCH ?= $(shell $(EFI_CC) -dumpmachine | cut -f1 -d- | \
4c0d37
+		sed \
4c0d37
+			-e s,i[3456789]86,ia32, \
4c0d37
+                        -e s,amd64,x86_64, \
4c0d37
+			-e 's,armv[[:digit:]].*,arm,' \
4c0d37
+                        )
4c0d37
+
4c0d37
+include efi/$(EFI_ARCH).mk
4c0d37
+
4c0d37
+GNUEFI_LIB_PATHS := $(sort @@LIBEFIDIR@@ @@GNUEFIDIR@@)
4c0d37
+GNUEFI_LDFLAGS := -nostdlib --warn-common --no-undefined --fatal-warnings \
4c0d37
+		  --build-id=sha1 -shared -Bsymbolic --exclude-libs ALL \
4c0d37
+		  $(foreach x,$(GNUEFI_LIB_PATHS),-L$(x)) @@GNUEFIDIR@@/crt0.o
4c0d37
+
4c0d37
+ifeq ($(origin EFI_CC_INCLUDES),undefined)
4c0d37
+EFI_CC_INCLUDES := $(foreach x,$(shell $(EFI_CC) $(EFI_ARCH_3264) -print-file-name=include),-I$(x))
4c0d37
+endif
4c0d37
+EFI_INCLUDES ?= -I@@INCDIR@@ -I@@INCDIR@@/$(EFI_ARCH) -I@@INCDIR@@/protocol
4c0d37
+EFI_CPPFLAGS ?= -ffreestanding -nostdlib -fpic \
4c0d37
+		$(EFI_INCLUDES) $(EFI_CC_INCLUDES) \
4c0d37
+		-DCONFIG_$(EFI_ARCH) -DCONFIG_ARCH=$(EFI_ARCH) \
4c0d37
+		-Wno-error=pragmas -fvisibility=hidden \
4c0d37
+		-fshort-wchar -fno-strict-aliasing -fno-stack-protector \
4c0d37
+		$(if $(findstring gcc,$(EFI_CC)),-fno-merge-all-constants,) \
4c0d37
+		$(EFI_ARCH_CPPFLAGS)
4c0d37
+EFI_CFLAGS ?= $(EFI_CPPFLAGS) $(EFI_ARCH_CFLAGS)
4c0d37
+ifeq ($(origin EFI_LDLIBS),undefined)
4c0d37
+EFI_LDLIBS := -lefi -lgnuefi
4c0d37
+endif
4c0d37
+ifeq ($(origin EFI_LDFLAGS),undefined)
4c0d37
+EFI_LDFLAGS := $(GNUEFI_LDFLAGS) $(EFI_ARCH_LDFLAGS)
4c0d37
+endif
4c0d37
+EFI_CCLDLIBS ?= $(foreach x,$(EFI_LDLIBS),$(x))
4c0d37
+EFI_CCLDFLAGS ?= $(foreach x,$(EFI_LDFLAGS),-Wl$(_efi_comma)$(x))
4c0d37
+EFI_ARFLAGS ?= rDv
4c0d37
+EFI_ASFLAGS ?= $(EFI_ARCH_3264)
4c0d37
+EFI_LIBGCC ?= $(shell $(EFI_CC) $(EFI_ARCH_3264) -print-libgcc-file-name)
4c0d37
+EFI_LDSCRIPT ?= @@GNUEFIDIR@@/efi.lds
4c0d37
+_EFI_CCLDLIBS = $(subst $(_efi_space),$(_efi_comma),-Wl --start-group $(foreach x,$(EFI_CCLDLIBS),$(x)) --end-group)
4c0d37
+
4c0d37
+EFI_BIN_SECTIONS ?= .text .sdata .data .dynamic .dynsym \
4c0d37
+		    .rel .rel.* .rela .rela.* .reloc \
4c0d37
+		    .eh_frame .note.gnu.build-id .ctf \
4c0d37
+		    $(EFI_ARCH_BIN_SECTIONS)
4c0d37
+
4c0d37
+EFI_DEBUG_SECTIONS ?= .debug* .eh_frame .note.gnu.build-id .ctf \
4c0d37
+		      $(EFI_ARCH_DEBUG_SECTIONS)
4c0d37
+EFI_OBJCOPY_FLAGS ?= --file-alignment 512 --section-alignment 4096 -D
4c0d37
+
4c0d37
+%.efi : %.efi.so
4c0d37
+ifneq ($(EFI_OBJCOPY_GTE224),1)
4c0d37
+        $(error objcopy >= 2.24 is required)
4c0d37
+endif
4c0d37
+	$(OBJCOPY) $(EFI_OBJCOPY_FLAGS) \
4c0d37
+		$(foreach x,$(EFI_BIN_SECTIONS),-j $(x)) \
4c0d37
+		$(EFI_ARCH_FORMAT) $*.efi.so $@
4c0d37
+
4c0d37
+%.efi.debug : %.efi.so
4c0d37
+ifneq ($(EFI_OBJCOPY_GTE224),1)
4c0d37
+        $(error objcopy >= 2.24 is required)
4c0d37
+endif
4c0d37
+	$(OBJCOPY) $(EFI_OBJCOPY_FLAGS) \
4c0d37
+		$(foreach x,$(EFI_DEBUG_SECTIONS),-j $(x)) \
4c0d37
+		$(EFI_ARCH_FORMAT) $*.efi.so $@
4c0d37
+
4c0d37
+%.efi.a :
4c0d37
+	$(AR) $(EFI_ARFLAGS) $@ $^
4c0d37
+
4c0d37
+%.efi.so :
4c0d37
+	$(EFI_CC) $(EFI_CFLAGS) $(EFI_CCLDFLAGS) -o $@ $^ $(_EFI_CCLDLIBS) $(EFI_LIBGCC) -T $(EFI_LDSCRIPT)
4c0d37
+
4c0d37
+%.efi.o : %.c
4c0d37
+	$(EFI_CC) $(EFI_CFLAGS) -c -o $@ $<
4c0d37
+
4c0d37
+%.efi.o : %.S
4c0d37
+	$(EFI_CC) $(EFI_CFLAGS) -c -o $@ $<
4c0d37
+
4c0d37
+efi_clean ::
4c0d37
+	@rm -vf *.efi.{a,debug,o,so} *.efi
4c0d37
+
4c0d37
+.PHONY: efi_clean
4c0d37
+
4c0d37
+export EFI_ARCH
4c0d37
+export EFI_ARCH_CCLDFLAGS EFI_ARCH_CFLAGS EFI_ARCH_CPPFLAGS EFI_ARCH_LDFLAGS
4c0d37
+export EFI_ARCH_CLANG_BUGS EFI_ARCH_CAN_DISABLE_AVX
4c0d37
+export EFI_ARCH_FORMAT EFI_ARCH_SUBSYSTEM EFI_ARCH_SUFFIX EFI_ARCH_SUFFIX_UPPER
4c0d37
+export EFI_ARCH_TIMESTAMP_LOCATION EFI_ARCH_3264
4c0d37
+export EFI_ARFLAGS EFI_ASFLAGS EFI_BFDARCH EFI_CC EFI_CFLAGS EFI_CPPFLAGS
4c0d37
+export EFI_LDFLAGS EFI_LDSCRIPT EFI_HOSTARCH EFI_HOSTCC EFI_INCLUDES
4c0d37
+export EFI_LIBGCC EFI_LIBS
4c0d37
+
4c0d37
+# vim:ft=make
4c0d37
diff --git a/inc/ia32.mk b/inc/ia32.mk
4c0d37
new file mode 100644
4c0d37
index 00000000000..d961db70031
4c0d37
--- /dev/null
4c0d37
+++ b/inc/ia32.mk
4c0d37
@@ -0,0 +1,30 @@
4c0d37
+#
4c0d37
+# efi-ia32.mk
4c0d37
+# Peter Jones, 2019-11-13 14:27
4c0d37
+#
4c0d37
+ifeq ($(EFI_ARCH),ia32)
4c0d37
+
4c0d37
+ifeq ($(EFI_HOSTARCH),x64)
4c0d37
+EFI_ARCH_3264 := -m32
4c0d37
+else
4c0d37
+EFI_ARCH_3264 :=
4c0d37
+endif
4c0d37
+EFI_ARCH_CAN_DISABLE_AVX := $(shell $(EFI_CC) -Werror -c -o /dev/null -xc -mno-avx - </dev/null >/dev/null 2>&1 && echo -mno-avx)
4c0d37
+EFI_ARCH_CLANG_BUGS := $(if $(findstring gcc,$(EFI_CC)),-maccumulate-outgoing-args,)
4c0d37
+
4c0d37
+EFI_ARCH_CFLAGS := -mno-mmx -mno-sse \
4c0d37
+		   $(EFI_ARCH_3264) \
4c0d37
+		   $(EFI_ARCH_CAN_DISABLE_AVX) \
4c0d37
+		   $(EFI_ARCH_CLANG_BUGS) \
4c0d37
+		   -DPAGE_SIZE=4096 -DPAGE_SHIFT=12
4c0d37
+EFI_ARCH_LDFLAGS :=
4c0d37
+EFI_ARCH_FORMAT := --target efi-app-$(EFI_BFDARCH)
4c0d37
+EFI_ARCH_SUFFIX := ia32
4c0d37
+EFI_ARCH_SUFFIX_UPPER := IA32
4c0d37
+EFI_ARCH_TIMESTAMP_LOCATION := 136
4c0d37
+
4c0d37
+export EFI_ARCH_CFLAGS EFI_ARCH_CPPFLAGS EFI_ARCH_LDFLAGS
4c0d37
+export EFI_ARCH_FORMAT EFI_ARCH_SUBSYSTEM EFI_ARCH_SUFFIX EFI_ARCH_SUFFIX_UPPER
4c0d37
+export EFI_ARCH_TIMESTAMP_LOCATION EFI_ARCH_3264
4c0d37
+export EFI_ARCH_CLANG_BUGS EFI_ARCH_CAN_DISABLE_AVX
4c0d37
+endif
4c0d37
diff --git a/inc/ia64.mk b/inc/ia64.mk
4c0d37
new file mode 100644
4c0d37
index 00000000000..29b3f1c4f8e
4c0d37
--- /dev/null
4c0d37
+++ b/inc/ia64.mk
4c0d37
@@ -0,0 +1,19 @@
4c0d37
+#
4c0d37
+# efi-ia64.mk
4c0d37
+# Peter Jones, 2019-11-13 14:27
4c0d37
+#
4c0d37
+ifeq ($(EFI_ARCH),ia64)
4c0d37
+
4c0d37
+EFI_ARCH_CFLAGS := -mfixed-range=f32-f127 -m64 \
4c0d37
+		   -DPAGE_SIZE=4096 -DPAGE_SHIFT=12
4c0d37
+EFI_ARCH_LDFLAGS :=
4c0d37
+EFI_ARCH_SUFFIX := ia64
4c0d37
+EFI_ARCH_SUFFIX_UPPER := IA64
4c0d37
+# XXX I have no idea if this is right
4c0d37
+EFI_ARCH_TIMESTAMP_LOCATION := 136
4c0d37
+
4c0d37
+export EFI_ARCH_CFLAGS EFI_ARCH_CPPFLAGS EFI_ARCH_LDFLAGS
4c0d37
+export EFI_ARCH_FORMAT EFI_ARCH_SUBSYSTEM EFI_ARCH_SUFFIX EFI_ARCH_SUFFIX_UPPER
4c0d37
+export EFI_ARCH_TIMESTAMP_LOCATION EFI_ARCH_3264
4c0d37
+export EFI_ARCH_CLANG_BUGS EFI_ARCH_CAN_DISABLE_AVX
4c0d37
+endif
4c0d37
diff --git a/inc/mips64el.mk b/inc/mips64el.mk
4c0d37
new file mode 100644
4c0d37
index 00000000000..257180955b6
4c0d37
--- /dev/null
4c0d37
+++ b/inc/mips64el.mk
4c0d37
@@ -0,0 +1,22 @@
4c0d37
+#
4c0d37
+# efi-mips64el.mk
4c0d37
+# Peter Jones, 2019-11-13 14:27
4c0d37
+#
4c0d37
+ifeq ($(EFI_ARCH),mips64el)
4c0d37
+
4c0d37
+EFI_ARCH_3264 := -mabi=64
4c0d37
+
4c0d37
+EFI_ARCH_CFLAGS := -march=mips64r2 -EL $(EFI_ARCH_3264) \
4c0d37
+		   -DPAGE_SIZE=4096 -DPAGE_SHIFT=12
4c0d37
+EFI_ARCH_LDFLAGS := -EL
4c0d37
+EFI_ARCH_FORMAT := --target efi-app-$(EFI_BFDARCH)
4c0d37
+EFI_ARCH_SUFFIX := mips64el
4c0d37
+EFI_ARCH_SUFFIX_UPPER := MIPS64EL
4c0d37
+# XXX I have no idea if this is right
4c0d37
+EFI_ARCH_TIMESTAMP_LOCATION := 136
4c0d37
+EFI_ARCH_HAVE_OBJCOPY := y
4c0d37
+
4c0d37
+export EFI_ARCH_CFLAGS EFI_ARCH_CPPFLAGS EFI_ARCH_LDFLAGS
4c0d37
+export EFI_ARCH_FORMAT EFI_ARCH_SUBSYSTEM EFI_ARCH_SUFFIX EFI_ARCH_SUFFIX_UPPER
4c0d37
+export EFI_ARCH_TIMESTAMP_LOCATION EFI_ARCH_3264 EFI_ARCH_HAVE_OBJCOPY
4c0d37
+endif
4c0d37
diff --git a/inc/x64.mk b/inc/x64.mk
4c0d37
new file mode 100644
4c0d37
index 00000000000..bc1093988b3
4c0d37
--- /dev/null
4c0d37
+++ b/inc/x64.mk
4c0d37
@@ -0,0 +1,31 @@
4c0d37
+#
4c0d37
+# efi-x64.mk
4c0d37
+# Peter Jones, 2019-11-13 14:27
4c0d37
+#
4c0d37
+ifeq ($(EFI_ARCH),x64)
4c0d37
+
4c0d37
+ifeq ($(EFI_HOSTARCH),ia32)
4c0d37
+EFI_ARCH_3264 := -m64
4c0d37
+else
4c0d37
+EFI_ARCH_3264 :=
4c0d37
+endif
4c0d37
+EFI_ARCH_CAN_DISABLE_AVX := $(shell $(EFI_CC) -Werror -c -o /dev/null -xc -mno-avx - </dev/null >/dev/null 2>&1 && echo -mno-avx)
4c0d37
+EFI_ARCH_CLANG_BUGS := $(if $(findstring gcc,$(EFI_CC)),-maccumulate-outgoing-args,)
4c0d37
+
4c0d37
+EFI_ARCH_CFLAGS := -mno-mmx -mno-sse -mno-red-zone \
4c0d37
+		   $(EFI_ARCH_3264) \
4c0d37
+		   $(EFI_ARCH_CAN_DISABLE_AVX) \
4c0d37
+		   $(EFI_ARCH_CLANG_BUGS) \
4c0d37
+		   -DEFI_FUNCTION_WRAPPER -DGNU_EFI_USE_MS_ABI \
4c0d37
+		   -DPAGE_SIZE=4096 -DPAGE_SHIFT=12
4c0d37
+EFI_ARCH_LDFLAGS :=
4c0d37
+EFI_ARCH_FORMAT := --target efi-app-$(EFI_BFDARCH)
4c0d37
+EFI_ARCH_SUFFIX := x64
4c0d37
+EFI_ARCH_SUFFIX_UPPER := X64
4c0d37
+EFI_ARCH_TIMESTAMP_LOCATION := 136
4c0d37
+
4c0d37
+export EFI_ARCH_CFLAGS EFI_ARCH_CPPFLAGS EFI_ARCH_LDFLAGS
4c0d37
+export EFI_ARCH_FORMAT EFI_ARCH_SUBSYSTEM EFI_ARCH_SUFFIX EFI_ARCH_SUFFIX_UPPER
4c0d37
+export EFI_ARCH_TIMESTAMP_LOCATION EFI_ARCH_3264
4c0d37
+export EFI_ARCH_CLANG_BUGS EFI_ARCH_CAN_DISABLE_AVX
4c0d37
+endif