X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2Frules.mk;h=123954afcc6164ff3dd6e7d05f7376ea13e3599e;hb=47296e890b2b09cbc46db30d7fe2aeeae11a6d4a;hp=2d576df9217e3ed8f393ede9a9ebb43295a4e8be;hpb=9d8564e56bcd8707d48a331a7f8f4e5eba0c70e5;p=tpg%2Facess2.git diff --git a/Usermode/rules.mk b/Usermode/rules.mk index 2d576df9..123954af 100644 --- a/Usermode/rules.mk +++ b/Usermode/rules.mk @@ -4,7 +4,7 @@ # Config Options SOURCE_DIR = -OBJECT_DIR = obj-$(ARCH) +OBJECT_DIR = obj-$(ARCH)/ OBJECT_SUFFIX = # Functions used later @@ -14,27 +14,31 @@ fcn_src2obj_int = \ $(patsubst %,%$(OBJECT_SUFFIX).o,$(filter %.cc,$1)) \ $(patsubst %,%$(OBJECT_SUFFIX).o,$(filter %.S,$1)) \ $(patsubst %,%$(OBJECT_SUFFIX).o,$(filter %.asm,$1)) -fcn_mkobj = $(addprefix $(DIR)$(OBJECT_DIR)/,$(patsubst $(SOURCE_DIR)%,%,$1)) +fcn_mkobj = $(addprefix $(DIR)$(OBJECT_DIR),$(patsubst $(SOURCE_DIR)%,%,$1)) fcn_src2obj = $(call fcn_mkobj, $(call fcn_src2obj_int,$1)) +fcn_obj2src = $(subst $(OBJECT_DIR),$(SOURCE_DIR),$(patsubst %$(OBJECT_SUFFIX).o,%,$1)) -# Start of Voodoo code -SUB_DIRS = $(wildcard */rules.mk) +fcn_addbin = $(eval ALL_OBJ:=$(ALL_OBJ) $2) $(eval ALL_BIN:=$(ALL_BIN) $1) $(foreach f,$2 $1,$(eval _DIR-$f := $(DIR))) $(eval $1: $2) $(eval BIN-$(DIR):=$(BIN-$(DIR)) $1) $(eval OBJ-$1:=$2) +# Start of Voodoo code _REL_POS := $(dir $(lastword $(MAKEFILE_LIST))) BASE = $(abspath $(_REL_POS))/ +SUB_DIRS = $(wildcard $(BASE)*/rules.mk) +#$(warning $(SUB_DIRS)) ifeq ($(_REL_POS),./) # Root makefile DEFAULT_RULES := $(dir $(SUB_DIRS)) else # Build part of the tree - DEFAULT_RULES := $(abspath $(pwd)/$(_REL_POS)) + DEFAULT_RULES := $(abspath $(shell pwd))/ +# $(warning $(DEFAULT_RULES)) endif include $(BASE)Makefile.cfg .PHONY: all clean -all: $(BASE)obj_rules.mk $(addprefix all-,$(DEFAULT_RULES)) +all: $(addprefix all-,$(DEFAULT_RULES)) clean: $(addprefix clean-,$(DEFAULT_RULES)) # Sub-directory rules @@ -42,28 +46,19 @@ x = x include $(SUB_DIRS) -# === Rules === -fcn_obj2src = $(subst $(OBJECT_DIR)/,$(SOURCE_DIR)/,$(patsubst %$(OBJECT_SUFFIX).o,%,$1)) -# ACESS SPECIFIC -fcn_getlibs = $(patsubst -l%,$(OUTPUTDIR)/Libs/lib%.so,$(filter -l%,$(LDFLAGS-$(_DIR-$1)))) +# Transforms LDFLAGS -l arguments into library binary paths +fcn_getlibs = $(foreach f,$(patsubst -l%,lib%.so,$(filter -l%,$(LDFLAGS-$(_DIR-$1)))),$(filter %/$f,$(ALL_BIN))) -fcn_mkrule = $(eval $f: $(call fcn_getlibs,$f) $(call fcn_obj2src,$f)) -ifeq (,) -$(foreach file,$(filter %.cpp$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) -$(foreach file,$(filter %.cc$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) -$(foreach file,$(filter %.c$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) -$(foreach file,$(filter %.S$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) -$(foreach file,$(filter %.asm$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) -else -.PHONY: $(BASE)obj_rules.mk -$(BASE)obj_rules.mk: - @echo "$(foreach f,$(filter %.cpp$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" > $@ - @echo "$(foreach f,$(filter %.cc$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@ - @echo "$(foreach f,$(filter %.c$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@ - @echo "$(foreach f,$(filter %.S$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@ - @echo "$(foreach f,$(filter %.asm$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@ -include $(BASE)obj_rules.mk -endif +# === Rules === +# - Binds source files to object targets +fcn_mkrule = $(eval $1: $(call fcn_obj2src,$1)) +$(foreach f,$(filter %.cpp$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) +$(foreach f,$(filter %.cc$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) +$(foreach f,$(filter %.c$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) +$(foreach f,$(filter %.S$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) +$(foreach f,$(filter %.asm$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f)) +# - Bind extra dependencies and libraries to objects +$(foreach f,$(ALL_BIN), $(eval $f: $(EXTRA_DEP-$(_DIR-$f)) $(call fcn_getlibs,$f))) # --- Object Files --- # C++ (.cpp) @@ -102,28 +97,36 @@ endif @echo [AS] -o $@ @mkdir -p $(dir $@) @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src) - @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src) -MD $@.dep + @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src) -MT $@ -MD $@.dep # --- Binaries --- # Static Library (.a) %.a: $(eval _dir=$(_DIR-$@)) @echo [AR] ru $@ + @mkdir -p $(dir $@) @$(RM) $@ - @$(AR) ru $@ $(OBJ-$(_dir)) + @$(AR) ru $@ $(OBJ-$@) # Dynamic Library (.so) %.so: $(eval _dir=$(_DIR-$@)) @echo [LD] -shared -o $@ - @$(LD) $(LDFLAGS) -shared -soname $(basename $@) -o $@ $(filter %.o,$^) $(LDFLAGS-$(_dir)) + @mkdir -p $(dir $@) + @$(LD) $(LDFLAGS) -shared -soname $(notdir $@) -o $@ $(OBJ-$@) $(LDFLAGS-$(_dir)) # Executable (.bin) %.bin: $(eval _dir=$(_DIR-$@)) @echo [LD] -o $@ - @$(LD) $(LDFLAGS) -o $@ $(OBJ-$(_dir)) $(LDFLAGS-$(_dir)) + @mkdir -p $(dir $@) + @$(LD) $(LDFLAGS) -o $@ $(OBJ-$@) $(LDFLAGS-$(_dir)) @$(CP) $@ $(@:%.bin=%) $(OUTPUTDIR)%: $(eval _dir=$(_DIR-$@)) @echo [LD] -o $@ - @$(LD) $(LDFLAGS) -o $@ $(OBJ-$(_dir)) $(LDFLAGS-$(_dir)) - + @mkdir -p $(dir $@) + @$(LD) $(LDFLAGS) -o $@ $(OBJ-$@) $(LDFLAGS-$(_dir)) + +-include $(ALL_OBJ:%=%.dep) + +%.asm: %.asm.o +