mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
Switch to waf build system, first attempt
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,3 +4,4 @@ build
|
||||
tags
|
||||
.gdbinit
|
||||
popcorn.log
|
||||
.waf-*
|
||||
|
||||
243
Makefile
243
Makefile
@@ -1,243 +0,0 @@
|
||||
ARCH ?= x86_64
|
||||
|
||||
include src/arch/$(ARCH)/config.mk
|
||||
|
||||
BUILD_D := build
|
||||
KERN_D := src/kernel
|
||||
ARCH_D := src/arch/$(ARCH)
|
||||
VERSION ?= $(shell git describe --dirty --always)
|
||||
GITSHA ?= $(shell git rev-parse --short HEAD)
|
||||
|
||||
KERNEL_FILENAME:= popcorn.elf
|
||||
KERNEL_FONT := assets/fonts/tamsyn8x16r.psf
|
||||
|
||||
MODULES := kutil
|
||||
|
||||
|
||||
EFI_DIR := external/gnu-efi
|
||||
EFI_DATA := $(EFI_DIR)/gnuefi
|
||||
EFI_LDS := $(EFI_DATA)/elf_$(ARCH)_efi.lds
|
||||
EFI_ARCH_DIR := $(EFI_DIR)/$(ARCH)
|
||||
EFI_ARCH_DATA := $(EFI_ARCH_DIR)/gnuefi
|
||||
EFI_CRT_OBJ := $(EFI_ARCH_DATA)/crt0-efi-$(ARCH).o
|
||||
EFI_LIB := $(EFI_ARCH_DIR)/lib/libefi.a
|
||||
EFI_INCLUDES := $(EFI_DIR)/inc
|
||||
|
||||
DEPENDFLAGS := -MMD
|
||||
|
||||
INCLUDES := -I $(ARCH_D)
|
||||
INCLUDES += -I src/modules
|
||||
INCLUDES += -I src/include
|
||||
INCLUDES += -isystem $(EFI_INCLUDES)
|
||||
INCLUDES += -isystem $(EFI_INCLUDES)/$(ARCH)
|
||||
INCLUDES += -isystem $(EFI_INCLUDES)/protocol
|
||||
|
||||
BASEFLAGS := -ggdb -nostdlib
|
||||
BASEFLAGS += -ffreestanding -nodefaultlibs
|
||||
BASEFLAGS += -fno-builtin -fomit-frame-pointer
|
||||
BASEFLAGS += -mno-red-zone -fno-stack-protector
|
||||
|
||||
ifdef CPU
|
||||
BASEFLAGS += -mcpu=$(CPU)
|
||||
endif
|
||||
|
||||
# Removed Flags:: -Wcast-align
|
||||
WARNFLAGS += -Wformat=2 -Winit-self -Wfloat-equal -Winline
|
||||
WARNFLAGS += -Winvalid-pch -Wmissing-format-attribute
|
||||
WARNFLAGS += -Wmissing-include-dirs -Wswitch -Wundef
|
||||
WARNFLAGS += -Wdisabled-optimization -Wpointer-arith
|
||||
|
||||
WARNFLAGS += -Wno-attributes -Wno-sign-compare -Wno-multichar
|
||||
WARNFLAGS += -Wno-div-by-zero -Wno-endif-labels -Wno-pragmas
|
||||
WARNFLAGS += -Wno-format-extra-args -Wno-unused-result
|
||||
WARNFLAGS += -Wno-deprecated-declarations -Wno-unused-function
|
||||
|
||||
ASFLAGS ?=
|
||||
ASFLAGS += -p $(BUILD_D)/versions.s
|
||||
|
||||
CFLAGS := $(INCLUDES) $(DEPENDFLAGS) $(BASEFLAGS) $(WARNFLAGS)
|
||||
CFLAGS += -DGIT_VERSION="\"$(VERSION)\""
|
||||
CFLAGS += -std=c11 -mcmodel=large
|
||||
|
||||
CXXFLAGS := $(INCLUDES) $(DEPENDFLAGS) $(BASEFLAGS) $(WARNFLAGS)
|
||||
CXXFLAGS += -DGIT_VERSION="\"$(VERSION)\""
|
||||
CXXFLAGS += -std=c++14 -mcmodel=large
|
||||
CXXFLAGS += -fno-exceptions -fno-rtti
|
||||
|
||||
BOOT_CFLAGS := $(INCLUDES) $(DEPENDFLAGS) $(BASEFLAGS) $(WARNFLAGS)
|
||||
BOOT_CFLAGS += -std=c11 -I src/boot -fPIC -fshort-wchar
|
||||
BOOT_CFLAGS += -DKERNEL_FILENAME="L\"$(KERNEL_FILENAME)\""
|
||||
BOOT_CFLAGS += -DGIT_VERSION_WIDE="L\"$(VERSION)\""
|
||||
BOOT_CFLAGS += -DGNU_EFI_USE_MS_ABI -DHAVE_USE_MS_ABI
|
||||
BOOT_CFLAGS += -DEFI_DEBUG=0 -DEFI_DEBUG_CLEAR_MEMORY=0
|
||||
#BOOT_CFLAGS += -DEFI_FUNCTION_WRAPPER
|
||||
|
||||
ifdef MAX_HRES
|
||||
BOOT_CFLAGS += -DMAX_HRES=$(MAX_HRES)
|
||||
endif
|
||||
|
||||
LDFLAGS := -L $(BUILD_D) -g
|
||||
LDFLAGS += -nostdlib -znocombreloc -Bsymbolic -nostartfiles
|
||||
|
||||
BOOT_LDFLAGS := $(LDFLAGS) -shared
|
||||
BOOT_LDFLAGS += -L $(EFI_ARCH_DIR)/lib -L $(EFI_ARCH_DIR)/gnuefi
|
||||
|
||||
AS ?= $(CROSS)nasm
|
||||
AR ?= $(CROSS)ar
|
||||
CC ?= $(CROSS)gcc
|
||||
CXX ?= $(CROSS)g++
|
||||
LD ?= $(CROSS)ld
|
||||
OBJC := $(CROSS)objcopy
|
||||
OBJD := $(CROSS)objdump
|
||||
|
||||
INIT_DEP := $(BUILD_D)/.builddir
|
||||
|
||||
BOOT_SRCS := $(wildcard src/boot/*.c)
|
||||
BOBJS += $(patsubst src/boot/%,$(BUILD_D)/boot/%,$(patsubst %,%.o,$(BOOT_SRCS)))
|
||||
|
||||
KERN_SRCS := $(wildcard $(KERN_D)/*.s)
|
||||
KERN_SRCS += $(wildcard $(KERN_D)/*.c)
|
||||
KERN_SRCS += $(wildcard $(KERN_D)/*.cpp)
|
||||
KERN_SRCS += $(wildcard $(ARCH_D)/*.s)
|
||||
KERN_SRCS += $(wildcard $(ARCH_D)/*.c)
|
||||
|
||||
KERN_OBJS := $(patsubst src/%, $(BUILD_D)/%, $(patsubst %,%.o,$(KERN_SRCS)))
|
||||
|
||||
MOD_TARGETS :=
|
||||
|
||||
PARTED ?= /sbin/parted
|
||||
QEMU ?= qemu-system-x86_64
|
||||
GDBPORT ?= 27006
|
||||
CPUS ?= 1
|
||||
OVMF ?= assets/ovmf/x64/OVMF.fd
|
||||
|
||||
QEMUOPTS := -drive if=pflash,format=raw,file=$(BUILD_D)/flash.img
|
||||
QEMUOPTS += -drive if=floppy,format=raw,file=$(BUILD_D)/floppy.img
|
||||
QEMUOPTS += -smp $(CPUS) -m 512
|
||||
QEMUOPTS += -d mmu,guest_errors,int -D popcorn.log
|
||||
QEMUOPTS += -no-reboot
|
||||
QEMUOPTS += -cpu Broadwell
|
||||
QEMUOPTS += $(QEMUEXTRA)
|
||||
|
||||
|
||||
all: $(BUILD_D)/floppy.img
|
||||
init: $(INIT_DEP)
|
||||
|
||||
$(INIT_DEP):
|
||||
mkdir -p $(BUILD_D) $(patsubst %,$(BUILD_D)/d.%,$(MODULES))
|
||||
mkdir -p $(BUILD_D)/boot
|
||||
mkdir -p $(patsubst src/%,$(BUILD_D)/%,$(ARCH_D))
|
||||
mkdir -p $(patsubst src/%,$(BUILD_D)/%,$(KERN_D))
|
||||
touch $(INIT_DEP)
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILD_D)/* $(BUILD_D)/.version $(BUILD_D)/.builddir
|
||||
|
||||
vars:
|
||||
@echo "KERN_SRCS: " $(KERN_SRCS)
|
||||
@echo "KERN_OBJS: " $(KERN_OBJS)
|
||||
|
||||
dist-clean: clean
|
||||
make -C external/gnu-efi clean
|
||||
|
||||
.PHONY: all clean dist-clean init vars
|
||||
|
||||
$(BUILD_D)/.version:
|
||||
echo '$(VERSION)' | cmp -s - $@ || echo '$(VERSION)' > $@
|
||||
|
||||
$(BUILD_D)/versions.s:
|
||||
./scripts/parse_version.py "$(VERSION)" "$(GITSHA)" > $@
|
||||
|
||||
-include x $(patsubst %,src/modules/%/module.mk,$(MODULES))
|
||||
-include x $(shell find $(BUILD_D) -type f -name '*.d')
|
||||
|
||||
$(EFI_LIB):
|
||||
make -C external/gnu-efi all
|
||||
|
||||
$(BUILD_D)/boot.elf: $(BOBJS) $(EFI_LIB)
|
||||
$(LD) $(BOOT_LDFLAGS) -T $(EFI_LDS) -o $@ \
|
||||
$(EFI_CRT_OBJ) $(BOBJS) -lefi -lgnuefi
|
||||
|
||||
$(BUILD_D)/boot.efi: $(BUILD_D)/boot.elf
|
||||
$(OBJC) -j .text -j .sdata -j .data -j .dynamic \
|
||||
-j .dynsym -j .rel -j .rela -j .reloc \
|
||||
--target=efi-app-$(ARCH) $^ $@
|
||||
|
||||
$(BUILD_D)/boot.debug.efi: $(BUILD_D)/boot.elf
|
||||
$(OBJC) -j .text -j .sdata -j .data -j .dynamic \
|
||||
-j .dynsym -j .rel -j .rela -j .reloc \
|
||||
-j .debug_info -j .debug_abbrev -j .debug_loc -j .debug_str \
|
||||
-j .debug_aranges -j .debug_line -j .debug_macinfo \
|
||||
--target=efi-app-$(ARCH) $^ $@
|
||||
|
||||
$(BUILD_D)/boot.dump: $(BUILD_D)/boot.efi
|
||||
$(OBJD) -D -S $< > $@
|
||||
|
||||
$(BUILD_D)/boot/%.s.o: src/boot/%.s $(BUILD_D)/versions.s $(INIT_DEP)
|
||||
$(AS) $(ASFLAGS) -i src/boot/ -o $@ $<
|
||||
|
||||
$(BUILD_D)/boot/%.c.o: src/boot/%.c $(INIT_DEP)
|
||||
$(CC) $(BOOT_CFLAGS) -c -o $@ $<
|
||||
|
||||
$(BUILD_D)/kernel.elf: $(KERN_OBJS) $(MOD_TARGETS) $(ARCH_D)/kernel.ld
|
||||
$(LD) $(LDFLAGS) -u _header -T $(ARCH_D)/kernel.ld -o $@ $(KERN_OBJS) $(patsubst %,-l%,$(MODULES))
|
||||
$(OBJC) --only-keep-debug $@ $@.sym
|
||||
$(OBJD) -D -S $@ > $@.dump
|
||||
|
||||
$(BUILD_D)/%.s.o: src/%.s $(BUILD_D)/versions.s $(INIT_DEP)
|
||||
$(AS) $(ASFLAGS) -i $(ARCH_D)/ -i $(KERN_D)/ -o $@ $<
|
||||
|
||||
$(BUILD_D)/%.c.o: src/%.c $(INIT_DEP)
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
$(BUILD_D)/%.cpp.o: src/%.cpp $(INIT_DEP)
|
||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
$(BUILD_D)/flash.img: $(OVMF)
|
||||
cp $^ $@
|
||||
|
||||
$(BUILD_D)/screenfont.psf: $(KERNEL_FONT)
|
||||
cp $^ $@
|
||||
|
||||
$(BUILD_D)/fs.img: $(BUILD_D)/boot.efi $(BUILD_D)/kernel.elf $(BUILD_D)/screenfont.psf
|
||||
$(eval TEMPFILE := $(shell mktemp --suffix=.img))
|
||||
dd if=/dev/zero of=$@.tmp bs=512 count=93750
|
||||
$(PARTED) $@.tmp -s -a minimal mklabel gpt
|
||||
$(PARTED) $@.tmp -s -a minimal mkpart EFI FAT16 2048s 93716s
|
||||
$(PARTED) $@.tmp -s -a minimal toggle 1 boot
|
||||
dd if=/dev/zero of=$(TEMPFILE) bs=512 count=91669
|
||||
mformat -i $(TEMPFILE) -h 32 -t 32 -n 64 -c 1
|
||||
mmd -i $(TEMPFILE) ::/EFI
|
||||
mmd -i $(TEMPFILE) ::/EFI/BOOT
|
||||
mcopy -i $(TEMPFILE) $(BUILD_D)/boot.efi ::/EFI/BOOT/BOOTX64.efi
|
||||
mcopy -i $(TEMPFILE) $(BUILD_D)/kernel.elf ::$(KERNEL_FILENAME)
|
||||
mcopy -i $(TEMPFILE) $(BUILD_D)/screenfont.psf ::screenfont.psf
|
||||
mlabel -i $(TEMPFILE) ::Popcorn_OS
|
||||
dd if=$(TEMPFILE) of=$@.tmp bs=512 count=91669 seek=2048 conv=notrunc
|
||||
rm $(TEMPFILE)
|
||||
mv $@.tmp $@
|
||||
|
||||
$(BUILD_D)/floppy.img: $(BUILD_D)/boot.efi $(BUILD_D)/kernel.elf $(BUILD_D)/screenfont.psf
|
||||
cp assets/floppy.img $@
|
||||
mcopy -i $@ $(BUILD_D)/boot.efi ::/EFI/BOOT/BOOTX64.efi
|
||||
mcopy -i $@ $(BUILD_D)/kernel.elf ::$(KERNEL_FILENAME)
|
||||
mcopy -i $@ $(BUILD_D)/screenfont.psf ::screenfont.psf
|
||||
|
||||
$(BUILD_D)/fs.iso: $(BUILD_D)/floppy.img
|
||||
mkdir -p $(BUILD_D)/iso
|
||||
cp $< $(BUILD_D)/iso/
|
||||
xorrisofs --efi-boot floppy.img -o $@ $(BUILD_D)/iso
|
||||
|
||||
qemu: $(BUILD_D)/floppy.img $(BUILD_D)/flash.img
|
||||
-rm popcorn.log
|
||||
"$(QEMU)" $(QEMUOPTS) -nographic
|
||||
|
||||
qemu-window: $(BUILD_D)/floppy.img $(BUILD_D)/flash.img
|
||||
-rm popcorn.log
|
||||
"$(QEMU)" $(QEMUOPTS)
|
||||
|
||||
qemu-gdb: $(BUILD_D)/floppy.img $(BUILD_D)/boot.debug.efi $(BUILD_D)/flash.img $(BUILD_D)/kernel.elf
|
||||
-rm popcorn.log
|
||||
"$(QEMU)" $(QEMUOPTS) -s -nographic
|
||||
|
||||
# vim: ft=make ts=4
|
||||
6
make.bat
6
make.bat
@@ -1,6 +0,0 @@
|
||||
@echo off
|
||||
if exist C:\Windows\Sysnative\bash.exe (
|
||||
C:\Windows\Sysnative\bash.exe -c "make %*"
|
||||
) else (
|
||||
C:\Windows\System32\bash.exe -c "make %*"
|
||||
)
|
||||
35
modules.mk
35
modules.mk
@@ -1,35 +0,0 @@
|
||||
ifeq "$(MOD_NAME)" ""
|
||||
include "you must specify a MOD_NAME"
|
||||
endif
|
||||
|
||||
ifndef SOURCES
|
||||
SOURCES := $(wildcard src/modules/$(MOD_NAME)/*.c)
|
||||
SOURCES += $(wildcard src/modules/$(MOD_NAME)/*.cpp)
|
||||
SOURCES += $(wildcard src/modules/$(MOD_NAME)/*.s)
|
||||
endif
|
||||
|
||||
ifeq "$(SOURCES)" ""
|
||||
include "you must specify a SOURCES list"
|
||||
endif
|
||||
|
||||
MOD_SRC_D := src/modules/$(MOD_NAME)
|
||||
MOD_BUILD_D := $(BUILD_D)/d.$(MOD_NAME)
|
||||
MOD_LIBNAME := $(BUILD_D)/lib$(MOD_NAME).a
|
||||
MOD_TARGETS += $(MOD_LIBNAME)
|
||||
|
||||
OBJS_$(MOD_NAME) := $(patsubst %,build/d.%.o,$(patsubst src/modules/%,%,$(SOURCES)))
|
||||
|
||||
$(MOD_LIBNAME): $(OBJS_$(MOD_NAME))
|
||||
$(AR) cr $@ $(OBJS_$(MOD_NAME))
|
||||
|
||||
$(MOD_BUILD_D)/%.c.o: $(MOD_SRC_D)/%.c $(INIT_DEP)
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
$(MOD_BUILD_D)/%.cpp.o: $(MOD_SRC_D)/%.cpp $(INIT_DEP)
|
||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
$(MOD_BUILD_D)/%.s.o: $(MOD_SRC_D)/%.s $(BUILD_D)/versions.s $(INIT_DEP)
|
||||
$(AS) $(ASFLAGS) -i $(MOD_SRC_D)/ -o $@ $<
|
||||
|
||||
DEPS += $(patsubst %.o,%.d,$(OBJS_$(MOD_NAME)))
|
||||
|
||||
3
qemu.bat
3
qemu.bat
@@ -1,3 +0,0 @@
|
||||
call make.bat
|
||||
del popcorn.log
|
||||
qemu-system-x86_64.exe -bios .\assets\ovmf\x64\OVMF.fd -hda .\build\fs.img -m 512 -vga cirrus -d guest_errors,int,mmu -D popcorn.log -no-reboot
|
||||
@@ -1,36 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# parse_version.py - Create a NASM version definition file given
|
||||
# version inputs. Usage:
|
||||
#
|
||||
# parse_version.py <git-describe version> <git short sha>
|
||||
|
||||
|
||||
def split_version(version_string):
|
||||
major, minor, patch_dirty = version_string.split(".")
|
||||
patch_dirty = patch_dirty.split("-")
|
||||
|
||||
return major, minor, patch_dirty[0], len(patch_dirty) > 1
|
||||
|
||||
|
||||
def make_nasm(major, minor, patch, dirty, sha):
|
||||
if dirty:
|
||||
dirty = "1"
|
||||
else:
|
||||
dirty = "0"
|
||||
|
||||
lines = [
|
||||
"%define VERSION_MAJOR {}".format(major),
|
||||
"%define VERSION_MINOR {}".format(minor),
|
||||
"%define VERSION_PATCH {}".format(patch),
|
||||
"%define VERSION_GITSHA 0x{}{}".format(dirty, sha),
|
||||
]
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage: {} <desc version> <git sha>".format(sys.argv[0]), file=sys.stderr)
|
||||
sys.exit(1)
|
||||
print(make_nasm(*split_version(sys.argv[1]), sys.argv[2]))
|
||||
70
src/boot/wscript
Normal file
70
src/boot/wscript
Normal file
@@ -0,0 +1,70 @@
|
||||
|
||||
def configure(ctx):
|
||||
from os.path import join
|
||||
|
||||
efi_dir = join(ctx.env.EXTERNAL, "gnu-efi")
|
||||
ctx.env.EFI_DIR = efi_dir
|
||||
|
||||
efi_inc = join(efi_dir, "inc")
|
||||
efi_arch = join(efi_dir, ctx.env.POPCORN_ARCH)
|
||||
|
||||
crt0_name = 'crt0-efi-{}.o'.format(ctx.env.POPCORN_ARCH)
|
||||
crt0_path = join(efi_arch, "gnuefi", crt0_name)
|
||||
|
||||
lds_name = 'elf_{}_efi.lds'.format(ctx.env.POPCORN_ARCH)
|
||||
lds_path = join(efi_dir, "gnuefi", lds_name)
|
||||
|
||||
ctx.env.append_value('INCLUDES_EFI', [
|
||||
efi_inc,
|
||||
join(efi_inc, "protocol"),
|
||||
join(efi_inc, ctx.env.POPCORN_ARCH),
|
||||
])
|
||||
ctx.env.append_value('DEFINES_EFI', [
|
||||
'KERNEL_FILENAME=L"{}"'.format(ctx.env.KERNEL_FILENAME),
|
||||
'GNU_EFI_USE_MS_ABI',
|
||||
'HAVE_USE_MS_ABI',
|
||||
'EFI_DEBUG=0',
|
||||
'EFI_DEBUG_CLEAR_MEMORY=0',
|
||||
])
|
||||
ctx.env.append_value('CFLAGS_EFI', ['-fPIC', '-fshort-wchar', '-Wa,--no-warn'])
|
||||
ctx.env.append_value('STLIB_EFI', ['efi', 'gnuefi'])
|
||||
ctx.env.append_value('STLIBPATH_EFI', [join(efi_arch, "lib"), join(efi_arch, "gnuefi")])
|
||||
ctx.env.append_value('LINKFLAGS_EFI', [
|
||||
'-shared',
|
||||
'-T', lds_path,
|
||||
crt0_path,
|
||||
])
|
||||
ctx.env.append_value('SECTIONS_EFI', [
|
||||
"-j .text",
|
||||
"-j .sdata",
|
||||
"-j .data",
|
||||
"-j .dynamic",
|
||||
"-j .dynsym",
|
||||
"-j .rel",
|
||||
"-j .rela",
|
||||
"-j .reloc",
|
||||
])
|
||||
|
||||
def build(bld):
|
||||
bld(rule = "make -C ${EFI_DIR}")
|
||||
bld.add_group()
|
||||
|
||||
import os
|
||||
sources = [f for f in os.listdir(str(bld.path))
|
||||
if f.endswith('.c')
|
||||
or f.endswith('.s')]
|
||||
|
||||
bld.program(
|
||||
source = sources,
|
||||
target = "boot.elf",
|
||||
use = 'EFI gnu-ef',
|
||||
)
|
||||
|
||||
bld(
|
||||
rule = "${objcopy} ${SECTIONS_EFI} --target=efi-app-${POPCORN_ARCH} ${SRC} ${TGT}",
|
||||
source = "boot.elf",
|
||||
target = "boot.efi",
|
||||
)
|
||||
|
||||
|
||||
# vim: ft=python et sw=4
|
||||
22
src/kernel/wscript
Normal file
22
src/kernel/wscript
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
def configure(ctx):
|
||||
pass
|
||||
|
||||
def build(bld):
|
||||
from os.path import join
|
||||
|
||||
sources = bld.path.ant_glob("**/*.cpp")
|
||||
sources += bld.path.ant_glob("**/*.s")
|
||||
|
||||
lds = join(bld.env.ARCH_D, 'kernel.ld')
|
||||
|
||||
bld.program(
|
||||
source = sources,
|
||||
name = 'kernel',
|
||||
includes = '.',
|
||||
target = bld.env.KERNEL_FILENAME,
|
||||
use = 'kutil',
|
||||
linkflags = "-T {}".format(lds),
|
||||
)
|
||||
|
||||
# vim: ft=python et
|
||||
@@ -1,2 +0,0 @@
|
||||
MOD_NAME := kutil
|
||||
include modules.mk
|
||||
14
src/modules/kutil/wscript
Normal file
14
src/modules/kutil/wscript
Normal file
@@ -0,0 +1,14 @@
|
||||
|
||||
def configure(ctx):
|
||||
pass
|
||||
|
||||
def build(bld):
|
||||
sources = bld.path.ant_glob("**/*.cpp")
|
||||
|
||||
bld.stlib(
|
||||
source = sources,
|
||||
name = 'kutil',
|
||||
target = 'kutil',
|
||||
)
|
||||
|
||||
# vim: ft=python et
|
||||
170
waf
vendored
Executable file
170
waf
vendored
Executable file
File diff suppressed because one or more lines are too long
224
wscript
Normal file
224
wscript
Normal file
@@ -0,0 +1,224 @@
|
||||
top = '.'
|
||||
out = 'build'
|
||||
|
||||
|
||||
def options(opt):
|
||||
opt.load("nasm gcc g++")
|
||||
|
||||
opt.add_option(
|
||||
'--arch',
|
||||
action='store',
|
||||
default='x86_64',
|
||||
help='Target architecture')
|
||||
|
||||
opt.add_option('--kernel_filename',
|
||||
action='store',
|
||||
default='popcorn.elf',
|
||||
help='Kernel filename on disk')
|
||||
|
||||
opt.add_option('--font',
|
||||
action='store',
|
||||
default='tamsyn8x16r.psf',
|
||||
help='Font for the console')
|
||||
|
||||
|
||||
def configure(ctx):
|
||||
import os
|
||||
import subprocess
|
||||
from os.path import join, exists
|
||||
|
||||
ctx.find_program("ld", var="LINK_CC")
|
||||
ctx.env.LINK_CXX = ctx.env.LINK_CC
|
||||
|
||||
ctx.load("nasm gcc g++")
|
||||
ctx.find_program("objcopy", var="objcopy")
|
||||
ctx.find_program("objdump", var="objdump")
|
||||
ctx.find_program("mcopy", var="mcopy")
|
||||
|
||||
# Override the gcc/g++ tools setting these assuming LD is gcc/g++
|
||||
ctx.env.SHLIB_MARKER = '-Bdynamic'
|
||||
ctx.env.STLIB_MARKER = '-Bstatic'
|
||||
ctx.env.LINKFLAGS_cstlib = ['-Bstatic']
|
||||
|
||||
version = subprocess.check_output("git describe --always", shell=True).strip()
|
||||
git_sha = subprocess.check_output("git rev-parse --short HEAD", shell=True).strip()
|
||||
|
||||
major, minor, patch_dirty = version.split(".")
|
||||
dirty = 'dirty' in patch_dirty
|
||||
patch = patch_dirty.split('-')[0]
|
||||
|
||||
ctx.env.POPCORN_ARCH = ctx.options.arch
|
||||
ctx.env.KERNEL_FILENAME = ctx.options.kernel_filename
|
||||
ctx.env.FONT_NAME = ctx.options.font
|
||||
|
||||
ctx.env.EXTERNAL = join(ctx.path.abspath(), "external")
|
||||
|
||||
baseflags = [
|
||||
'-nostdlib',
|
||||
'-ffreestanding',
|
||||
'-nodefaultlibs',
|
||||
'-fno-builtin',
|
||||
'-fomit-frame-pointer',
|
||||
'-mno-red-zone',
|
||||
]
|
||||
|
||||
warnflags = ['-W{}'.format(opt) for opt in [
|
||||
'format=2',
|
||||
'init-self',
|
||||
'float-equal',
|
||||
'inline',
|
||||
'missing-format-attribute',
|
||||
'missing-include-dirs',
|
||||
'switch',
|
||||
'undef',
|
||||
'disabled-optimization',
|
||||
'pointer-arith',
|
||||
'no-attributes',
|
||||
'no-sign-compare',
|
||||
'no-multichar',
|
||||
'no-div-by-zero',
|
||||
'no-endif-labels',
|
||||
'no-pragmas',
|
||||
'no-format-extra-args',
|
||||
'no-unused-result',
|
||||
'no-deprecated-declarations',
|
||||
'no-unused-function',
|
||||
|
||||
'error'
|
||||
]]
|
||||
|
||||
ctx.env.append_value('DEFINES', [
|
||||
'GIT_VERSION="{}"'.format(version),
|
||||
'GIT_VERSION_WIDE=L"{}"'.format(version),
|
||||
"VERSION_MAJOR={}".format(major),
|
||||
"VERSION_MINOR={}".format(minor),
|
||||
"VERSION_PATCH={}".format(patch),
|
||||
"VERSION_GITSHA=0x{}{}".format({True:1}.get(dirty, 0), git_sha),
|
||||
])
|
||||
|
||||
ctx.env.append_value('CFLAGS', baseflags)
|
||||
ctx.env.append_value('CFLAGS', warnflags)
|
||||
ctx.env.append_value('CFLAGS', ['-ggdb', '-std=c11'])
|
||||
|
||||
ctx.env.append_value('CXXFLAGS', baseflags)
|
||||
ctx.env.append_value('CXXFLAGS', warnflags)
|
||||
ctx.env.append_value('CXXFLAGS', [
|
||||
'-ggdb',
|
||||
'-std=c++14',
|
||||
'-fno-exceptions',
|
||||
'-fno-rtti',
|
||||
])
|
||||
|
||||
ctx.env.append_value('ASFLAGS', ['-felf64'])
|
||||
|
||||
ctx.env.append_value('INCLUDES', [
|
||||
join(ctx.path.abspath(), "src", "include"),
|
||||
join(ctx.path.abspath(), "src", "modules"),
|
||||
])
|
||||
|
||||
ctx.env.append_value('LINKFLAGS', [
|
||||
'-g',
|
||||
'-nostdlib',
|
||||
'-znocombreloc',
|
||||
'-Bsymbolic',
|
||||
'-nostartfiles',
|
||||
])
|
||||
|
||||
ctx.env.ARCH_D = join(str(ctx.path), "src", "arch",
|
||||
ctx.env.POPCORN_ARCH)
|
||||
|
||||
env = ctx.env
|
||||
ctx.setenv('boot', env=env)
|
||||
ctx.recurse(join("src", "boot"))
|
||||
|
||||
ctx.setenv('kernel', env=env)
|
||||
ctx.env.append_value('CFLAGS', ['-mcmodel=large'])
|
||||
ctx.env.append_value('CXXFLAGS', ['-mcmodel=large'])
|
||||
|
||||
mod_root = join("src", "modules")
|
||||
for module in os.listdir(mod_root):
|
||||
mod_path = join(mod_root, module)
|
||||
if exists(join(mod_path, "wscript")):
|
||||
ctx.env.append_value('MODULES', mod_path)
|
||||
ctx.recurse(mod_path)
|
||||
|
||||
ctx.recurse(join("src", "kernel"))
|
||||
|
||||
|
||||
def build(bld):
|
||||
from os.path import join
|
||||
|
||||
bld.env = bld.all_envs['boot']
|
||||
bld.recurse(join("src", "boot"))
|
||||
|
||||
bld.env = bld.all_envs['kernel']
|
||||
for mod_path in bld.env.MODULES:
|
||||
bld.recurse(mod_path)
|
||||
|
||||
bld.recurse(join("src", "kernel"))
|
||||
|
||||
src = bld.path
|
||||
out = bld.root.make_node(bld.out_dir)
|
||||
kernel_name = bld.env.KERNEL_FILENAME
|
||||
|
||||
boot = out.make_node(join("efi", "boot", "bootx64.efi"))
|
||||
kernel = out.make_node(kernel_name)
|
||||
font = out.make_node("screenfont.psf")
|
||||
|
||||
bld(
|
||||
source = out.make_node(join("src", "boot", "boot.efi")),
|
||||
target = boot,
|
||||
rule = "mkdir -p $(dirname ${TGT}) && cp ${SRC} ${TGT}"
|
||||
)
|
||||
|
||||
bld(
|
||||
source = out.make_node(join("src", "kernel", kernel_name)),
|
||||
target = kernel,
|
||||
rule = "mkdir -p $(dirname ${TGT}) && cp ${SRC} ${TGT}"
|
||||
)
|
||||
|
||||
bld(
|
||||
source = src.make_node(join("assets", "fonts", bld.env.FONT_NAME)),
|
||||
target = font,
|
||||
rule = "mkdir -p $(dirname ${TGT}) && cp ${SRC} ${TGT}"
|
||||
)
|
||||
|
||||
bld(
|
||||
source = src.make_node(join("assets", "floppy.img")),
|
||||
target = out.make_node("popcorn.img"),
|
||||
rule = "cp ${SRC} ${TGT}",
|
||||
)
|
||||
|
||||
bld(
|
||||
source = src.make_node(join("assets", "ovmf", "x64", "OVMF.fd")),
|
||||
target = out.make_node("flash.img"),
|
||||
rule = "cp ${SRC} ${TGT}",
|
||||
)
|
||||
|
||||
for node in (boot, kernel, font):
|
||||
bld.add_group()
|
||||
bld(source = node, rule = "${mcopy} -i popcorn.img ${SRC} ::${SRC}")
|
||||
|
||||
|
||||
def qemu(ctx):
|
||||
import subprocess
|
||||
subprocess.call("rm popcorn.log", shell=True)
|
||||
subprocess.call([
|
||||
'qemu-system-x86_64',
|
||||
'-drive', 'if=pflash,format=raw,file={}/flash.img'.format(out),
|
||||
'-drive', 'if=floppy,format=raw,file={}/popcorn.img'.format(out),
|
||||
'-smp', '1',
|
||||
'-m', '512',
|
||||
'-d', 'mmu,int,guest_errors',
|
||||
'-D', 'popcorn.log',
|
||||
'-cpu', 'Broadwell',
|
||||
'-no-reboot',
|
||||
'-nographic',
|
||||
])
|
||||
|
||||
|
||||
def listen(ctx):
|
||||
subprocess.call("nc -l -p 5555", shell=True)
|
||||
|
||||
|
||||
# vim: ft=python et
|
||||
Reference in New Issue
Block a user