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)