.PHONY: all all: _all # disable built-in rules .SUFFIXES: # setup some variables ROOTDIR := $(dir $(lastword $(MAKEFILE_LIST))) ROOTDIR := $(dir $(ROOTDIR:%../src/=%))../ BUILDDIR := $(ROOTDIR)build _PROJ := $(abspath $(dir $(firstword $(MAKEFILE_LIST)))) ABSROOT := $(abspath $(ROOTDIR)) _PROJ := $(_PROJ:$(ABSROOT)/%=%) ifndef CC CC=gcc endif ifndef RANLIB RANLIB=ranlib endif ifndef LDO LDO=$(CC) endif ifndef CFLAGS CFLAGS = -MMD -O2 -Wall -g endif ifneq ($(CONFIG_FILE),) -include $(CONFIG_FILE) # export for sub-makefiles export CONFIG_CODE_COVERAGE .PHONY: verify_config verify_config: @if [ ! -r $(CONFIG_FILE) ]; then \ echo 'Building $(firstword $(ALL)) requires a configuration file'; \ echo '(.config). See README for more instructions. You can'; \ echo 'run "cp defconfig .config" to create an example'; \ echo 'configuration.'; \ exit 1; \ fi VERIFY := verify_config else VERIFY := endif # default target .PHONY: _all _all: $(VERIFY) $(ALL) $(EXTRA_TARGETS) # continue setup COVSUFFIX := $(if $(CONFIG_CODE_COVERAGE),-cov,) PROJ := $(_PROJ)$(COVSUFFIX) Q=@ E=echo ifeq ($(V), 1) Q= E=true endif ifeq ($(QUIET), 1) Q=@ E=true endif ifeq ($(Q),@) MAKEFLAGS += --no-print-directory endif _DIRS := $(BUILDDIR)/$(PROJ) .PHONY: _make_dirs _make_dirs: @mkdir -p $(_DIRS) $(BUILDDIR)/$(PROJ)/src/%.o: $(ROOTDIR)src/%.c $(CONFIG_FILE) | _make_dirs $(Q)$(CC) -c -o $@ $(CFLAGS) $< @$(E) " CC " $< $(BUILDDIR)/$(PROJ)/%.o: %.c $(CONFIG_FILE) | _make_dirs $(Q)$(CC) -c -o $@ $(CFLAGS) $< @$(E) " CC " $< BUILDOBJ = $(patsubst %,$(BUILDDIR)/$(PROJ)/%,$(patsubst $(ROOTDIR)%,%,$(1))) .PHONY: common-clean common-clean: $(Q)$(MAKE) -C $(ROOTDIR)/src clean $(Q)rm -rf $(ALL) $(BUILDDIR)/$(PROJ)