########################################################################################### # # Generic makefile, used everywhere # ---------------------------------------------------------------------------------- # Author : aurelien.morelle@parrot.com # Date : 2007/05/16 # ########################################################################################### INTERNAL_LOG_FILE=build.log INTERNAL_SOURCE_EXTENSIONS= .c .S .s .cpp INTERNAL_MKDIR=mkdir -p INTERNAL_ECHO=echo # (in) GENERIC_COMMAND_PREFIX INTERNAL_CC:=$(GENERIC_COMMAND_PREFIX)gcc INTERNAL_AR:=$(GENERIC_COMMAND_PREFIX)ar INTERNAL_OBJCOPY:=$(GENERIC_COMMAND_PREFIX)objcopy INTERNAL_STRIP:=$(GENERIC_COMMAND_PREFIX)strip # (in) GENERIC_CFLAGS # (in) GENERIC_LDFLAGS # (in) GENERIC_ARFLAGS # (in) GENERIC_INCLUDES # (in) GENERIC_ADD_OFILES : for linking with # (in) GENERIC_LIBRARY_SOURCE_DIR # (in) GENERIC_LIBRARY_SOURCE_FILES # (in) GENERIC_LIBRARY_TARGET_DIR : for .o files INTERNAL_LIBRARY_SOURCE_FILES:=$(patsubst %,$(GENERIC_LIBRARY_SOURCE_DIR)/%,$(GENERIC_LIBRARY_SOURCE_FILES)) INTERNAL_LIBRARY_TARGET_OFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\ $(patsubst $(GENERIC_LIBRARY_SOURCE_DIR)/%$(ext),$(GENERIC_LIBRARY_TARGET_DIR)/%.o,$(filter %$(ext),$(INTERNAL_LIBRARY_SOURCE_FILES)))) # (in) GENERIC_BINARIES_SOURCE_DIR # (in) GENERIC_BINARIES_COMMON_SOURCE_FILES # (in) GENERIC_BINARIES_SOURCE_ENTRYPOINTS # (in) GENERIC_BINARIES_TARGET_DIR : for .o files INTERNAL_BINARIES_COMMON_SOURCE_FILES:=$(patsubst %,$(GENERIC_BINARIES_SOURCE_DIR)/%,$(GENERIC_BINARIES_COMMON_SOURCE_FILES)) INTERNAL_BINARIES_COMMON_TARGET_OFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\ $(patsubst $(GENERIC_BINARIES_SOURCE_DIR)/%$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%.o,$(filter %$(ext),$(INTERNAL_BINARIES_COMMON_SOURCE_FILES)))) INTERNAL_BINARIES_TARGET_OENTRYPOINTS:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\ $(patsubst %$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%.o,$(filter %$(ext),$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS)))) # (in) GENERIC_TARGET_LIBRARY # (in) GENERIC_TARGET_BINARIES_PREFIX : for binaries naming # (in) GENERIC_TARGET_BINARIES_DIR : for binaries places INTERNAL_TARGET_BINARIES:=$(foreach entrypoint,$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS),$(shell basename $(entrypoint) .c)) INTERNAL_TARGET_BINARIES:=$(patsubst %.c,%,$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS)) INTERNAL_TARGET_BINARIES:=$(patsubst %,$(GENERIC_TARGET_BINARIES_DIR)/$(GENERIC_TARGET_BINARIES_PREFIX)%,$(INTERNAL_TARGET_BINARIES)) ALL_TO_BE_DONE= \ $(INTERNAL_LIBRARY_TARGET_OFILES) \ $(GENERIC_TARGET_LIBRARY) \ $(INTERNAL_BINARIES_COMMON_TARGET_OFILES) \ $(INTERNAL_BINARIES_TARGET_OENTRYPOINTS) \ $(INTERNAL_TARGET_BINARIES) CREATE_TARGET_DIRECTORY=$(INTERNAL_MKDIR) $(@D) all: clean_log $(ALL_TO_BE_DONE) clean_log: @rm -f $(GENERIC_BINARIES_TARGET_DIR)/$(INTERNAL_LOG_FILE) $(GENERIC_LIBRARY_TARGET_DIR)/$(INTERNAL_LOG_FILE) check: @(cd $(GENERIC_LIBRARY_SOURCE_DIR) ; $(SDK_SOURCE_DIR)/Build/cvsstatus.sh $(SDK_SOURCE_DIR)/Build ADD) clean: $(RM) $(ALL_TO_BE_DONE) $(_INTERNAL_LIBRARY_DEPFILES) $(_INTERNAL_BINARIES_DEPFILES) update: $(GENERIC_TARGET_LIBRARY): $(INTERNAL_LIBRARY_TARGET_OFILES) @$(CREATE_TARGET_DIRECTORY) @$(INTERNAL_ECHO) "ar $(GENERIC_ARFLAGS)" $(subst $(GENERIC_LIBRARY_TARGET_DIR)/,,$@ $^) @rm -f $@ @$(INTERNAL_AR) $(GENERIC_ARFLAGS) $@ $^ endif # Template build rules # first param $(1) : rule type (LIBRARY or BINARIES) # second param $(2) : source extension (.c for example) define BUILD_OFILE_TEMPLATE $$(GENERIC_$(1)_TARGET_DIR)/%$(2).d: $$(GENERIC_$(1)_SOURCE_DIR)/%$(2) @$$(CREATE_TARGET_DIRECTORY) ifeq ($$(QUIET_BUILD),yes) @$$(INTERNAL_ECHO) "dep $$*$(2)" endif $$(INTERNAL_CC) -M $$(filter-out -Wall,$$(GENERIC_CFLAGS)) -w $$(CFLAGS_$$(subst /,_,$$*)) $$(GENERIC_INCLUDES) $$(GENERIC_$(1)_SOURCE_DIR)/$$*$(2) > $$@ ifeq ($(USE_IPHONE),yes) @sed -ie 's,\(.*\.o\)\([ :]*\),\1 $$@\2,g' $$@ else @sed -i 's,\(.*\.o\)\([ :]*\),\1 $$@\2,g' $$@ endif $$(GENERIC_$(1)_TARGET_DIR)/%.o: $$(GENERIC_$(1)_TARGET_DIR)/%$(2).d @$$(CREATE_TARGET_DIRECTORY) ifeq ($$(QUIET_BUILD),yes) @$$(INTERNAL_ECHO) "cc $$*$(2)" endif @echo -E $$(INTERNAL_CC) $$(GENERIC_CFLAGS) $$(CFLAGS_$$(subst /,_,$$*)) $$(GENERIC_INCLUDES) -c -o $$@ $$(GENERIC_$(1)_SOURCE_DIR)/$$*$(2) >> $$(GENERIC_$(1)_TARGET_DIR)/$(INTERNAL_LOG_FILE) $$(INTERNAL_CC) $$(GENERIC_CFLAGS) $$(CFLAGS_$$(subst /,_,$$*)) $$(GENERIC_INCLUDES) -c -o $$@ $$(GENERIC_$(1)_SOURCE_DIR)/$$*$(2) 2>&1 >> $$(GENERIC_$(1)_TARGET_DIR)/$(INTERNAL_LOG_FILE) ifeq ("$$(USE_MEMPROT)","yes") ifdef GENERIC_DOMAIN ifeq ($$(QUIET_BUILD),yes) @$$(INTERNAL_ECHO) "put_in_domain $$(GENERIC_DOMAIN) $$*.o" @$$(PUT_IN_DOMAIN) $$(GENERIC_DOMAIN) $$@ else $$(PUT_IN_DOMAIN) $$(GENERIC_DOMAIN) $$@ endif else ifeq ($$(QUIET_BUILD),yes) @if [ ! -z $$(DOMAIN_$$(subst /,_,$$*)) ]; then \ $$(INTERNAL_ECHO) "put_in_domain $$(DOMAIN_$$(subst /,_,$$*)) $$*.o"; \ $$(PUT_IN_DOMAIN) $$(DOMAIN_$$(subst /,_,$$*)) $$@; \ fi else @if [ ! -z $$(DOMAIN_$$(subst /,_,$$*)) ]; then \ $$(INTERNAL_ECHO) $$(PUT_IN_DOMAIN) $$(DOMAIN_$$(subst /,_,$$*)) $$@; \ $$(PUT_IN_DOMAIN) $$(DOMAIN_$$(subst /,_,$$*)) $$@; \ fi endif endif endif endef # Build rules for each extension $(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),$(eval $(call BUILD_OFILE_TEMPLATE,LIBRARY,$(ext)))) $(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),$(eval $(call BUILD_OFILE_TEMPLATE,BINARIES,$(ext)))) ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),check) -include $(INTERNAL_LIBRARY_DEPFILES) $(INTERNAL_BINARIES_DEPFILES) endif endif