2 ###########################################################################################
4 # Generic makefile, used everywhere
5 # ----------------------------------------------------------------------------------
6 # Author : aurelien.morelle@parrot.com
9 ###########################################################################################
11 INTERNAL_LOG_FILE=build.log
14 INTERNAL_SOURCE_EXTENSIONS= .c .S .s .cpp
16 INTERNAL_MKDIR=mkdir -p
19 # (in) GENERIC_COMMAND_PREFIX
20 INTERNAL_CC:=$(GENERIC_COMMAND_PREFIX)gcc
21 INTERNAL_AR:=$(GENERIC_COMMAND_PREFIX)ar
22 INTERNAL_OBJCOPY:=$(GENERIC_COMMAND_PREFIX)objcopy
23 INTERNAL_STRIP:=$(GENERIC_COMMAND_PREFIX)strip
26 # (in) GENERIC_LDFLAGS
27 # (in) GENERIC_ARFLAGS
29 # (in) GENERIC_INCLUDES
31 # (in) GENERIC_ADD_OFILES : for linking with
33 # (in) GENERIC_LIBRARY_SOURCE_DIR
34 # (in) GENERIC_LIBRARY_SOURCE_FILES
35 # (in) GENERIC_LIBRARY_TARGET_DIR : for .o files
36 INTERNAL_LIBRARY_SOURCE_FILES:=$(patsubst %,$(GENERIC_LIBRARY_SOURCE_DIR)/%,$(GENERIC_LIBRARY_SOURCE_FILES))
37 INTERNAL_LIBRARY_TARGET_OFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
38 $(patsubst $(GENERIC_LIBRARY_SOURCE_DIR)/%$(ext),$(GENERIC_LIBRARY_TARGET_DIR)/%.o,$(filter %$(ext),$(INTERNAL_LIBRARY_SOURCE_FILES))))
40 # (in) GENERIC_BINARIES_SOURCE_DIR
41 # (in) GENERIC_BINARIES_COMMON_SOURCE_FILES
42 # (in) GENERIC_BINARIES_SOURCE_ENTRYPOINTS
43 # (in) GENERIC_BINARIES_TARGET_DIR : for .o files
44 INTERNAL_BINARIES_COMMON_SOURCE_FILES:=$(patsubst %,$(GENERIC_BINARIES_SOURCE_DIR)/%,$(GENERIC_BINARIES_COMMON_SOURCE_FILES))
45 INTERNAL_BINARIES_COMMON_TARGET_OFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
46 $(patsubst $(GENERIC_BINARIES_SOURCE_DIR)/%$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%.o,$(filter %$(ext),$(INTERNAL_BINARIES_COMMON_SOURCE_FILES))))
47 INTERNAL_BINARIES_TARGET_OENTRYPOINTS:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
48 $(patsubst %$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%.o,$(filter %$(ext),$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS))))
50 # (in) GENERIC_TARGET_LIBRARY
52 # (in) GENERIC_TARGET_BINARIES_PREFIX : for binaries naming
53 # (in) GENERIC_TARGET_BINARIES_DIR : for binaries places
54 INTERNAL_TARGET_BINARIES:=$(foreach entrypoint,$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS),$(shell basename $(entrypoint) .c))
55 INTERNAL_TARGET_BINARIES:=$(patsubst %.c,%,$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS))
56 INTERNAL_TARGET_BINARIES:=$(patsubst %,$(GENERIC_TARGET_BINARIES_DIR)/$(GENERIC_TARGET_BINARIES_PREFIX)%,$(INTERNAL_TARGET_BINARIES))
60 $(INTERNAL_LIBRARY_TARGET_OFILES) \
61 $(GENERIC_TARGET_LIBRARY) \
62 $(INTERNAL_BINARIES_COMMON_TARGET_OFILES) \
63 $(INTERNAL_BINARIES_TARGET_OENTRYPOINTS) \
64 $(INTERNAL_TARGET_BINARIES)
67 CREATE_TARGET_DIRECTORY=$(INTERNAL_MKDIR) $(@D)
69 all: clean_log $(ALL_TO_BE_DONE)
72 @rm -f $(GENERIC_BINARIES_TARGET_DIR)/$(INTERNAL_LOG_FILE) $(GENERIC_LIBRARY_TARGET_DIR)/$(INTERNAL_LOG_FILE)
75 @(cd $(GENERIC_LIBRARY_SOURCE_DIR) ; $(SDK_SOURCE_DIR)/Build/cvsstatus.sh $(SDK_SOURCE_DIR)/Build ADD)
78 $(RM) $(ALL_TO_BE_DONE) $(_INTERNAL_LIBRARY_DEPFILES) $(_INTERNAL_BINARIES_DEPFILES)
82 $(GENERIC_TARGET_LIBRARY): $(INTERNAL_LIBRARY_TARGET_OFILES)
83 @$(CREATE_TARGET_DIRECTORY)
84 @$(INTERNAL_ECHO) "ar $(GENERIC_ARFLAGS)" $(subst $(GENERIC_LIBRARY_TARGET_DIR)/,,$@ $^)
86 @$(INTERNAL_AR) $(GENERIC_ARFLAGS) $@ $^
89 # Template build rules
90 # first param $(1) : rule type (LIBRARY or BINARIES)
91 # second param $(2) : source extension (.c for example)
92 define BUILD_OFILE_TEMPLATE
93 $$(GENERIC_$(1)_TARGET_DIR)/%$(2).d: $$(GENERIC_$(1)_SOURCE_DIR)/%$(2)
94 @$$(CREATE_TARGET_DIRECTORY)
95 ifeq ($$(QUIET_BUILD),yes)
96 @$$(INTERNAL_ECHO) "dep $$*$(2)"
98 $$(INTERNAL_CC) -M $$(filter-out -Wall,$$(GENERIC_CFLAGS)) -w $$(CFLAGS_$$(subst /,_,$$*)) $$(GENERIC_INCLUDES) $$(GENERIC_$(1)_SOURCE_DIR)/$$*$(2) > $$@
99 ifeq ($(USE_IPHONE),yes)
100 @sed -ie 's,\(.*\.o\)\([ :]*\),\1 $$@\2,g' $$@
102 @sed -i 's,\(.*\.o\)\([ :]*\),\1 $$@\2,g' $$@
104 $$(GENERIC_$(1)_TARGET_DIR)/%.o: $$(GENERIC_$(1)_TARGET_DIR)/%$(2).d
105 @$$(CREATE_TARGET_DIRECTORY)
106 ifeq ($$(QUIET_BUILD),yes)
107 @$$(INTERNAL_ECHO) "cc $$*$(2)"
109 @echo -E $$(INTERNAL_CC) $$(GENERIC_CFLAGS) $$(CFLAGS_$$(subst /,_,$$*)) $$(GENERIC_INCLUDES) -c -o $$@ $$(GENERIC_$(1)_SOURCE_DIR)/$$*$(2) >> $$(GENERIC_$(1)_TARGET_DIR)/$(INTERNAL_LOG_FILE)
110 $$(INTERNAL_CC) $$(GENERIC_CFLAGS) $$(CFLAGS_$$(subst /,_,$$*)) $$(GENERIC_INCLUDES) -c -o $$@ $$(GENERIC_$(1)_SOURCE_DIR)/$$*$(2) 2>&1 >> $$(GENERIC_$(1)_TARGET_DIR)/$(INTERNAL_LOG_FILE)
111 ifeq ("$$(USE_MEMPROT)","yes")
113 ifeq ($$(QUIET_BUILD),yes)
114 @$$(INTERNAL_ECHO) "put_in_domain $$(GENERIC_DOMAIN) $$*.o"
115 @$$(PUT_IN_DOMAIN) $$(GENERIC_DOMAIN) $$@
117 $$(PUT_IN_DOMAIN) $$(GENERIC_DOMAIN) $$@
120 ifeq ($$(QUIET_BUILD),yes)
121 @if [ ! -z $$(DOMAIN_$$(subst /,_,$$*)) ]; then \
122 $$(INTERNAL_ECHO) "put_in_domain $$(DOMAIN_$$(subst /,_,$$*)) $$*.o"; \
123 $$(PUT_IN_DOMAIN) $$(DOMAIN_$$(subst /,_,$$*)) $$@; \
126 @if [ ! -z $$(DOMAIN_$$(subst /,_,$$*)) ]; then \
127 $$(INTERNAL_ECHO) $$(PUT_IN_DOMAIN) $$(DOMAIN_$$(subst /,_,$$*)) $$@; \
128 $$(PUT_IN_DOMAIN) $$(DOMAIN_$$(subst /,_,$$*)) $$@; \
135 # Build rules for each extension
136 $(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),$(eval $(call BUILD_OFILE_TEMPLATE,LIBRARY,$(ext))))
137 $(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),$(eval $(call BUILD_OFILE_TEMPLATE,BINARIES,$(ext))))
139 ifneq ($(MAKECMDGOALS),clean)
140 ifneq ($(MAKECMDGOALS),check)
141 -include $(INTERNAL_LIBRARY_DEPFILES) $(INTERNAL_BINARIES_DEPFILES)