@@ -6,8 +6,10 @@ export BITS = 64 export ROOT = $(PWD) export TMP = $(PWD)/gen +export BUILD = $(shell global/build-id.sh) $(build-host) + ifneq ($(BITS),) export TARGET = $(ARCH).$(OS).$(BITS) else export TARGET = $(ARCH).$(OS) @@ -14,46 +16,52 @@ 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))) +include makerule + +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 +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) + +docs := $(wildcard k*/*.md) +docs-out := $(patsubst %.md,$(OUT)/doc/man/%.4.gz,$(notdir $(docs))) +objects := $(fnobjects) $(rtobjects) + +prefix ?= /usr +d-header = $(prefix)/include +d-lib = $(prefix)/lib +d-share = $(prefix)/share unix-oses = lin fbsd dar and -posix-oses = lin fbsd dar and hai mgw +posix-oses = lin fbsd dar and hai mgw cyg ifeq ($(findstring $(OS),$(unix-oses)),$(OS)) export UNIX = yes export POSIX = yes @@ -67,9 +75,9 @@ endif # include libgcc.a in gcc builds, just in case ifeq ($(CC),gcc) -export COMPLIB = -lgcc + export COMPLIB = -lgcc endif all: $(OUT) defs obj tool lib.static $(OUT)/boot.o lib.shared lib.static: defs obj $(OUT)/libk.a @@ -76,26 +84,27 @@ lib.shared: defs obj $(OUT)/libk.so obj: $(moddirs:%=%.obj) defs: $(moddirs:%=%.def) tool: $(OUT)/boot.o $(OUT)/libk.a $(binmods:%=%.tool) +doc: $(docs-out) clean: rm -rf $(TMP) $(OUT) install: all - install -d $(header-dir)/k -o root -g wheel + install -d $(header-dir)/k $(share-dir)/k -o root -g wheel -m 0755 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 + install $(OUT)/libk.a $(OUT)/libk.so \ + $(lib-dir) -o root -g wheel -m 0644 + install $(OUT)/boot.o $(share-dir)/k/boot.o -o root -g wheel -m 0644 uninstall: $(header-dir)/k $(lib-dir)/k rm -rf $^ -lists = moddirs functions assemblies fnobjects rtobjects binaries binmods POSIX +lists = BUILD moddirs functions assemblies fnobjects rtobjects binaries binmods POSIX docs docs-out dbg: @echo -e lists: $(foreach var, $(lists), "\\n - \\e[1m$(var)\\e[m = $($(var))") -%.obj: %/makefile $(OUT) +%.obj: %/makefile $(OUT)/internal.ident.o $(OUT) cd $* && $(MAKE) obj %.tool: %/makefile $(OUT) cd $* && $(MAKE) tool @@ -103,8 +112,9 @@ %.dbg: %/makefile $(OUT) cd $* && $(MAKE) dbg %.def: %/makefile $(TMP)/typesize.def \ + $(OUT)/k/internal.egroup.h \ $(TMP)/system_calls.h \ $(TMP)/system_calls.s \ $(TMP)/error_table.h \ $(OUT) $(OUT)/k @@ -132,6 +142,16 @@ @# `ar rcs` in case `ar` isn't the GNU version ar rc $@ $^ ranlib $@ +$(OUT)/man/doc: + mkdir -p $@ + +$(OUT)/k/internal.egroup.h: global/modules global/genconds.awk $(OUT)/k + awk -f global/genconds.awk <$< >$@ +$(TMP)/internal.ident.c: global/modules global/genident.awk $(OUT)/k/internal.egroup.h $(TMP) + awk -f global/genident.awk <$< >$@ +$(OUT)/%.o: $(TMP)/%.c $(OUT) + $(CC) $(cflags) -c $< -o $@ + $(OUT) $(OUT)/k $(TMP): mkdir -p $@