b31b60da025cfa9d949a35a65acb35935ead7b23
[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 $(_REL_POS)../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
48 ifeq (x,)
49 $(foreach file,$(filter %.cpp$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(eval $f: $(call fcn_obj2src,$f)))
50 $(foreach file,$(filter %.cc$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(eval $f: $(call fcn_obj2src,$f)))
51 $(foreach file,$(filter %.c$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(eval $f: $(call fcn_obj2src,$f)))
52 $(foreach file,$(filter %.S$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(eval $f: $(call fcn_obj2src,$f))))
53 $(foreach file,$(filter %.asm$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(eval $f: $(call fcn_obj2src,$f)))
54 else
55 .PHONY: $(BASE)obj_rules.mk
56 $(BASE)obj_rules.mk:
57         @echo "$(foreach f,$(filter %.cpp$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" > $@
58         @echo "$(foreach f,$(filter %.cc$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@
59         @echo "$(foreach f,$(filter %.c$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@
60         @echo "$(foreach f,$(filter %.S$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@
61         @echo "$(foreach f,$(filter %.asm$(OBJECT_SUFFIX).o,$(ALL_OBJ)),$f: $(call fcn_obj2src,$f)\n)" >> $@
62 include $(BASE)obj_rules.mk
63 endif
64
65 # --- Object Files ---
66 # C++ (.cpp)
67 %.cpp$(OBJECT_SUFFIX).o:
68         $(eval _dir=$(dir $(subst $(OBJECT_DIR)/,,$*)))
69         $(eval <=$(call fcn_obj2src,$@))
70         @echo [CXX] -o $<
71         @mkdir -p $(dir $@)
72         @$(CCPP) $(CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS-$(_dir)) $(CPPFLAGS-$(_dir))-c $(_src) -o $@
73 # C++ (.cc)
74 %.cc$(OBJECT_SUFFIX).o:
75         $(eval _dir=$(dir $(subst $(OBJECT_DIR)/,,$*)))
76         $(eval _src=$(call fcn_obj2src,$@))
77         @echo [CXX] -o $<
78         @mkdir -p $(dir $@)
79         @$(CCPP) $(CXXFLAGS) $(CXXFLAGS-$(_dir)) $(CPPFLAGS-$(_dir)) -c $(_src) -o $@
80 # C (.c)
81 %.c$(OBJECT_SUFFIX).o:
82         $(eval _dir=$(dir $(subst $(OBJECT_DIR)/,,$*)))
83         $(eval _src=$(call fcn_obj2src,$@))
84         @echo [CC] -o $@
85         @mkdir -p $(dir $@)
86         @$(CC) $(CFLAGS) $(CPPFLAGS) $(CFLAGS-$(_dir)) $(CPPFLAGS-$(_dir)) -c $(_src) -o $@
87 # Assembly (.S)
88 %.S$(OBJECT_SUFFIX).o:
89         $(eval _dir=$(dir $(subst $(OBJECT_DIR)/,,$*)))
90         $(eval _src=$(call fcn_obj2src,$@))
91         @echo [AS] -o $@
92         @mkdir -p $(dir $@)
93         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src)
94         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o [email protected] $(_src) -M
95 # Assembly (.asm)
96 %.asm$(OBJECT_SUFFIX).o:
97         $(eval _dir=$(dir $(subst $(OBJECT_DIR)/,,$*)))
98         $(eval _src=$(call fcn_obj2src,$@))
99         @echo [AS] -o $@
100         @mkdir -p $(dir $@)
101         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src)
102         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src) -MD [email protected]
103
104 # --- Binaries ---
105 # Static Library (.a)
106 %.a:
107         $(eval _dir=$(subst $(OBJECT_DIR),,$(dir $<)))
108         @echo [AR] ru $@
109         @$(RM) $@
110         @$(AR) ru $@ $(OBJ-$(_dir))
111 # Dynamic Library (.so)
112 %.so:
113         $(eval _dir=$(subst $(OBJECT_DIR),,$(dir $<)))
114         @echo [LD] -shared -o $@
115         @$(LD) $(LDFLAGS) -shared -soname $(basename $@) -o $@ $(filter %.o,$^) $(LDFLAGS-$(_dir))
116 # Executable (.bin)
117 %.bin:
118         $(eval _dir=$(subst $(OBJECT_DIR),,$(dir $<)))
119         @echo [LD] -o $@
120         @$(ld) $(LDFLAGS) -o $@ $(OBJ-$(_dir)) $(LDFLAGS-$(_dir))
121         @$(CP) $@ $(@:%.bin=%)
122     

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