2 ###########################################################################################
4 # Generic makefile, used everywhere
5 # ----------------------------------------------------------------------------------
6 # Author : aurelien.morelle@parrot.com
9 ###########################################################################################
11 INTERNAL_LOG_FILE=build.log
13 ifdef PARROTOS_MAKEFILE
14 TWEAKED_PARROTOS_MAKEFILE=$(GENERIC_LIBRARY_TARGET_DIR)/tweaked_parrotos.mak
15 include $(TWEAKED_PARROTOS_MAKEFILE)
16 GENERIC_LIBRARY_SOURCE_FILES=$(filter-out mDNSPosix/Responder.c,$(CFILES:P5_FFT.c=P5_FFT.s) $(SFILES) $(PSFILES))
17 GENERIC_INCLUDES+=$(patsubst %,-I$(GENERIC_LIBRARY_SOURCE_DIR)/%,$(MODULES))
20 ifeq ($(QUIET_BUILD),yes)
22 SILENT=2>&1 > /dev/null
26 NDS_CPU_TYPE=$(shell echo $(NDS_CPU) | tr "A-Z" "a-z" | sed -e "s@[0-9][0-9]*@@")
27 NDS_CPU_NUM=$(shell echo $(NDS_CPU) | sed -e "s@[a-zA-Z][a-zA-Z]*@@")
28 INTERNAL_NDSTOOL:=$(Q)ndstool
29 INTERNAL_DSBUILD:=$(Q)dsbuild
32 INTERNAL_SOURCE_EXTENSIONS= .c .S .s .cpp
34 INTERNAL_MKDIR=mkdir -p
37 # (in) GENERIC_COMMAND_PREFIX
38 INTERNAL_CC:=$(GENERIC_COMMAND_PREFIX)gcc
39 INTERNAL_AR:=$(GENERIC_COMMAND_PREFIX)ar
40 INTERNAL_OBJCOPY:=$(GENERIC_COMMAND_PREFIX)objcopy
41 INTERNAL_STRIP:=$(GENERIC_COMMAND_PREFIX)strip
44 # (in) GENERIC_LDFLAGS
45 # (in) GENERIC_ARFLAGS
47 # (in) GENERIC_INCLUDES
49 # (in) GENERIC_ADD_OFILES : for linking with
51 # (in) GENERIC_LIBRARY_SOURCE_DIR
52 # (in) GENERIC_LIBRARY_SOURCE_FILES
53 # (in) GENERIC_LIBRARY_TARGET_DIR : for .o files
54 INTERNAL_LIBRARY_SOURCE_FILES:=$(patsubst %,$(GENERIC_LIBRARY_SOURCE_DIR)/%,$(GENERIC_LIBRARY_SOURCE_FILES))
55 INTERNAL_LIBRARY_TARGET_OFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
56 $(patsubst $(GENERIC_LIBRARY_SOURCE_DIR)/%$(ext),$(GENERIC_LIBRARY_TARGET_DIR)/%.o,$(filter %$(ext),$(INTERNAL_LIBRARY_SOURCE_FILES))))
58 # (in) GENERIC_BINARIES_SOURCE_DIR
59 # (in) GENERIC_BINARIES_COMMON_SOURCE_FILES
60 # (in) GENERIC_BINARIES_SOURCE_ENTRYPOINTS
61 # (in) GENERIC_BINARIES_TARGET_DIR : for .o files
62 INTERNAL_BINARIES_COMMON_SOURCE_FILES:=$(patsubst %,$(GENERIC_BINARIES_SOURCE_DIR)/%,$(GENERIC_BINARIES_COMMON_SOURCE_FILES))
63 INTERNAL_BINARIES_COMMON_TARGET_OFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
64 $(patsubst $(GENERIC_BINARIES_SOURCE_DIR)/%$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%.o,$(filter %$(ext),$(INTERNAL_BINARIES_COMMON_SOURCE_FILES))))
65 INTERNAL_BINARIES_TARGET_OENTRYPOINTS:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
66 $(patsubst %$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%.o,$(filter %$(ext),$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS))))
68 # (in) GENERIC_TARGET_LIBRARY
70 # (in) GENERIC_TARGET_BINARIES_PREFIX : for binaries naming
71 # (in) GENERIC_TARGET_BINARIES_DIR : for binaries places
72 INTERNAL_TARGET_BINARIES:=$(foreach entrypoint,$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS),$(shell basename $(entrypoint) .c))
73 INTERNAL_TARGET_BINARIES:=$(patsubst %.c,%,$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS))
74 INTERNAL_TARGET_BINARIES:=$(patsubst %,$(GENERIC_TARGET_BINARIES_DIR)/$(GENERIC_TARGET_BINARIES_PREFIX)%,$(INTERNAL_TARGET_BINARIES))
76 _INTERNAL_LIBRARY_DEPFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
77 $(patsubst $(GENERIC_LIBRARY_SOURCE_DIR)/%$(ext),$(GENERIC_LIBRARY_TARGET_DIR)/%$(ext).d,$(filter %$(ext),$(INTERNAL_LIBRARY_SOURCE_FILES))))
78 _INTERNAL_BINARIES_DEPFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
79 $(patsubst $(GENERIC_BINARIES_SOURCE_DIR)/%$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%$(ext).d,$(filter %$(ext),$(INTERNAL_BINARIES_COMMON_SOURCE_FILES))))
80 _INTERNAL_BINARIES_DEPFILES+=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
81 $(patsubst %$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%$(ext).d,$(filter %$(ext),$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS))))
83 ifneq ($(MAKECMDGOALS),clean)
84 INTERNAL_LIBRARY_DEPFILES:=$(_INTERNAL_LIBRARY_DEPFILES)
85 INTERNAL_BINARIES_DEPFILES:=$(_INTERNAL_BINARIES_DEPFILES)
89 $(INTERNAL_LIBRARY_DEPFILES) \
90 $(INTERNAL_BINARIES_DEPFILES) \
91 $(INTERNAL_LIBRARY_TARGET_OFILES) \
92 $(GENERIC_TARGET_LIBRARY) \
93 $(INTERNAL_BINARIES_COMMON_TARGET_OFILES) \
94 $(INTERNAL_BINARIES_TARGET_OENTRYPOINTS) \
95 $(INTERNAL_TARGET_BINARIES)
97 ifeq ($(GENERIC_TARGET_LIBRARY),)
99 ALL_TO_BE_DONE+=$(GENERIC_TARGET_BINARIES_DIR)/$(GENERIC_TARGET_BINARIES_PREFIX)$(DLL_ID).dll
103 CREATE_TARGET_DIRECTORY=$(INTERNAL_MKDIR) $(@D)
105 all: clean_log $(ALL_TO_BE_DONE)
108 @rm -f $(GENERIC_BINARIES_TARGET_DIR)/$(INTERNAL_LOG_FILE) $(GENERIC_LIBRARY_TARGET_DIR)/$(INTERNAL_LOG_FILE)
111 @(cd $(GENERIC_LIBRARY_SOURCE_DIR) ; $(SDK_SOURCE_DIR)/Build/cvsstatus.sh $(SDK_SOURCE_DIR)/Build ADD)
114 $(RM) $(ALL_TO_BE_DONE) $(_INTERNAL_LIBRARY_DEPFILES) $(_INTERNAL_BINARIES_DEPFILES)
118 $(TWEAKED_PARROTOS_MAKEFILE): $(PARROTOS_MAKEFILE)
119 @$(CREATE_TARGET_DIRECTORY)
120 @echo "all:" >> $(TWEAKED_PARROTOS_MAKEFILE)
121 @cat $(PARROTOS_MAKEFILE) | grep -v "^[-]*include" | grep -v "^all:" | sed -e "s@^\([A-Z]*[=]*\)\([ \t]*\)\(/\)@\1\2@" | sed -e "s@^clean:@NOCLEAN:@" >> $(TWEAKED_PARROTOS_MAKEFILE)
123 ifneq ("$(INTERNAL_LIBRARY_TARGET_OFILES)","")
124 $(GENERIC_TARGET_LIBRARY): $(INTERNAL_LIBRARY_TARGET_OFILES)
125 @$(CREATE_TARGET_DIRECTORY)
126 @$(INTERNAL_ECHO) "ar $(GENERIC_ARFLAGS)" $(subst $(GENERIC_LIBRARY_TARGET_DIR)/,,$@ $^)
128 @$(INTERNAL_AR) $(GENERIC_ARFLAGS) $@ $^
131 ifeq ($(USE_DLL),yes)
132 $(GENERIC_TARGET_BINARIES_DIR)/$(GENERIC_TARGET_BINARIES_PREFIX)$(DLL_ID).dll: $(INTERNAL_BINARIES_COMMON_TARGET_OFILES) $(GENERIC_ADD_OFILES) $(GENERIC_BINARIES_LIBS_DEPS)
134 $(GENERIC_TARGET_BINARIES_DIR)/$(GENERIC_TARGET_BINARIES_PREFIX)%: $(GENERIC_BINARIES_TARGET_DIR)/%.o $(INTERNAL_BINARIES_COMMON_TARGET_OFILES) $(GENERIC_ADD_OFILES) $(GENERIC_BINARIES_LIBS_DEPS)
136 @$(CREATE_TARGET_DIRECTORY)
137 ifeq ($(QUIET_BUILD),yes)
138 ifeq ($(USE_NDS),yes)
139 @$(INTERNAL_ECHO) "dsbuild $(GENERIC_TARGET_BINARIES_PREFIX)$*.nds"
141 ifeq ($(USE_DLL),yes)
142 @$(INTERNAL_ECHO) "ld $(GENERIC_TARGET_BINARIES_PREFIX)$(DLL_ID).dll"
144 @$(INTERNAL_ECHO) "ld $(GENERIC_TARGET_BINARIES_PREFIX)$*"
148 ifeq ($(USE_DLL),yes)
149 $(GENERIC_COMMAND_PREFIX)dlltool -e $(GENERIC_TARGET_BINARIES_DIR)/$(DLL_ID)_exports.o --export-all-symbols -l $(@:.dll=.lib) $(INTERNAL_BINARIES_COMMON_TARGET_OFILES)
150 $(INTERNAL_CC) --shared -o $@ $(INTERNAL_BINARIES_COMMON_TARGET_OFILES) $(GENERIC_TARGET_BINARIES_DIR)/$(DLL_ID)_exports.o $(GENERIC_ADD_OFILES) $(GENERIC_LIB_PATHS) $(GENERIC_LIBS) $(GENERIC_LDFLAGS) $(LDFLAGS_$(subst /,_,$*))
151 $(RM) $(GENERIC_TARGET_BINARIES_DIR)/$(DLL_ID)_exports.o
153 $(INTERNAL_CC) -o $@ $(GENERIC_BINARIES_TARGET_DIR)/$*.o $(INTERNAL_BINARIES_COMMON_TARGET_OFILES) $(GENERIC_ADD_OFILES) $(GENERIC_LIB_PATHS) $(GENERIC_LIBS) $(GENERIC_LDFLAGS) $(LDFLAGS_$(subst /,_,$*))
155 ifeq ($(RELEASE_BUILD),yes)
156 cp $@ $(shell dirname $@)/sym_$(shell basename $@)
159 ifeq ($(USE_NDS),yes)
160 $(INTERNAL_OBJCOPY) -O binary $@ $@.$(NDS_CPU_TYPE)$(NDS_CPU_NUM)
161 $(INTERNAL_NDSTOOL) -c $@.nds -$(NDS_CPU_NUM) $@.$(NDS_CPU_TYPE)$(NDS_CPU_NUM) $(SILENT)
162 $(INTERNAL_DSBUILD) $@.nds $(SILENT)
165 # Template build rules
166 # first param $(1) : rule type (LIBRARY or BINARIES)
167 # second param $(2) : source extension (.c for example)
168 define BUILD_OFILE_TEMPLATE
169 $$(GENERIC_$(1)_TARGET_DIR)/%$(2).d: $$(GENERIC_$(1)_SOURCE_DIR)/%$(2)
170 @$$(CREATE_TARGET_DIRECTORY)
171 ifeq ($$(QUIET_BUILD),yes)
172 @$$(INTERNAL_ECHO) "dep $$*$(2)"
174 $$(INTERNAL_CC) -M $$(filter-out -Wall,$$(GENERIC_CFLAGS)) -w $$(CFLAGS_$$(subst /,_,$$*)) $$(GENERIC_INCLUDES) $$(GENERIC_$(1)_SOURCE_DIR)/$$*$(2) > $$@
175 ifeq ($(USE_IPHONE),yes)
176 @sed -ie 's,\(.*\.o\)\([ :]*\),\1 $$@\2,g' $$@
178 @sed -i 's,\(.*\.o\)\([ :]*\),\1 $$@\2,g' $$@
180 $$(GENERIC_$(1)_TARGET_DIR)/%.o: $$(GENERIC_$(1)_TARGET_DIR)/%$(2).d
181 @$$(CREATE_TARGET_DIRECTORY)
182 ifeq ($$(QUIET_BUILD),yes)
183 @$$(INTERNAL_ECHO) "cc $$*$(2)"
185 @echo -E $$(INTERNAL_CC) $$(GENERIC_CFLAGS) $$(CFLAGS_$$(subst /,_,$$*)) $$(GENERIC_INCLUDES) -c -o $$@ $$(GENERIC_$(1)_SOURCE_DIR)/$$*$(2) >> $$(GENERIC_$(1)_TARGET_DIR)/$(INTERNAL_LOG_FILE)
186 $$(INTERNAL_CC) $$(GENERIC_CFLAGS) $$(CFLAGS_$$(subst /,_,$$*)) $$(GENERIC_INCLUDES) -c -o $$@ $$(GENERIC_$(1)_SOURCE_DIR)/$$*$(2) 2>&1 >> $$(GENERIC_$(1)_TARGET_DIR)/$(INTERNAL_LOG_FILE)
187 ifeq ("$$(USE_MEMPROT)","yes")
189 ifeq ($$(QUIET_BUILD),yes)
190 @$$(INTERNAL_ECHO) "put_in_domain $$(GENERIC_DOMAIN) $$*.o"
191 @$$(PUT_IN_DOMAIN) $$(GENERIC_DOMAIN) $$@
193 $$(PUT_IN_DOMAIN) $$(GENERIC_DOMAIN) $$@
196 ifeq ($$(QUIET_BUILD),yes)
197 @if [ ! -z $$(DOMAIN_$$(subst /,_,$$*)) ]; then \
198 $$(INTERNAL_ECHO) "put_in_domain $$(DOMAIN_$$(subst /,_,$$*)) $$*.o"; \
199 $$(PUT_IN_DOMAIN) $$(DOMAIN_$$(subst /,_,$$*)) $$@; \
202 @if [ ! -z $$(DOMAIN_$$(subst /,_,$$*)) ]; then \
203 $$(INTERNAL_ECHO) $$(PUT_IN_DOMAIN) $$(DOMAIN_$$(subst /,_,$$*)) $$@; \
204 $$(PUT_IN_DOMAIN) $$(DOMAIN_$$(subst /,_,$$*)) $$@; \
211 # Build rules for each extension
212 $(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),$(eval $(call BUILD_OFILE_TEMPLATE,LIBRARY,$(ext))))
213 $(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),$(eval $(call BUILD_OFILE_TEMPLATE,BINARIES,$(ext))))
215 ifneq ($(MAKECMDGOALS),clean)
216 ifneq ($(MAKECMDGOALS),check)
217 -include $(INTERNAL_LIBRARY_DEPFILES) $(INTERNAL_BINARIES_DEPFILES)