Merge branch 'master' of git://cadel.mutabah.net/acess2
[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 BIN-$(DIR):=$(BIN-$(DIR)) $1) $(eval OBJ-$1:=$2)
22
23 # Start of Voodoo code
24 _REL_POS := $(dir $(lastword $(MAKEFILE_LIST)))
25 BASE = $(abspath $(_REL_POS))/
26 SUB_DIRS = $(wildcard $(BASE)*/rules.mk)
27 #$(warning $(SUB_DIRS))
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 $(shell pwd))/
34 #    $(warning $(DEFAULT_RULES))
35 endif
36
37 include $(BASE)Makefile.cfg
38
39 .PHONY: all clean
40
41 all: $(addprefix all-,$(DEFAULT_RULES))
42 clean: $(addprefix clean-,$(DEFAULT_RULES))
43
44 # Sub-directory rules
45 x = x
46 include $(SUB_DIRS)
47
48
49 # Transforms LDFLAGS -l arguments into library binary paths
50 fcn_getlibs = $(foreach f,$(patsubst -l%,lib%.so,$(filter -l%,$(LDFLAGS-$(_DIR-$1)))),$(filter %/$f,$(ALL_BIN)))
51
52 # === Rules ===
53 # - Binds source files to object targets
54 fcn_mkrule = $(eval $1: $(call fcn_obj2src,$1))
55 $(foreach f,$(filter %.cpp$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
56 $(foreach f,$(filter %.cc$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
57 $(foreach f,$(filter %.c$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
58 $(foreach f,$(filter %.S$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
59 $(foreach f,$(filter %.asm$(OBJECT_SUFFIX).o,$(ALL_OBJ)), $(call fcn_mkrule,$f))
60 # - Bind extra dependencies and libraries to objects
61 $(foreach f,$(ALL_BIN), $(eval $f: $(EXTRA_DEP-$(_DIR-$f)) $(call fcn_getlibs,$f)))
62
63 # --- Object Files ---
64 # C++ (.cpp)
65 %.cpp$(OBJECT_SUFFIX).o:
66         $(eval _dir=$(_DIR-$@))
67         $(eval <=$(call fcn_obj2src,$@))
68         @echo [CXX] -o $<
69         @mkdir -p $(dir $@)
70         @$(CCPP) $(CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS-$(_dir)) $(CPPFLAGS-$(_dir))-c $(_src) -o $@
71 # C++ (.cc)
72 %.cc$(OBJECT_SUFFIX).o:
73         $(eval _dir=$(_DIR-$@))
74         $(eval _src=$(call fcn_obj2src,$@))
75         @echo [CXX] -o $<
76         @mkdir -p $(dir $@)
77         @$(CCPP) $(CXXFLAGS) $(CXXFLAGS-$(_dir)) $(CPPFLAGS-$(_dir)) -c $(_src) -o $@
78 # C (.c)
79 %.c$(OBJECT_SUFFIX).o:
80         $(eval _dir=$(_DIR-$@))
81         $(eval _src=$(call fcn_obj2src,$@))
82         @echo [CC] -o $@
83         @mkdir -p $(dir $@)
84         @$(CC) $(CFLAGS) $(CPPFLAGS) $(CFLAGS-$(_dir)) $(CPPFLAGS-$(_dir)) -c $(_src) -o $@
85 # Assembly (.S)
86 %.S$(OBJECT_SUFFIX).o:
87         $(eval _dir=$(_DIR-$@))
88         $(eval _src=$(call fcn_obj2src,$@))
89         @echo [AS] -o $@
90         @mkdir -p $(dir $@)
91         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src)
92         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o [email protected] $(_src) -M
93 # Assembly (.asm)
94 %.asm$(OBJECT_SUFFIX).o:
95         $(eval _dir=$(_DIR-$@))
96         $(eval _src=$(call fcn_obj2src,$@))
97         @echo [AS] -o $@
98         @mkdir -p $(dir $@)
99         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src)
100         @$(AS) $(ASFLAGS) $(ASFLAGS-$(_dir)) -o $@ $(_src) -MT $@ -MD [email protected]
101
102 # --- Binaries ---
103 # Static Library (.a)
104 %.a:
105         $(eval _dir=$(_DIR-$@))
106         @echo [AR] ru $@
107         @mkdir -p $(dir $@)
108         @$(RM) $@
109         @$(AR) ru $@ $(OBJ-$@)
110 # Dynamic Library (.so)
111 %.so:
112         $(eval _dir=$(_DIR-$@))
113         @echo [LD] -shared -o $@
114         @mkdir -p $(dir $@)
115         @$(LD) $(LDFLAGS) -shared -soname $(notdir $@) -o $@ $(OBJ-$@) $(LDFLAGS-$(_dir))
116 # Executable (.bin)
117 %.bin:
118         $(eval _dir=$(_DIR-$@))
119         @echo [LD] -o $@
120         @mkdir -p $(dir $@)
121         @$(LD) $(LDFLAGS) -o $@ $(OBJ-$@) $(LDFLAGS-$(_dir))
122         @$(CP) $@ $(@:%.bin=%)   
123 $(OUTPUTDIR)%:
124         $(eval _dir=$(_DIR-$@))
125         @echo [LD] -o $@
126         @mkdir -p $(dir $@)
127         @$(LD) $(LDFLAGS) -o $@ $(OBJ-$@) $(LDFLAGS-$(_dir))
128
129 -include $(ALL_OBJ:%=%.dep)
130
131 %.asm: %.asm.o
132  

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