# Copyright 2016 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT

LOCAL_DIR := $(GET_LOCAL_DIR)

EFI_LIBDIRS := system/ulib/tftp

EFI_CFLAGS += -I$(LOCAL_DIR)/include -I$(LOCAL_DIR)/src
EFI_CFLAGS += -Isystem/public -Isystem/private
EFI_CFLAGS += $(foreach LIBDIR,$(EFI_LIBDIRS),-I$(LIBDIR)/include)

ifeq ($(call TOBOOL,$(USE_CLANG)),true)
EFI_LDFLAGS := /subsystem:efi_application /entry:efi_main /libpath:out
else
EFI_LINKSCRIPT := $(LOCAL_DIR)/build/efi-x86-64.lds
EFI_LDFLAGS := -nostdlib -T $(EFI_LINKSCRIPT) -pie -Lout
endif

EFI_SECTIONS := .text .data .reloc
EFI_SECTIONS := $(patsubst %,-j %,$(EFI_SECTIONS))

ifeq ($(EFI_ARCH),x86_64)
EFI_SO          := $(BUILDDIR)/bootloader/bootx64.so
EFI_BOOTLOADER  := $(BUILDDIR)/bootloader/bootx64.efi
else ifeq ($(EFI_ARCH),aarch64)
EFI_SO          := $(BUILDDIR)/bootloader/bootaa64.so
EFI_BOOTLOADER  := $(BUILDDIR)/bootloader/bootaa64.efi
endif

# Bootloader sources
EFI_SOURCES := \
    $(LOCAL_DIR)/src/osboot.c \
    $(LOCAL_DIR)/src/diskio.c \
    $(LOCAL_DIR)/src/cmdline.c \
    $(LOCAL_DIR)/src/zircon.c \
    $(LOCAL_DIR)/src/misc.c \
    $(LOCAL_DIR)/src/netboot.c \
    $(LOCAL_DIR)/src/netifc.c \
    $(LOCAL_DIR)/src/inet6.c \
    $(LOCAL_DIR)/src/pci.c \
    $(LOCAL_DIR)/src/framebuffer.c \
    $(LOCAL_DIR)/src/device_id.c \

# libxefi sources
EFI_SOURCES += \
    $(LOCAL_DIR)/lib/efi/guids.c \
    $(LOCAL_DIR)/lib/xefi.c \
    $(LOCAL_DIR)/lib/loadfile.c \
    $(LOCAL_DIR)/lib/console-printf.c \
    $(LOCAL_DIR)/lib/ctype.c \
    $(LOCAL_DIR)/lib/printf.c \
    $(LOCAL_DIR)/lib/stdlib.c \
    $(LOCAL_DIR)/lib/string.c \
    $(LOCAL_DIR)/lib/strings.c \
    $(LOCAL_DIR)/lib/inet.c \

EFI_OBJS := $(patsubst $(LOCAL_DIR)/%.c,$(BUILDDIR)/bootloader/%.o,$(EFI_SOURCES))
EFI_DEPS := $(patsubst %.o,%.d,$(EFI_OBJS))
EFI_LIBS := $(foreach LIBDIR,$(EFI_LIBDIRS), \
                 $(BUILDDIR)/EFI_libs/lib$(notdir $(LIBDIR)).a)

$(BUILDDIR)/bootloader/%.o : $(LOCAL_DIR)/%.c
	@$(MKDIR)
	$(call BUILDECHO,compiling $<)
	$(NOECHO)$(EFI_CC) -MMD -MP -o $@ -c $(EFI_OPTFLAGS) $(EFI_COMPILEFLAGS) $(EFI_CFLAGS) $<

ifeq ($(call TOBOOL,$(USE_CLANG)),true)

$(EFI_BOOTLOADER): $(EFI_OBJS) $(EFI_LIBS)
	@$(MKDIR)
	$(call BUILDECHO,linking $@)
	$(NOECHO)$(EFI_LD) /out:$@ $(EFI_LDFLAGS) $^

else

$(EFI_SO): $(EFI_OBJS) $(EFI_LIBS)
	@$(MKDIR)
	$(call BUILDECHO,linking $@)
	$(NOECHO)$(EFI_LD) -o $@ $(EFI_LDFLAGS) $^
	$(NOECHO)if ! $(READELF) -r $@ | grep -q 'no relocations'; then \
	    echo "error: $@ has relocations"; \
	    $(READELF) -r $@; \
	    rm $@; \
	    exit 1;\
	fi

# TODO: update this to build other ARCHes
$(EFI_BOOTLOADER): $(EFI_SO)
	@$(MKDIR)
	$(call BUILDECHO,building $@)
	$(NOECHO)$(OBJCOPY) --target=pei-x86-64 --subsystem 10 $(EFI_SECTIONS) $< $@
	$(NOECHO)if [ "`$(NM) $< | grep ' U '`" != "" ]; then echo "error: $<: undefined symbols"; $(NM) $< | grep ' U '; rm $<; exit 1; fi

endif

GENERATED += $(EFI_BOOTLOADER)

.PHONY: gigaboot
gigaboot: $(EFI_BOOTLOADER)

ifeq ($(call TOBOOL,$(ENABLE_ULIB_ONLY)),false)
# x86 only by default for now
ifeq ($(ARCH),x86)
bootloader: gigaboot
all:: bootloader
endif
endif

-include $(EFI_DEPS)
