toaruos/Makefile

298 lines
9.4 KiB
Makefile
Raw Normal View History

ifeq ($(TOOLCHAIN),)
2018-03-21 11:17:48 +03:00
ifeq ($(shell util/check.sh),y)
export PATH := $(shell util/activate.sh)
else
FOO := $(shell util/prompt.sh)
ifeq ($(shell util/check.sh),y)
export PATH := $(shell util/activate.sh)
else
$(error "No toolchain, and you did not ask to build it.")
endif
endif
endif
2018-04-17 16:18:15 +03:00
# Prevents Make from removing intermediary files on failure
.SECONDARY:
# Disable built-in rules
.SUFFIXES:
2018-04-24 13:39:47 +03:00
TARGET_TRIPLET=i686-pc-toaru
# Userspace flags
CC=$(TARGET_TRIPLET)-gcc
AR=$(TARGET_TRIPLET)-ar
2018-06-25 07:15:09 +03:00
AS=$(TARGET_TRIPLET)-as
2018-06-10 13:06:48 +03:00
CFLAGS= -O3 -g -std=gnu99 -I. -Iapps -pipe -mmmx -msse -msse2 -fplan9-extensions -Wall -Wextra -Wno-unused-parameter
2018-02-25 08:13:54 +03:00
LIBC_OBJS = $(patsubst %.c,%.o,$(wildcard libc/*.c))
LIBC_OBJS += $(patsubst %.c,%.o,$(wildcard libc/*/*.c))
2018-06-25 07:15:09 +03:00
LIBC_OBJS += libc/setjmp.o
LC=base/lib/libc.so
2018-02-25 08:13:54 +03:00
2018-04-17 16:18:15 +03:00
APPS=$(patsubst apps/%.c,%,$(wildcard apps/*.c))
2018-02-25 08:13:54 +03:00
APPS_X=$(foreach app,$(APPS),base/bin/$(app))
APPS_Y=$(foreach app,$(filter-out init,$(APPS)),.make/$(app).mak)
2018-02-25 08:13:54 +03:00
2018-04-17 16:18:15 +03:00
LIBS=$(patsubst lib/%.c,%,$(wildcard lib/*.c))
LIBS_X=$(foreach lib,$(LIBS),base/lib/libtoaru_$(lib).so)
LIBS_Y=$(foreach lib,$(LIBS),.make/$(lib).lmak)
2018-02-25 08:13:54 +03:00
all: image.iso
2018-04-24 13:39:47 +03:00
# Kernel / module flags
KCC = $(TARGET_TRIPLET)-gcc
KAS = $(TARGET_TRIPLET)-as
KLD = $(TARGET_TRIPLET)-ld
KNM = $(TARGET_TRIPLET)-nm
2018-03-16 15:56:19 +03:00
KCFLAGS = -O2 -std=c99
KCFLAGS += -finline-functions -ffreestanding
KCFLAGS += -Wall -Wextra -Wno-unused-function -Wno-unused-parameter -Wno-format
KCFLAGS += -pedantic -fno-omit-frame-pointer
KCFLAGS += -D_KERNEL_
KCFLAGS += -DKERNEL_GIT_TAG=$(shell util/make-version)
KASFLAGS = --32
KERNEL_OBJS = $(patsubst %.c,%.o,$(wildcard kernel/*.c))
KERNEL_OBJS += $(patsubst %.c,%.o,$(wildcard kernel/*/*.c))
KERNEL_OBJS += $(patsubst %.c,%.o,$(wildcard kernel/*/*/*.c))
KERNEL_ASMOBJS = $(filter-out kernel/symbols.o,$(patsubst %.S,%.o,$(wildcard kernel/*.S)))
2018-04-24 13:39:47 +03:00
# Kernel
2018-07-11 03:43:31 +03:00
fatbase/kernel: ${KERNEL_ASMOBJS} ${KERNEL_OBJS} kernel/symbols.o
2018-03-16 15:56:19 +03:00
${KCC} -T kernel/link.ld ${KCFLAGS} -nostdlib -o $@ ${KERNEL_ASMOBJS} ${KERNEL_OBJS} kernel/symbols.o -lgcc
kernel/symbols.o: ${KERNEL_ASMOBJS} ${KERNEL_OBJS} util/generate_symbols.py
-rm -f kernel/symbols.o
${KCC} -T kernel/link.ld ${KCFLAGS} -nostdlib -o .toaruos-kernel ${KERNEL_ASMOBJS} ${KERNEL_OBJS} -lgcc
${KNM} .toaruos-kernel -g | util/generate_symbols.py > kernel/symbols.S
${KAS} ${KASFLAGS} kernel/symbols.S -o $@
-rm -f .toaruos-kernel
kernel/sys/version.o: kernel/*/*.c kernel/*.c
2018-04-24 13:39:47 +03:00
kernel/%.o: kernel/%.S
${KAS} ${ASFLAGS} $< -o $@
kernel/%.o: kernel/%.c ${HEADERS}
${KCC} ${KCFLAGS} -nostdlib -g -c -o $@ $<
# Modules
2018-07-11 03:43:31 +03:00
fatbase/mod:
2018-03-16 15:56:19 +03:00
@mkdir -p $@
2018-07-11 03:43:31 +03:00
MODULES = $(patsubst modules/%.c,fatbase/mod/%.ko,$(wildcard modules/*.c))
2018-03-16 15:56:19 +03:00
2018-03-19 05:38:11 +03:00
HEADERS = $(shell find base/usr/include/kernel -type f -name '*.h')
2018-03-16 15:56:19 +03:00
2018-07-11 03:43:31 +03:00
fatbase/mod/%.ko: modules/%.c ${HEADERS} | fatbase/mod
2018-03-19 05:38:11 +03:00
${KCC} -T modules/link.ld -nostdlib ${KCFLAGS} -c -o $@ $<
2018-03-16 15:56:19 +03:00
modules: ${MODULES}
# Root Filesystem
2018-02-25 08:13:54 +03:00
base/dev:
2018-07-11 03:43:31 +03:00
mkdir -p $@
2018-02-25 08:13:54 +03:00
base/tmp:
2018-07-11 03:43:31 +03:00
mkdir -p $2
2018-02-25 08:13:54 +03:00
base/proc:
2018-07-11 03:43:31 +03:00
mkdir -p $@
2018-02-25 08:13:54 +03:00
base/bin:
2018-07-11 03:43:31 +03:00
mkdir -p $@
2018-02-25 08:13:54 +03:00
base/lib:
2018-07-11 03:43:31 +03:00
mkdir -p $@
fatbase/efi/boot:
mkdir -p $@
.make:
mkdir -p .make
2018-07-11 03:43:31 +03:00
dirs: base/dev base/tmp base/proc base/bin base/lib fatbase/efi/boot .make
2018-02-25 08:13:54 +03:00
2018-03-16 15:56:19 +03:00
# C Library
crts: base/lib/crt0.o base/lib/crti.o base/lib/crtn.o | dirs
base/lib/crt%.o: libc/crt%.s
yasm -f elf -o $@ $<
2018-06-25 07:15:09 +03:00
libc/setjmp.o: libc/setjmp.S
$(AS) -o $@ $<
2018-02-25 08:13:54 +03:00
libc/%.o: libc/%.c
2018-04-25 15:39:55 +03:00
$(CC) $(CFLAGS) -fPIC -c -o $@ $<
2018-02-25 08:13:54 +03:00
base/lib/libc.a: ${LIBC_OBJS} | dirs crts
2018-02-25 08:13:54 +03:00
$(AR) cr $@ $^
base/lib/libc.so: ${LIBC_OBJS} | dirs crts
$(CC) -nodefaultlibs -o $@ $(CFLAGS) -shared -fPIC $^ -lgcc
2018-02-25 08:13:54 +03:00
2018-06-26 14:53:48 +03:00
base/lib/libm.so: util/lm.c | dirs crts
$(CC) -nodefaultlibs -o $@ $(CFLAGS) -shared -fPIC $^ -lgcc
2018-03-16 15:56:19 +03:00
# Userspace Linker/Loader
base/lib/ld.so: linker/linker.c base/lib/libc.a | dirs
2018-04-17 16:18:15 +03:00
$(CC) -static -Wl,-static $(CFLAGS) -o $@ -Os -T linker/link.ld $<
2018-03-16 15:56:19 +03:00
# Shared Libraries
2018-04-17 16:18:15 +03:00
.make/%.lmak: lib/%.c util/auto-dep.py | dirs
util/auto-dep.py --makelib $< > $@
2018-03-16 15:56:19 +03:00
ifeq (,$(findstring clean,$(MAKECMDGOALS)))
2018-04-17 16:18:15 +03:00
-include ${LIBS_Y}
endif
2018-02-25 08:13:54 +03:00
2018-04-24 13:39:47 +03:00
# Init (static)
2018-03-16 15:56:19 +03:00
base/bin/init: apps/init.c base/lib/libc.a | dirs
2018-04-17 16:18:15 +03:00
$(CC) -static -Wl,-static $(CFLAGS) -o $@ $<
2018-02-25 08:13:54 +03:00
2018-07-11 03:43:31 +03:00
fatbase/netinit: util/netinit.c base/lib/libc.a | dirs
2018-06-30 07:48:29 +03:00
$(CC) -s -static -Wl,-static $(CFLAGS) -o $@ $<
2018-04-24 13:39:47 +03:00
# Userspace applications
2018-03-16 15:56:19 +03:00
.make/%.mak: apps/%.c util/auto-dep.py | dirs
util/auto-dep.py --make $< > $@
2018-02-25 08:13:54 +03:00
ifeq (,$(findstring clean,$(MAKECMDGOALS)))
-include ${APPS_Y}
endif
2018-02-25 08:13:54 +03:00
2018-03-16 15:56:19 +03:00
# Ramdisk
2018-07-11 03:43:31 +03:00
fatbase/ramdisk.img: ${APPS_X} ${LIBS_X} base/lib/ld.so base/lib/libm.so $(shell find base) Makefile | dirs
genext2fs -B 4096 -d base -D util/devtable -U -b `util/calc-size.sh` -N 2048 $@
2018-03-15 04:19:18 +03:00
2018-03-16 15:56:19 +03:00
# CD image
2018-07-06 06:30:28 +03:00
ifeq (,$(wildcard /usr/lib32/crt0-efi-ia32.o))
$(error Missing GNU-EFI.)
2018-07-06 06:30:28 +03:00
endif
2018-07-11 03:43:31 +03:00
EFI_XORRISO=-eltorito-alt-boot -e fat.img -no-emul-boot -isohybrid-gpt-basdat
EFI_BOOT=cdrom/fat.img
EFI_UPDATE=python util/update-extents.py
2018-07-06 06:30:28 +03:00
2018-07-11 04:55:49 +03:00
image.iso: ${EFI_BOOT} cdrom/boot.sys fatbase/netinit ${MODULES} util/update-extents.py
2018-07-11 03:43:31 +03:00
xorriso -as mkisofs -R -J -c bootcat \
-b boot.sys -no-emul-boot -boot-load-size 24 \
2018-07-06 06:30:28 +03:00
${EFI_XORRISO} \
2018-07-06 03:17:20 +03:00
-o image.iso cdrom
2018-07-11 03:43:31 +03:00
${EFI_UPDATE}
2018-03-15 04:19:18 +03:00
2018-03-16 15:56:19 +03:00
# Boot loader
cdrom/fat.img: fatbase/ramdisk.img ${MODULES} fatbase/kernel fatbase/netinit fatbase/efi/boot/bootia32.efi fatbase/efi/boot/bootx64.efi util/mkdisk.sh
2018-07-11 03:43:31 +03:00
util/mkdisk.sh $@ fatbase
EFI_CFLAGS=-fno-stack-protector -fpic -DEFI_PLATFORM -ffreestanding -fshort-wchar -I /usr/include/efi -mno-red-zone
EFI_SECTIONS=-j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .reloc
2018-07-06 17:53:14 +03:00
boot/efi.so: boot/cstuff.c boot/*.h
$(CC) ${EFI_CFLAGS} -I /usr/include/efi/ia32 -c -o boot/efi.o $<
$(LD) boot/efi.o /usr/lib32/crt0-efi-ia32.o -nostdlib -znocombreloc -T /usr/lib32/elf_ia32_efi.lds -shared -Bsymbolic -L /usr/lib32 -lefi -lgnuefi -o boot/efi.so
2018-07-11 03:43:31 +03:00
fatbase/efi/boot/bootia32.efi: boot/efi.so
objcopy ${EFI_SECTIONS} --target=efi-app-ia32 $< $@
boot/efi64.so: boot/cstuff.c boot/*.h
gcc ${EFI_CFLAGS} -I /usr/include/efi/x86_64 -DEFI_FUNCTION_WRAPPER -c -o boot/efi64.o $<
$(LD) boot/efi64.o /usr/lib/crt0-efi-x86_64.o -nostdlib -znocombreloc -T /usr/lib/elf_x86_64_efi.lds -shared -Bsymbolic -L /usr/lib -lefi -lgnuefi -o boot/efi64.so
fatbase/efi/boot/bootx64.efi: boot/efi64.so
objcopy ${EFI_SECTIONS} --target=efi-app-x86_64 $< $@
2018-07-06 03:17:20 +03:00
2018-07-11 03:43:31 +03:00
cdrom/boot.sys: boot/boot.o boot/cstuff.o boot/link.ld | dirs
2018-03-15 04:19:18 +03:00
${KLD} -T boot/link.ld -o $@ boot/boot.o boot/cstuff.o
2018-06-09 13:19:21 +03:00
boot/cstuff.o: boot/cstuff.c boot/*.h
2018-03-15 04:19:18 +03:00
${KCC} -c -Os -o $@ $<
2018-02-25 08:13:54 +03:00
2018-03-15 04:19:18 +03:00
boot/boot.o: boot/boot.s
yasm -f elf -o $@ $<
2018-02-25 08:13:54 +03:00
2018-02-25 11:43:31 +03:00
.PHONY: clean
clean:
rm -f base/lib/*.so
rm -f base/lib/libc.a
2018-03-01 06:55:28 +03:00
rm -f ${APPS_X}
rm -f libc/*.o libc/*/*.o
2018-02-25 11:43:31 +03:00
rm -f image.iso
2018-07-11 03:43:31 +03:00
rm -f fatbase/ramdisk.img
rm -f cdrom/boot.sys
2018-03-15 04:33:02 +03:00
rm -f boot/*.o
2018-07-06 10:37:22 +03:00
rm -f boot/*.efi
rm -f boot/*.so
rm -f cdrom/fat.img cdrom/kernel cdrom/mod/* cdrom/ramdisk.img
rm -f fatbase/kernel fatbase/efi/boot/bootia32.efi fatbase/efi/boot/bootx64.efi
2018-07-11 03:43:31 +03:00
rm -f cdrom/netinit fatbase/netinit
rm -f ${KERNEL_OBJS} ${KERNEL_ASMOBJS} kernel/symbols.o kernel/symbols.S
rm -f base/lib/crt*.o
2018-03-16 15:56:19 +03:00
rm -f ${MODULES}
2018-04-17 16:18:15 +03:00
rm -f ${APPS_Y} ${LIBS_Y}
2018-03-16 15:56:19 +03:00
2018-07-06 04:40:49 +03:00
QEMU_ARGS=-serial mon:stdio -m 1G -soundhw ac97,pcspk -enable-kvm
.PHONY: run
run: image.iso
2018-07-06 04:40:49 +03:00
qemu-system-i386 -cdrom $< ${QEMU_ARGS}
.PHONY: fast
fast: image.iso
qemu-system-i386 -cdrom $< ${QEMU_ARGS} \
2018-07-07 04:56:14 +03:00
-fw_cfg name=opt/org.toaruos.bootmode,string=normal
2018-07-06 04:40:49 +03:00
.PHONY: headless
headless: image.iso
2018-07-06 06:30:28 +03:00
@echo "=== Launching qemu headless."
@echo "=== To quit qemu, use 'Ctrl-a c' to access monitor"
@echo "=== and type 'quit' to exit."
2018-07-06 04:40:49 +03:00
qemu-system-i386 -cdrom $< ${QEMU_ARGS} \
-nographic \
2018-07-07 04:56:14 +03:00
-fw_cfg name=opt/org.toaruos.bootmode,string=headless
.PHONY: efi64
efi64: image.iso
qemu-system-x86_64 -cdrom $< ${QEMU_ARGS} \
-bios /usr/share/qemu/OVMF.fd
VMNAME=ToaruOS-NIH CD
.PHONY: virtualbox
virtualbox: image.iso
-VBoxManage unregistervm "$(VMNAME)" --delete
VBoxManage createvm --name "$(VMNAME)" --ostype "Other" --register
VBoxManage modifyvm "$(VMNAME)" --memory 1024 --vram 32 --audio pulse --audiocontroller ac97 --bioslogodisplaytime 1 --bioslogofadeout off --bioslogofadein off --biosbootmenu disabled
VBoxManage storagectl "$(VMNAME)" --add ide --name "IDE"
VBoxManage storageattach "$(VMNAME)" --storagectl "IDE" --port 0 --device 0 --medium $(shell pwd)/image.iso --type dvddrive
2018-05-04 06:29:17 +03:00
VBoxManage setextradata "$(VMNAME)" GUI/DefaultCloseAction PowerOff
VBoxManage startvm "$(VMNAME)" --type separate
.PHONY: virtualbox-efi
virtualbox-efi: image.iso
-VBoxManage unregistervm "$(VMNAME)" --delete
VBoxManage createvm --name "$(VMNAME)" --ostype "Other" --register
VBoxManage modifyvm "$(VMNAME)" --memory 1024 --vram 32 --audio pulse --audiocontroller ac97 --bioslogodisplaytime 1 --bioslogofadeout off --bioslogofadein off --biosbootmenu disabled --firmware efi
VBoxManage storagectl "$(VMNAME)" --add ide --name "IDE"
VBoxManage storageattach "$(VMNAME)" --storagectl "IDE" --port 0 --device 0 --medium $(shell pwd)/image.iso --type dvddrive
VBoxManage setextradata "$(VMNAME)" GUI/DefaultCloseAction PowerOff
VBoxManage startvm "$(VMNAME)" --type separate
.PHONY: virtualbox-efi64
virtualbox-efi64: image.iso
-VBoxManage unregistervm "$(VMNAME)" --delete
VBoxManage createvm --name "$(VMNAME)" --ostype "Other_64" --register
VBoxManage modifyvm "$(VMNAME)" --memory 1024 --vram 32 --audio pulse --audiocontroller ac97 --bioslogodisplaytime 1 --bioslogofadeout off --bioslogofadein off --biosbootmenu disabled --firmware efi
VBoxManage storagectl "$(VMNAME)" --add ide --name "IDE"
VBoxManage storageattach "$(VMNAME)" --storagectl "IDE" --port 0 --device 0 --medium $(shell pwd)/image.iso --type dvddrive
VBoxManage setextradata "$(VMNAME)" GUI/DefaultCloseAction PowerOff
VBoxManage startvm "$(VMNAME)" --type separate