asagiri/Makefile

111 lines
2.8 KiB
Makefile

override MAKEFLAGS += -rR
override ARCH ?= aarch64
ifeq ($(ARCH),aarch64)
include toolchain-aarch64.mk
else ifeq ($(ARCH),x86_64)
include toolchain-x86_64.mk
else
$(error Unknown target architecture $(ARCH))
endif
override CFLAGS += \
-O3 \
-pipe \
-Wall \
-Wextra \
-Wshadow \
-Wstrict-aliasing \
-pedantic \
-std=c99 \
-ffreestanding \
-fno-stack-protector \
-fno-lto \
-fPIE \
-Ihanekawa/include \
-Iyukari/include
override LDFLAGS += \
-nostdlib \
-pie \
-static \
--no-dynamic-linker \
-z noexecstack \
--no-omagic \
--no-warn-rwx-segments
asagiri: build/bin/yukari
## KERNEL
override KCFILES := $(shell find -L arch/$(ARCH)/* -type f -name '*.c')
override KCFILES += $(shell find -L hanekawa/* -type f -name '*.c')
override KCFILES += $(shell find -L yukari/* -type f -name '*.c')
override KOBJ := $(addprefix build/yukari/obj/,$(KCFILES:.c=.c.o))
# Compilation rule
build/yukari/obj/%.c.o: %.c
mkdir -p "$$(dirname $@)"
$(CC) $(CFLAGS) \
-D_IS_YUKARI\
-c $< -o $@
# Linking the kernel
build/bin/yukari: $(KOBJ)
mkdir -p "$$(dirname $@)"
$(LD) $(KOBJ) \
$(LDFLAGS) \
-o $@
## Userspace
override CFILES := $(shell find -L hanekawa/* -type f -name '*.c')
override OBJ := $(addprefix build/obj/,$(CFILES:.c=.c.o))
# Compilation rule
build/obj/%.c.o: %.c
mkdir -p "$$(dirname $@)"
$(CC) $(CFLAGS) \
-c $< -o $@
## Image
asagiri.img: asagiri
# Create directory
mkdir -p "$$(dirname $@)"
# Create uboot image from the kernel elf if AARCH64
ifeq ($(ARCH),aarch64)
$(OBJCOPY) -O binary build/bin/yukari build/yukari.bin
SOURCE_DATE_EPOCH=0 ./u-boot/tools/mkimage -A arm64 -C none -O linux -T kernel \
-d build/yukari.bin -a 0x1000000 -e 0x1000000 build/yukari.uimg
SOURCE_DATE_EPOCH=0 ./u-boot/tools/mkimage -A arm64 -C none -T script \
-n "Boot script" -d "arch/aarch64/res/boot.cmd" build/boot.scr
endif
# Create disk drive
qemu-img create build/asagiri.img 4M
mformat -N 7777777 -i build/asagiri.img ::
# Add files to disk drive
ifeq ($(ARCH),aarch64)
faketime "1970-01-01 00:00:00" mcopy -pmi build/asagiri.img build/yukari.uimg ::
faketime "1970-01-01 00:00:00" mcopy -pmi build/asagiri.img build/boot.scr ::
else
faketime "1970-01-01 00:00:00" mmd -i build/asagiri.img ::/EFI
faketime "1970-01-01 00:00:00" mmd -i build/asagiri.img ::/EFI/BOOT
faketime "1970-01-01 00:00:00" mcopy -pmi build/asagiri.img arch/x86_64/res/startup.nsh ::
faketime "1970-01-01 00:00:00" mcopy -pmi build/asagiri.img build/bin/yukari ::
faketime "1970-01-01 00:00:00" mcopy -pmi build/asagiri.img build/bin/BOOTX64.EFI ::/EFI/BOOT/
endif
## Clean
.PHONY: clean
clean:
rm -rf build
if [ -d "u-boot" ]; then (cd u-boot && make clean); fi
.PHONY: distclean
distclean: clean
rm -rf u-boot