| ifneq ($(MKENV_INCLUDED),1) |
| # We assume that mkenv is in the same directory as this file. |
| THIS_MAKEFILE = $(lastword $(MAKEFILE_LIST)) |
| include $(dir $(THIS_MAKEFILE))mkenv.mk |
| endif |
| |
| # This file expects that OBJ contains a list of all of the object files. |
| # The directory portion of each object file is used to locate the source |
| # and should not contain any ..'s but rather be relative to the top of the |
| # tree. |
| # |
| # So for example, py/map.c would have an object file name py/map.o |
| # The object files will go into the build directory and mantain the same |
| # directory structure as the source tree. So the final dependency will look |
| # like this: |
| # |
| # build/py/map.o: py/map.c |
| # |
| # We set vpath to point to the top of the tree so that the source files |
| # can be located. By following this scheme, it allows a single build rule |
| # to be used to compile all .c files. |
| |
| vpath %.S . $(TOP) |
| $(BUILD)/%.o: %.S |
| $(ECHO) "CC $<" |
| $(Q)$(CC) $(CFLAGS) -c -o $@ $< |
| |
| vpath %.s . $(TOP) |
| $(BUILD)/%.o: %.s |
| $(ECHO) "AS $<" |
| $(Q)$(AS) -o $@ $< |
| |
| define compile_c |
| $(ECHO) "CC $<" |
| $(Q)$(CC) $(CFLAGS) -c -MD -o $@ $< |
| @# The following fixes the dependency file. |
| @# See http://make.paulandlesley.org/autodep.html for details. |
| @cp $(@:.o=.d) $(@:.o=.P); \ |
| sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ |
| -e '/^$$/ d' -e 's/$$/ :/' < $(@:.o=.d) >> $(@:.o=.P); \ |
| rm -f $(@:.o=.d) |
| endef |
| |
| vpath %.c . $(TOP) |
| $(BUILD)/%.o: %.c |
| $(call compile_c) |
| |
| $(BUILD)/%.pp: %.c |
| $(ECHO) "PreProcess $<" |
| $(Q)$(CC) $(CFLAGS) -E -Wp,-C,-dD,-dI -o $@ $< |
| |
| # The following rule uses | to create an order only prereuisite. Order only |
| # prerequisites only get built if they don't exist. They don't cause timestamp |
| # checkng to be performed. |
| # |
| # $(sort $(var)) removes duplicates |
| # |
| # The net effect of this, is it causes the objects to depend on the |
| # object directories (but only for existance), and the object directories |
| # will be created if they don't exist. |
| OBJ_DIRS = $(sort $(dir $(OBJ))) |
| $(OBJ): | $(OBJ_DIRS) |
| $(OBJ_DIRS): |
| mkdir -p $@ |
| |
| ifneq ($(PROG),) |
| # Build a standalone executable (unix and unix-cpy do this) |
| |
| all: $(PROG) |
| |
| $(PROG): $(OBJ) |
| $(ECHO) "LINK $@" |
| $(Q)$(CC) -o $@ $(OBJ) $(LIB) $(LDFLAGS) |
| ifndef DEBUG |
| $(Q)strip $(PROG) |
| endif |
| $(Q)size $(PROG) |
| |
| clean: clean-prog |
| clean-prog: |
| $(RM) -f $(PROG) |
| |
| .PHONY: clean-prog |
| endif |
| |
| clean: |
| $(RM) -rf $(BUILD) |
| .PHONY: clean |
| |
| print-cfg: |
| $(ECHO) "PY_SRC = $(PY_SRC)" |
| $(ECHO) "BUILD = $(BUILD)" |
| $(ECHO) "OBJ = $(OBJ)" |
| .PHONY: print-cfg |
| |
| -include $(OBJ:.o=.P) |