aboutsummaryrefslogtreecommitdiffstats
path: root/Make.rules
blob: 7fc31589c886b49e9bb6610c69dca9d5ad76d89a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
EFISIGNED = $(patsubst %.efi,%-signed.efi,$(EFIFILES))
MANPAGES = $(patsubst doc/%.1.in,doc/%.1,$(wildcard doc/*.1.in))
HELP2MAN = help2man
ARCH	= $(shell uname -m)
INCDIR	   = -I$(TOPDIR)include/ -I/usr/include/efi -I/usr/include/efi/$(ARCH) -I/usr/include/efi/protocol
CPPFLAGS   = -DCONFIG_$(ARCH)
CFLAGS	   = -O2 -fpic -Wall -fshort-wchar -fno-strict-aliasing -fno-merge-constants -mno-red-zone -fno-stack-protector
LDFLAGS	   = -nostdlib
CRTOBJ		= crt0-efi-$(ARCH).o
CRTPATHS	= /lib /lib64 /lib/efi /lib64/efi /usr/lib /usr/lib64 /usr/lib/efi /usr/lib64/efi
CRTPATH		= $(shell for f in $(CRTPATHS); do if [ -e $$f/$(CRTOBJ) ]; then echo $$f; break; fi; done)
CRTOBJS		= $(CRTPATH)/$(CRTOBJ)
# there's a bug in the gnu tools ... the .reloc section has to be
# aligned otherwise the file alignment gets screwed up
LDSCRIPT	= $(TOPDIR)/elf_$(ARCH)_efi.lds
LDFLAGS		+= -T $(LDSCRIPT) -shared -Bsymbolic $(CRTOBJS) -L $(CRTPATH)
LOADLIBES	= -lefi -lgnuefi $(shell $(CC) -print-libgcc-file-name)
FORMAT		= efi-app-$(ARCH)
OBJCOPY		= objcopy
MYGUID		= 11111111-2222-3333-4444-123456789abc
INSTALL		= install
BINDIR		= $(DESTDIR)/usr/bin
MANDIR		= $(DESTDIR)/usr/share/man/man1
EFIDIR		= $(DESTDIR)/usr/share/efitools/efi
DOCDIR		= $(DESTDIR)/usr/share/efitools

ifeq ($(ARCH),x86_64)
  CFLAGS += -DEFI_FUNCTION_WRAPPER
endif

%.efi: %.so
	$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \
		-j .rela -j .reloc --target=$(FORMAT) $*.so $@

%.so: %.o
	$(LD) $(LDFLAGS) $^ -o $@ $(LOADLIBES)
	# check we have no undefined symbols
	nm -D $@ | grep ' U ' && exit 1 || exit 0

%.h: %.auth
	xxd -i $< > $@

%.hash: %.efi hash-to-efi-sig-list
	./hash-to-efi-sig-list $< $@

%.esl: %.crt cert-to-efi-sig-list
	./cert-to-efi-sig-list -g $(MYGUID) $< $@

%.auth: %.esl sign-efi-sig-list
	./sign-efi-sig-list -c $*.crt -k $*.key $* $< $@

%.o: %.c
	$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

%.efi.o: %.c
	$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -fno-toplevel-reorder -DBUILD_EFI -c $< -o $@

%.efi.s: %.c
	$(CC) -S $(INCDIR) $(CFLAGS) $(CPPFLAGS) -fno-toplevel-reorder -DBUILD_EFI -c $< -o $@


%.cer: %.crt
	openssl x509 -in $< -out $@ -outform DER

%-subkey.csr:
	openssl req -new -newkey rsa:2048 -keyout $*-subkey.key -subj "/CN=Subkey $* of KEK/" -out $@ -nodes

%-subkey.crt: %-subkey.csr KEK.crt
	openssl x509 -req -in $< -CA DB.crt -CAkey DB.key -set_serial 1 -out $@ -days 365

%-signed.efi: %.efi DB.crt
	sbsign --key DB.key --cert DB.crt --output $@ $<

##
# No need for KEK signing
##
#%-kek-signed.efi: %.efi KEK.crt
#	sbsign --key KEK.key --cert KEK.crt --output $@ $<

%.a:
	ar rcv $@ $^

doc/%.1: doc/%.1.in %
	$(HELP2MAN) --no-info -i $< -o $@ ./$*