Usermode - More work on new build system
[tpg/acess2.git] / Usermode / rules.mk
1 #
2 # Acess2 Global Makefile
3 #
4
5 # Config Options
6 SOURCE_DIR = 
7 OBJECT_DIR = obj-$(ARCH)
8 OBJECT_SUFFIX =
9
10 # Functions used later
11 fcn_src2obj_int = \
12         $(patsubst %,%$(OBJECT_SUFFIX).o,$(filter %.c,$1)) \
13         $(patsubst %,%$(OBJECT_SUFFIX).o,$(filter %.cpp,$1)) \
14         $(patsubst %,%$(OBJECT_SUFFIX).o,$(filter %.cc,$1)) \
15         $(patsubst %,%$(OBJECT_SUFFIX).o,$(filter %.S,$1)) \
16         $(patsubst %,%$(OBJECT_SUFFIX).o,$(filter %.asm,$1))
17 fcn_mkobj = $(addprefix $(DIR)$(OBJECT_DIR)/,$(patsubst $(SOURCE_DIR)%,%,$1))
18 fcn_src2obj = $(call fcn_mkobj, $(call fcn_src2obj_int,$1))
19
20 # Start of Voodoo code
21 SUB_DIRS = $(wildcard */rules.mk)
22
23 _REL_POS := $(dir $(lastword $(MAKEFILE_LIST)))
24 BASE = $(abspath $(_REL_POS))/
25 ifeq ($(_REL_POS),./)
26     # Root makefile
27     DEFAULT_RULES := $(dir $(SUB_DIRS))
28 else
29     # Build part of the tree
30     DEFAULT_RULES := $(abspath $(pwd)/$(_REL_POS))
31 endif
32
33 include $(BASE)Makefile.cfg
34
35 .PHONY: all clean
36
37 all: $(BASE)obj_rules.mk $(addprefix all-,$(DEFAULT_RULES))
38 clean: $(addprefix clean-,$(DEFAULT_RULES))
39
40 # Sub-directory rules
41 x = x
42 include $(SUB_DIRS)
43
44
45 # === Rules ===
46 fcn_obj2src = $(subst $(OBJECT_DIR)/,$(SOURCE_DIR)/,$(patsubst %$(OBJECT_SUFFIX).o,%,$1))
47 # ACESS SPECIFIC
48 fcn_getlibs = $(patsubst -l%,$(OUTPUTDIR)/Libs/lib%.so,$(filter -l%,$(LDFLAGS-$(_DIR-$1))))
49
50 fcn_mkrule = $(eval $f: $(call fcn_getlibs,$f) $(call fcn_obj2src,$f))
51 ifeq (,)
52 $(foreach file,$(filter %.cpp$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
53 $(foreach file,$(filter %.cc$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
54 $(foreach file,$(filter %.c$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
55 $(foreach file,$(filter %.S$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
56 $(foreach file,$(filter %.asm$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
57 else
58 .PHONY: $(BASE)obj_rules.mk
59 $(BASE)obj_rules.mk:
60         @echo "$(foreach f,$(filter %.cpp$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" > $@
61         @echo "$(foreach f,$(filter %.cc$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@
62         @echo "$(foreach f,$(filter %.c$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@
63         @echo "$(foreach f,$(filter %.S$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@
64         @echo "$(foreach f,$(filter %.asm$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@
65 include $(BASE)obj_rules.mk
66 endif
67
68 # --- Object Files ---
69 # C++ (.cpp)
70 %.cpp$(OBJECT_SUFFIX).o:
71         $(eval _dir=$(_DIR-$@))
72         $(eval <=$(call fcn_obj2src,$@))
73         @echo [CXX] -o $<
74         @mkdir -p $(dir $@)
75         @$(CCPP) $(CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS-$(_dir)) $(CPPFLAGS-$(_dir))-c $(_src) -o $@
76 # C++ (.cc)
77 %.cc$(OBJECT_SUFFIX).o:
78         $(eval _dir=$(_DIR-$@))
79         $(eval _src=$(call fcn_obj2src,$@))
80         @echo [CXX] -o $<
81         @mkdir -p $(dir $@)
82         @$(CCPP) $(CXXFLAGS) $(CXXFLAGS-$(_dir)) $(CPPFLAGS-$(_dir)) -c $(_src) -o $@
83 # C (.c)
84 %.c$(OBJECT_SUFFIX).o:
85         $(eval _dir=$(_DIR-$@))
86         $(eval _src=$(call fcn_obj2src,$@))
87         @echo [CC] -o $@
88         @mkdir -p $(dir $@)
89         @$(CC) $(CFLAGS) $(CPPFLAGS) $(CFLAGS-$(_dir)) $(CPPFLAGS-$(_dir)) -c $(_src) -o $@
90 # Assembly (.S)
91 %.S$(OBJECT_SUFFIX).o:
92         $(eval _dir=$(_DIR-$@))
93         $(eval _src=$(call fcn_obj2src,$@))
94         @echo [AS] -o $@
95         @mkdir -p $(dir $@)
96         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src)
97         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o [email protected] $(_src) -M
98 # Assembly (.asm)
99 %.asm$(OBJECT_SUFFIX).o:
100         $(eval _dir=$(_DIR-$@))
101         $(eval _src=$(call fcn_obj2src,$@))
102         @echo [AS] -o $@
103         @mkdir -p $(dir $@)
104         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src)
105         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src) -MD [email protected]
106
107 # --- Binaries ---
108 # Static Library (.a)
109 %.a:
110         $(eval _dir=$(_DIR-$@))
111         @echo [AR] ru $@
112         @$(RM) $@
113         @$(AR) ru $@ $(OBJ-$(_dir))
114 # Dynamic Library (.so)
115 %.so:
116         $(eval _dir=$(_DIR-$@))
117         @echo [LD] -shared -o $@
118         @$(LD) $(LDFLAGS) -shared -soname $(basename $@) -o $@ $(filter %.o,$^) $(LDFLAGS-$(_dir))
119 # Executable (.bin)
120 %.bin:
121         $(eval _dir=$(_DIR-$@))
122         @echo [LD] -o $@
123         @$(LD) $(LDFLAGS) -o $@ $(OBJ-$(_dir)) $(LDFLAGS-$(_dir))
124         @$(CP) $@ $(@:%.bin=%)   
125 $(OUTPUTDIR)%:
126         $(eval _dir=$(_DIR-$@))
127         @echo [LD] -o $@
128         @$(LD) $(LDFLAGS) -o $@ $(OBJ-$(_dir)) $(LDFLAGS-$(_dir))
129     

UCC git Repository :: git.ucc.asn.au