.PHONY: all all: _all # disable built-in rules .SUFFIXES: # setup some variables ROOTDIR := $(dir $(lastword $(MAKEFILE_LIST))) ROOTDIR := $(dir $(ROOTDIR:%../src/=%))../ BUILDDIR ?= $(abspath $(ROOTDIR)build) BUILDDIR := $(BUILDDIR:%/=%) ABSROOT := $(abspath $(ROOTDIR)) ifeq ($(origin OUT),command line) _PROJ := $(OUT:%/=%) _PROJ := $(_PROJ:$(BUILDDIR)/%=%) else _PROJ := $(abspath $(dir $(firstword $(MAKEFILE_LIST)))) _PROJ := $(_PROJ:$(ABSROOT)/%=%) endif 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 $(sort $(_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 " $< # for the fuzzing tests $(BUILDDIR)/$(PROJ)/wpa_supplicant/%.o: $(ROOTDIR)wpa_supplicant/%.c $(CONFIG_FILE) | _make_dirs $(Q)$(CC) -c -o $@ $(CFLAGS) $< @$(E) " CC " $< # libraries - they know how to build themselves # (lib_phony so we recurse all the time) .PHONY: lib_phony lib_phony: # nothing $(BUILDDIR)/$(PROJ)/%.a: $(CONFIG_FILE) lib_phony $(Q)$(MAKE) -C $(ROOTDIR)$(dir $(@:$(BUILDDIR)/$(PROJ)/%=%)) OUT=$(abspath $(dir $@))/ BUILDOBJ = $(patsubst %,$(BUILDDIR)/$(PROJ)/%,$(patsubst $(ROOTDIR)%,%,$(1))) .PHONY: common-clean common-clean: $(Q)rm -rf $(ALL) $(BUILDDIR)/$(PROJ)