ponono ponono; buildenv.shやqemuの実行を取り込んだMakefile - uchan-nos/os-from-zero GitHub Wiki

makeするたびにbuildenv.shを実行したり、qemuの実行コマンドが長くて面倒だったので、諸々 Makefile にまとめました。 あまりきれいなコードではないですが、kernel.elfのビルドだけでなく、Loader.efiのビルドも取り込んでいるので、 Loader.efiのビルド忘れによるエラーが起きないようになっています。

大した内容ではないですが、自分でMakefileを弄るのが面倒な方は、よければ使ってみてください。 以下の内容は osbook_06b osbook_day06c 時点のものですが、OBJS 変数のところを変更することで以降の章でも対応できると思います。 (OBJS 変数以外の箇所に変更が入った場合は適宜対応おねがいします)

※) 2021/05/24 12:03 osbook_06c対応版に差し替え
変更点:1.OBJS にファイルを追加
変更点:2.CPPFLAGS の引数が1つ(最後の -I.)が抜けていたので追加
変更点:3.Loader.efi ファイルを消してから make を実行しても Loader.efi ファイルが再生成されなかったため、ディレクトリを削除するように変更。 2がないと、USBドライバのファイルでerror.hppのインポートエラーが発生する

SHELL := /bin/bash

CLANGPP  = clang++
CLANG    = clang
MAKEFONT = ~/workspace/mikanos/tools/makefont.py
OBJCOPY  = objcopy

EFI_TARGET    = Loader.efi
KERNEL_TARGET = kernel.elf
OBJS          = main.o graphics.o mouse.o font.o hankaku.o \
                newlib_support.o console.o pci.o asmfunc.o \
                libcxx_support.o logger.o \
                usb/memory.o usb/device.o usb/xhci/ring.o usb/xhci/trb.o \
                usb/xhci/xhci.o usb/xhci/port.o usb/xhci/device.o \
                usb/xhci/devmgr.o usb/xhci/registers.o \
                usb/classdriver/base.o usb/classdriver/hid.o \
                usb/classdriver/keyboard.o usb/classdriver/mouse.o

DEPENDS = $(join $(dir $(OBJS)),$(addprefix .,$(notdir $(OBJS:.o=.d))))

DEVENV_DIR   = $(HOME)/osbook/devenv
BASE_DIR     = $(DEVENV_DIR)/x86_64-elf
EDK2_DIR     = $(HOME)/edk2
EFI_FILE_DIR = $(EDK2_DIR)/Build/MikanLoaderX64/DEBUG_CLANG38/X64
KERNEL_DIR   = $(EDK2_DIR)/MikanLoaderPkg/../kernel

EFI_FILE     = $(EFI_FILE_DIR)/$(EFI_TARGET)
ANOTHER_FILE = $(KERNEL_DIR)/$(KERNEL_TARGET)
DISK_IMG     = $(DEVENV_DIR)/disk.img
MOUNT_POINT  = $(DEVENV_DIR)/mnt

OBJCOPYFLAGS += -I binary -O elf64-x86-64 -B i386:x86-64
CPPFLAGS += -I$(BASE_DIR)/include/c++/v1 -I$(BASE_DIR)/include \
            -I$(BASE_DIR)/include/freetype2 -I$(EDK2_DIR)/MdePkg/Include \
            -I$(EDK2_DIR)/MdePkg/Include/X64 \
            -nostdlibinc -D__ELF__ -D_LDBL_EQ_DBL -D_GNU_SOURCE \
            -D_POSIX_TIMERS -DEFIAPI='__attribute__((ms_abi))' -I.
CFLAGS   += -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone
CXXFLAGS += -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone \
            -fno-exceptions -fno-rtti -std=c++17
LDFLAGS  += -L$(BASE_DIR)/lib \
            --entry KernelMain -z norelro --image-base 0x100000 --static
.PHONY: all
all: $(EFI_TARGET) $(KERNEL_TARGET)

.PHONY: clean
clean:
  rm -rf *.o
  rm -rf *.bin
  rm -rf *.img
  rm -rf *.elf
  rm -rf $(HOME)/edk2/Build/MikanLoaderX64

.PHONY: run_qemu
run_qemu: all
  $(DEVENV_DIR)/run_qemu.sh $(EFI_FILE) $(ANOTHER_FILE)

$(EFI_TARGET): Makefile
  cd $(EDK2_DIR); \
  source ./edksetup.sh; \
  build

$(KERNEL_TARGET): $(OBJS) Makefile
  ld.lld $(LDFLAGS) -o $(KERNEL_TARGET) $(OBJS) -lc -lc++

%.o: %.cpp Makefile
  $(CLANGPP) $(CPPFLAGS) $(CXXFLAGS) -c $<

.%.d: %.cpp
  $(CLANGPP) $(CPPFLAGS) $(CXXFLAGS) -MM $< > $@
  $(eval OBJ = $(<:.cpp=.o))
  sed --in-place 's|$(notdir $(OBJ))|$(OBJ)|' $@

%.o: %.c Makefile
  $(CLANG) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

.%.d: %.c
  $(CLANG) $(CPPFLAGS) $(CFLAGS) -MM $< > $@
  $(eval OBJ = $(<:.c=.o))
  sed --in-place 's|$(notdir $(OBJ))|$(OBJ)|' $@

%.o: %.asm Makefile
  nasm -f elf64 -o $@ $<

hankaku.o: hankaku.bin
  $(OBJCOPY) $(OBJCOPYFLAGS) $< $@

hankaku.bin: hankaku.txt
  $(MAKEFONT) -o $@ $<

.%.d: %.bin
  touch $@

.PHONY: depends
depends:
  $(MAKE) $(DEPENDS)

-include $(DEPENDS)