1# Copyright 2016 The Fuchsia Authors
2#
3# Use of this source code is governed by a MIT-style
4# license that can be found in the LICENSE file or at
5# https://opensource.org/licenses/MIT
6
7LOCAL_DIR := $(GET_LOCAL_DIR)
8
9EFI_LIBDIRS := system/ulib/tftp
10
11EFI_CFLAGS += -I$(LOCAL_DIR)/include -I$(LOCAL_DIR)/src
12EFI_CFLAGS += -Isystem/public -Isystem/private
13EFI_CFLAGS += $(foreach LIBDIR,$(EFI_LIBDIRS),-I$(LIBDIR)/include)
14
15ifeq ($(call TOBOOL,$(USE_CLANG)),true)
16EFI_LDFLAGS := /subsystem:efi_application /entry:efi_main /libpath:out
17else
18EFI_LINKSCRIPT := $(LOCAL_DIR)/build/efi-x86-64.lds
19EFI_LDFLAGS := -nostdlib -T $(EFI_LINKSCRIPT) -pie -Lout
20endif
21
22EFI_SECTIONS := .text .data .reloc
23EFI_SECTIONS := $(patsubst %,-j %,$(EFI_SECTIONS))
24
25ifeq ($(EFI_ARCH),x86_64)
26EFI_SO          := $(BUILDDIR)/bootloader/bootx64.so
27EFI_BOOTLOADER  := $(BUILDDIR)/bootloader/bootx64.efi
28else ifeq ($(EFI_ARCH),aarch64)
29EFI_SO          := $(BUILDDIR)/bootloader/bootaa64.so
30EFI_BOOTLOADER  := $(BUILDDIR)/bootloader/bootaa64.efi
31endif
32
33# Bootloader sources
34EFI_SOURCES := \
35    $(LOCAL_DIR)/src/osboot.c \
36    $(LOCAL_DIR)/src/diskio.c \
37    $(LOCAL_DIR)/src/cmdline.c \
38    $(LOCAL_DIR)/src/zircon.c \
39    $(LOCAL_DIR)/src/misc.c \
40    $(LOCAL_DIR)/src/netboot.c \
41    $(LOCAL_DIR)/src/netifc.c \
42    $(LOCAL_DIR)/src/inet6.c \
43    $(LOCAL_DIR)/src/pci.c \
44    $(LOCAL_DIR)/src/framebuffer.c \
45    $(LOCAL_DIR)/src/device_id.c \
46
47# libxefi sources
48EFI_SOURCES += \
49    $(LOCAL_DIR)/lib/efi/guids.c \
50    $(LOCAL_DIR)/lib/xefi.c \
51    $(LOCAL_DIR)/lib/loadfile.c \
52    $(LOCAL_DIR)/lib/console-printf.c \
53    $(LOCAL_DIR)/lib/ctype.c \
54    $(LOCAL_DIR)/lib/printf.c \
55    $(LOCAL_DIR)/lib/stdlib.c \
56    $(LOCAL_DIR)/lib/string.c \
57    $(LOCAL_DIR)/lib/strings.c \
58    $(LOCAL_DIR)/lib/inet.c \
59
60EFI_OBJS := $(patsubst $(LOCAL_DIR)/%.c,$(BUILDDIR)/bootloader/%.o,$(EFI_SOURCES))
61EFI_DEPS := $(patsubst %.o,%.d,$(EFI_OBJS))
62EFI_LIBS := $(foreach LIBDIR,$(EFI_LIBDIRS), \
63                 $(BUILDDIR)/EFI_libs/lib$(notdir $(LIBDIR)).a)
64
65$(BUILDDIR)/bootloader/%.o : $(LOCAL_DIR)/%.c
66	@$(MKDIR)
67	$(call BUILDECHO,compiling $<)
68	$(NOECHO)$(EFI_CC) -MMD -MP -o $@ -c $(EFI_OPTFLAGS) $(EFI_COMPILEFLAGS) $(EFI_CFLAGS) $<
69
70ifeq ($(call TOBOOL,$(USE_CLANG)),true)
71
72$(EFI_BOOTLOADER): $(EFI_OBJS) $(EFI_LIBS)
73	@$(MKDIR)
74	$(call BUILDECHO,linking $@)
75	$(NOECHO)$(EFI_LD) /out:$@ $(EFI_LDFLAGS) $^
76
77else
78
79$(EFI_SO): $(EFI_OBJS) $(EFI_LIBS)
80	@$(MKDIR)
81	$(call BUILDECHO,linking $@)
82	$(NOECHO)$(EFI_LD) -o $@ $(EFI_LDFLAGS) $^
83	$(NOECHO)if ! $(READELF) -r $@ | grep -q 'no relocations'; then \
84	    echo "error: $@ has relocations"; \
85	    $(READELF) -r $@; \
86	    rm $@; \
87	    exit 1;\
88	fi
89
90# TODO: update this to build other ARCHes
91$(EFI_BOOTLOADER): $(EFI_SO)
92	@$(MKDIR)
93	$(call BUILDECHO,building $@)
94	$(NOECHO)$(OBJCOPY) --target=pei-x86-64 --subsystem 10 $(EFI_SECTIONS) $< $@
95	$(NOECHO)if [ "`$(NM) $< | grep ' U '`" != "" ]; then echo "error: $<: undefined symbols"; $(NM) $< | grep ' U '; rm $<; exit 1; fi
96
97endif
98
99GENERATED += $(EFI_BOOTLOADER)
100
101.PHONY: gigaboot
102gigaboot: $(EFI_BOOTLOADER)
103
104ifeq ($(call TOBOOL,$(ENABLE_ULIB_ONLY)),false)
105# x86 only by default for now
106ifeq ($(ARCH),x86)
107bootloader: gigaboot
108all:: bootloader
109endif
110endif
111
112-include $(EFI_DEPS)
113