export OUT = $(PWD)/out
# TODO: calculate these using $(MAKE_HOST)
export ARCH = x86
export OS = lin
export BITS = 64
export ROOT = $(PWD)
export TMP = $(PWD)/gen
ifneq ($(BITS),)
export TARGET = $(ARCH).$(OS).$(BITS)
else
export TARGET = $(ARCH).$(OS)
endif
export m4 = m4
moddirs = $(wildcard k*)
binaries = $(wildcard k*/*.exe.c)
functions = $(wildcard k*/*.fn.c)
assemblies = $(wildcard k*/*.fn.$(TARGET).s)
binmods = $(sort $(dir $(binaries)))
# i'm sorry
collect = $(strip $(foreach dir,$(moddirs),$(wildcard $(dir)/*.$1)))
transform = $(strip $(foreach dir,$(moddirs),$(patsubst $(dir)/%.$1,$(subst @,$(dir),$2),$(wildcard $(dir)/*.$1))))
m-hdr-macs = $(call collect,h.m)
m-c-src-macs = $(call collect,c.m)
m-s-src-macs = $(call collect,$(TARGET).s.m)
m-c-sources = $(call transform,c.m,$(TMP)/@.%.c)
m-s-sources = $(call transform,$(TARGET).s.m,$(TMP)/@.%.$(TARGET).s)
m-headers = $(call transform,h.m,$(OUT)/k/%.h)
m-c-objects = $(call transform,c.m,$(OUT)/@.%.o)
m-s-objects = $(call transform,$(TARGET).s.m,$(OUT)/@.%.$(TARGET).o)
fnobjects = $(call transform,fn.c,$(OUT)/@.%.fn.o) \
$(call transform,fn.c.m,$(OUT)/@.%.fn.o) \
$(call transform,fn.$(TARGET).s,$(OUT)/@.%.fn.$(TARGET).o) \
$(call transform,fn.$(TARGET).s.m,$(OUT)/@.%.fn.$(TARGET).o)
rtobjects = $(call transform,rt.c,$(OUT)/@.%.rt.o) \
$(call transform,rt.c.m,$(OUT)/@.%.rt.o) \
$(call transform,rt.$(TARGET).s,$(OUT)/@.%.rt.$(TARGET).o) \
$(call transform,rt.$(TARGET).s.m,$(OUT)/@.%.rt.$(TARGET).o)
objects = $(fnobjects) $(rtobjects)
header-dir = /usr/include
lib-dir = /usr/lib
unix-oses = lin fbsd dar and
posix-oses = lin fbsd dar and hai mgw
ifeq ($(findstring $(OS),$(unix-oses)),$(OS))
export UNIX = yes
export POSIX = yes
else
export UNIX = no
ifeq ($(findstring $(OS),$(posix-oses)),$(OS))
export POSIX = yes
else
export POSIX = no
endif
endif
# include libgcc.a in gcc builds, just in case
ifeq ($(CC),gcc)
export COMPLIB = -lgcc
endif
all: $(OUT) defs obj tool lib.static $(OUT)/boot.o lib.shared
lib.static: defs obj $(OUT)/libk.a
lib.shared: defs obj $(OUT)/libk.so
obj: $(moddirs:%=%.obj)
defs: $(moddirs:%=%.def)
tool: $(OUT)/boot.o $(OUT)/libk.a $(binmods:%=%.tool)
clean:
rm -rf $(TMP) $(OUT)
install: all
install -d $(header-dir)/k -o root -g wheel
install $(OUT)/k/* $(header-dir)/k/ -o root -g wheel -m 0644
install -d $(lib-dir)/k -o root -g wheel
install $(OUT)/libk.a $(OUT)/libk.so $(OUT)/boot.o \
$(lib-dir)/k/ -o root -g wheel -m 0644
uninstall: $(header-dir)/k $(lib-dir)/k
rm -rf $^
lists = moddirs functions assemblies fnobjects rtobjects binaries binmods POSIX
dbg:
@echo -e lists: $(foreach var, $(lists), "\\n - \\e[1m$(var)\\e[m = $($(var))")
%.obj: %/makefile $(OUT)
cd $* && $(MAKE) obj
%.tool: %/makefile $(OUT)
cd $* && $(MAKE) tool
%.dbg: %/makefile $(OUT)
cd $* && $(MAKE) dbg
%.def: %/makefile $(TMP)/typesize.def \
$(TMP)/system_calls.h \
$(TMP)/system_calls.s \
$(TMP)/error_table.h \
$(OUT) $(OUT)/k
cd $* && $(MAKE) def
.PRECIOUS: $(TMP)/system_calls.%
$(TMP)/system_calls.%: arch/makefile
$(MAKE) -C arch $@
$(TMP)/error_table.h: arch/makefile
$(MAKE) -C arch $@
$(TMP)/typesize.def: arch/makefile $(TMP)
$(MAKE) -C arch $@
$(OUT)/libk.so: $(fnobjects)
ld -shared $(COMPLIB) -o $@ $^
@# $(CC) -shared -fPIC -nostdlib $(COMPLIB) -o $@ $(OUT)/*.o
$(OUT)/boot.o: $(rtobjects)
ld -r $^ -o $(OUT)/boot.o
$(OUT)/libk.a: $(fnobjects) $(rtobjects)
@# using `ar rc` and ranlib here instead of
@# `ar rcs` in case `ar` isn't the GNU version
ar rc $@ $^
ranlib $@
$(OUT) $(OUT)/k $(TMP):
mkdir -p $@