107 lines
2.8 KiB
Makefile
107 lines
2.8 KiB
Makefile
override CC := x86_64-none-elf-gcc
|
|
override LD := x86_64-none-elf-ld
|
|
override OBJCOPY := x86_64-none-elf-objcopy
|
|
|
|
# For GNU-EFI
|
|
override PREFIX := $(shell dirname $$(dirname $$(which $(CC))))
|
|
override INC := $(PREFIX)/include
|
|
override LIBS := $(PREFIX)/lib
|
|
override GNUEFICRT0 := $(PREFIX)/lib/crt0-efi-x86_64.o
|
|
override GNUEFILDS := $(PREFIX)/lib/elf_x86_64_efi.lds
|
|
|
|
# OVMF supplied by OS
|
|
override OVMF_CODE := /usr/share/OVMF/OVMF_CODE.fd
|
|
override OVMF_VARS := /usr/share/OVMF/OVMF_VARS.fd
|
|
ifeq ("$(wildcard $(OVMF_CODE))","")
|
|
override OVMF_CODE := /usr/share/edk2/x64/OVMF_CODE.fd
|
|
endif
|
|
ifeq ("$(wildcard $(OVMF_CODE))","")
|
|
override OVMF_CODE := $(PREFIX)/share/OVMF/OVMF_CODE_4M.fd
|
|
endif
|
|
ifeq ("$(wildcard $(OVMF_VARS))","")
|
|
override OVMF_VARS := /usr/share/edk2/x64/OVMF_VARS.fd
|
|
endif
|
|
ifeq ("$(wildcard $(OVMF_VARS))","")
|
|
override OVMF_VARS := $(PREFIX)/share/OVMF/OVMF_VARS_4M.fd
|
|
endif
|
|
|
|
$(info $$OVMF_CODE is [${OVMF_CODE}])
|
|
$(info $$OVMF_VARS is [${OVMF_VARS}])
|
|
|
|
override CFLAGS := \
|
|
-mno-red-zone \
|
|
-fshort-wchar \
|
|
-march=x86-64 \
|
|
-mcmodel=large \
|
|
-Iarch/x86_64/include \
|
|
-D_ARCH_AMD64
|
|
|
|
override LDFLAGS := \
|
|
-m elf_x86_64 \
|
|
-T arch/x86_64/linker.ld
|
|
|
|
.PHONY: all
|
|
all: shinobu asagiri.img
|
|
|
|
.PHONY: run
|
|
run: shinobu asagiri.img
|
|
if [ "$$(uname -a | grep -i 'microsoft')" ]; then \
|
|
export IMAGE_PATH=$$(wslpath -wa build/asagiri.img); \
|
|
export OVMF_CODE=$$(wslpath -wa $(OVMF_CODE)); \
|
|
export OVMF_VARS=$$(wslpath -wa $(OVMF_VARS)); \
|
|
else \
|
|
export IMAGE_PATH=build/asagiri.img; \
|
|
export OVMF_CODE=$(OVMF_CODE); \
|
|
export OVMF_VARS=$(OVMF_VARS); \
|
|
fi; \
|
|
qemu-system-x86_64 -cpu qemu64 -net none -monitor stdio -m 4G \
|
|
-drive if=pflash,format=raw,unit=0,file=$$OVMF_CODE,readonly=on \
|
|
-drive if=pflash,format=raw,unit=1,file=$$OVMF_VARS,readonly=on \
|
|
-drive if=ide,format=raw,file=$$IMAGE_PATH
|
|
|
|
### Bootloader
|
|
shinobu: build/bin/shinobu
|
|
|
|
override BCFILES := $(shell find -L shinobu/* -type f -name '*.c')
|
|
override BOBJ := $(addprefix build/shinobu/obj/,$(BCFILES:.c=.c.o))
|
|
|
|
# Compilation rules for bootloader *.c files.
|
|
build/shinobu/obj/%.c.o: %.c
|
|
mkdir -p "$$(dirname $@)"
|
|
|
|
$(CC) $(CFLAGS) \
|
|
-I$(INC) \
|
|
-Ishinobu/include \
|
|
-DEFI_FUNCTION_WRAPPER \
|
|
-c $< -o $@
|
|
|
|
# Linking the bootloader
|
|
build/bin/shinobu: $(BOBJ)
|
|
mkdir -p "$$(dirname $@)"
|
|
|
|
$(LD) $(BOBJ) \
|
|
$(GNUEFICRT0) \
|
|
-T $(GNUEFILDS) \
|
|
-L $(LIBS) \
|
|
-l:libgnuefi.a \
|
|
-l:libefi.a \
|
|
-nostdlib \
|
|
-znocombreloc \
|
|
-shared \
|
|
-z noexecstack \
|
|
-Bsymbolic \
|
|
--no-warn-rwx-segments \
|
|
-o $@
|
|
|
|
$(OBJCOPY) \
|
|
-j .text \
|
|
-j .sdata \
|
|
-j .data \
|
|
-j .dynamic \
|
|
-j .dynsym \
|
|
-j .rel \
|
|
-j .rela \
|
|
-j .reloc \
|
|
--target=efi-app-x86_64 \
|
|
$@ $$(dirname $@)/BOOTX64.EFI
|