blob: ae2f4e107ad873186e8e98f66faacdcba33f368e [file] [log] [blame]
# Copyright 2018 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)
MULTIBOOT_BIN := $(BUILDDIR)/multiboot.bin
MULTIBOOT_ELF := $(BUILDDIR)/multiboot.elf
MULTIBOOT_LDFLAGS := -m elf_i386
MULTIBOOT_LDSCRIPT := $(LOCAL_DIR)/multiboot.ld
MULTIBOOT_COMPILEFLAGS := \
$(NO_SAFESTACK) $(NO_SANITIZERS) \
-m32 -mregparm=3 -fno-pic \
-Ikernel/arch/x86/page_tables/include \
-Ikernel/platform/pc/include \
-Isystem/ulib/zbi/include
MULTIBOOT_SRCDEPS := $(KERNEL_CONFIG_HEADER)
MULTIBOOT_SRCS := \
$(LOCAL_DIR)/multiboot-start.S \
$(LOCAL_DIR)/multiboot-main.c \
$(LOCAL_DIR)/paging.c \
$(LOCAL_DIR)/trampoline.c \
$(LOCAL_DIR)/util.c \
system/ulib/libzbi/zbi.c
MULTIBOOT_OBJS := $(MULTIBOOT_SRCS:%=$(BUILDDIR)/$(LOCAL_DIR)/%.o)
$(filter %.S.o,$(MULTIBOOT_OBJS)): \
$(BUILDDIR)/$(LOCAL_DIR)/%.S.o: %.S $(MULTIBOOT_SRCDEPS)
@$(MKDIR)
$(call BUILDECHO, assembling $<)
$(NOECHO)$(CC) $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) \
$(GLOBAL_OPTFLAGS) $(GLOBAL_ASMFLAGS) \
$(KERNEL_ASMFLAGS) $(ARCH_ASMFLAGS) \
$(KERNEL_COMPILEFLAGS) $(MULTIBOOT_COMPILEFLAGS) \
$(KERNEL_INCLUDES) $(GLOBAL_INCLUDES) \
-c $< -MMD -MP -MT $@ -MF $(@:%o=%d) -o $@
$(filter %.c.o,$(MULTIBOOT_OBJS)): \
$(BUILDDIR)/$(LOCAL_DIR)/%.c.o: %.c $(MULTIBOOT_SRCDEPS)
@$(MKDIR)
$(call BUILDECHO, compiling $<)
$(NOECHO)$(CC) $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) \
$(GLOBAL_OPTFLAGS) $(GLOBAL_CFLAGS) \
$(KERNEL_CFLAGS) $(ARCH_CFLAGS) \
$(KERNEL_COMPILEFLAGS) $(MULTIBOOT_COMPILEFLAGS) \
$(KERNEL_INCLUDES) $(GLOBAL_INCLUDES) \
-c $< -MMD -MP -MT $@ -MF $(@:%o=%d) -o $@
ALLSRCS += $(MULTIBOOT_SRCS)
ALLOBJS += $(MULTIBOOT_OBJS)
$(MULTIBOOT_ELF): $(MULTIBOOT_LDSCRIPT) $(MULTIBOOT_OBJS)
$(call BUILDECHO,linking $@)
$(NOECHO)$(LD) $(GLOBAL_LDFLAGS) $(KERNEL_LDFLAGS) \
$(MULTIBOOT_LDFLAGS) -o $@ -T $^
GENERATED += $(MULTIBOOT_ELF)
EXTRA_IDFILES += $(MULTIBOOT_ELF).id
# We could make a Multiboot image meant to be loaded without ELF headers
# and do `objcopy -O binary` here. But there's no reason to, and having an
# ELF binary to look at is nicer. To remove the ELF headers instead, the
# linker script would need to remove `+ SIZEOF_HEADERS` and then the
# multiboot header would be first thing in the raw binary.
$(MULTIBOOT_BIN): $(MULTIBOOT_ELF).strip
$(call BUILDECHO, generating $@)
$(NOECHO)ln -f $< $@
GENERATED += $(MULTIBOOT_BIN) $(MULTIBOOT_ELF).strip
# Build the multiboot trampoline whenever building the kernel.
kernel: $(MULTIBOOT_BIN)