libk  legacy.makefile at tip

File legacy/legacy.makefile from the latest check-in

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

export BUILD = $(shell global/ $(build-host)

ifneq ($(BITS),)
    export TARGET = $(ARCH).$(OS).$(BITS)
    export TARGET = $(ARCH).$(OS)

export m4 = m4

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)

docs := $(wildcard k*/*.md)
docs-out := $(patsubst,$(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 cyg

ifeq ($(findstring $(OS),$(unix-oses)),$(OS))
    export UNIX = yes
    export POSIX = yes
    export UNIX = no
    ifeq ($(findstring $(OS),$(posix-oses)),$(OS))
        export POSIX = yes
        export POSIX = no

# include libgcc.a in gcc builds, just in case
ifeq ($(CC),gcc)
    export COMPLIB = -lgcc

all: $(OUT) defs obj tool lib.static $(OUT)/boot.o lib.shared
lib.static: defs obj $(OUT)/libk.a
lib.shared: defs obj $(OUT)/
obj: $(moddirs:%=%.obj) 
defs: $(moddirs:%=%.def) 
tool: $(OUT)/boot.o $(OUT)/libk.a $(binmods:%=%.tool) 
doc: $(docs-out)
	rm -rf $(TMP) $(OUT)

install: all
	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 $(OUT)/libk.a $(OUT)/ \
		$(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 = BUILD moddirs functions assemblies fnobjects rtobjects binaries binmods POSIX docs docs-out
	@echo -e lists: $(foreach var, $(lists), "\\n - \\e[1m$(var)\\e[m = $($(var))")

%.obj: %/makefile $(OUT)/internal.ident.o $(OUT)
	cd $* && $(MAKE) obj

%.tool: %/makefile $(OUT)
	cd $* && $(MAKE) tool

%.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
	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)/ $(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 $@

	mkdir -p $@

$(OUT)/k/internal.egroup.h: global/modules global/gen-conds.awk $(OUT)/k
	awk -f global/gen-conds.awk <$< >$@
$(TMP)/internal.ident.c: global/modules global/gen-ident.awk $(OUT)/k/internal.egroup.h $(TMP)
	awk -f global/gen-ident.awk <$< >$@
$(OUT)/%.o: $(TMP)/%.c $(OUT)
	$(CC) $(cflags) -c $< -o $@

$(OUT) $(OUT)/k $(TMP):
	mkdir -p $@