Fixing 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 fcn_obj2src = $(subst $(OBJECT_DIR),$(SOURCE_DIR),$(patsubst %$(OBJECT_SUFFIX).o,%,$1))
20
21 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 OBJ-$(DIR):=$(OBJ-$(DIR)) $2) $(eval BIN-$(DIR):=$(BIN-$(DIR)) $1)
22
23 # Start of Voodoo code
24 SUB_DIRS = $(wildcard */rules.mk)
25
26 _REL_POS := $(dir $(lastword $(MAKEFILE_LIST)))
27 BASE = $(abspath $(_REL_POS))/
28 ifeq ($(_REL_POS),./)
29     # Root makefile
30     DEFAULT_RULES := $(dir $(SUB_DIRS))
31 else
32     # Build part of the tree
33     DEFAULT_RULES := $(abspath $(pwd)/$(_REL_POS))
34 endif
35
36 include $(BASE)Makefile.cfg
37
38 .PHONY: all clean
39
40 all: $(addprefix all-,$(DEFAULT_RULES))
41 clean: $(addprefix clean-,$(DEFAULT_RULES))
42
43 # Sub-directory rules
44 x = x
45 include $(SUB_DIRS)
46
47
48 # === Rules ===
49 # ACESS SPECIFIC
50 fcn_getlibs = $(patsubst -l%,$(OUTPUTDIR)Libs/lib%.so,$(filter -l%,$(LDFLAGS-$(_DIR-$1))))
51
52 fcn_mkrule = $(eval $1: $(call fcn_obj2src,$1))
53 $(foreach f,$(filter %.cpp$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
54 $(foreach f,$(filter %.cc$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
55 $(foreach f,$(filter %.c$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
56 $(foreach f,$(filter %.S$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
57 $(foreach f,$(filter %.asm$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
58 $(foreach f,$(ALL_BIN), $(eval $f: $(EXTRA_DEP-$(_DIR-$f)) $(call fcn_getlibs,$f)))
59
60 # --- Object Files ---
61 # C++ (.cpp)
62 %.cpp$(OBJECT_SUFFIX).o:
63         $(eval _dir=$(_DIR-$@))
64         $(eval <=$(call fcn_obj2src,$@))
65         @echo [CXX] -o $<
66         @mkdir -p $(dir $@)
67         @$(CCPP) $(CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS-$(_dir)) $(CPPFLAGS-$(_dir))-c $(_src) -o $@
68 # C++ (.cc)
69 %.cc$(OBJECT_SUFFIX).o:
70         $(eval _dir=$(_DIR-$@))
71         $(eval _src=$(call fcn_obj2src,$@))
72         @echo [CXX] -o $<
73         @mkdir -p $(dir $@)
74         @$(CCPP) $(CXXFLAGS) $(CXXFLAGS-$(_dir)) $(CPPFLAGS-$(_dir)) -c $(_src) -o $@
75 # C (.c)
76 %.c$(OBJECT_SUFFIX).o:
77         $(eval _dir=$(_DIR-$@))
78         $(eval _src=$(call fcn_obj2src,$@))
79         @echo [CC] -o $@
80         @mkdir -p $(dir $@)
81         @$(CC) $(CFLAGS) $(CPPFLAGS) $(CFLAGS-$(_dir)) $(CPPFLAGS-$(_dir)) -c $(_src) -o $@
82 # Assembly (.S)
83 %.S$(OBJECT_SUFFIX).o:
84         $(eval _dir=$(_DIR-$@))
85         $(eval _src=$(call fcn_obj2src,$@))
86         @echo [AS] -o $@
87         @mkdir -p $(dir $@)
88         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src)
89         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o [email protected] $(_src) -M
90 # Assembly (.asm)
91 %.asm$(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 $@ $(_src) -MT $@ -MD [email protected]
98
99 # --- Binaries ---
100 # Static Library (.a)
101 %.a:
102         $(eval _dir=$(_DIR-$@))
103         @echo [AR] ru $@
104         @$(RM) $@
105         @$(AR) ru $@ $(OBJ-$(_dir))
106 # Dynamic Library (.so)
107 %.so:
108         $(eval _dir=$(_DIR-$@))
109         @echo [LD] -shared -o $@
110         @$(LD) $(LDFLAGS) -shared -soname $(basename $@) -o $@ $(filter %.o,$^) $(LDFLAGS-$(_dir))
111 # Executable (.bin)
112 %.bin:
113         $(eval _dir=$(_DIR-$@))
114         @echo [LD] -o $@
115         @$(LD) $(LDFLAGS) -o $@ $(OBJ-$(_dir)) $(LDFLAGS-$(_dir))
116         @$(CP) $@ $(@:%.bin=%)   
117 $(OUTPUTDIR)%:
118         $(eval _dir=$(_DIR-$@))
119         @echo [LD] -o $@
120         @$(LD) $(LDFLAGS) -o $@ $(OBJ-$(_dir)) $(LDFLAGS-$(_dir))
121
122 -include $(ALL_OBJ:%=%.dep)
123
124 %.asm: %.asm.o
125  

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