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