1.PHONY: all
2all: _all
3
4# disable built-in rules
5.SUFFIXES:
6
7# setup some variables
8ROOTDIR := $(dir $(lastword $(MAKEFILE_LIST)))
9ROOTDIR := $(dir $(ROOTDIR:%../src/=%))../
10BUILDDIR ?= $(abspath $(ROOTDIR)build)
11BUILDDIR := $(BUILDDIR:%/=%)
12ABSROOT := $(abspath $(ROOTDIR))
13ifeq ($(origin OUT),command line)
14_PROJ := $(OUT:%/=%)
15_PROJ := $(_PROJ:$(BUILDDIR)/%=%)
16else
17_PROJ := $(abspath $(dir $(firstword $(MAKEFILE_LIST))))
18_PROJ := $(_PROJ:$(ABSROOT)/%=%)
19endif
20
21ifndef CC
22CC=gcc
23endif
24
25ifndef RANLIB
26RANLIB=ranlib
27endif
28
29ifndef LDO
30LDO=$(CC)
31endif
32
33ifndef CFLAGS
34CFLAGS = -MMD -O2 -Wall -g
35endif
36
37ifneq ($(CONFIG_FILE),)
38-include $(CONFIG_FILE)
39
40# export for sub-makefiles
41export CONFIG_CODE_COVERAGE
42
43.PHONY: verify_config
44verify_config:
45	@if [ ! -r $(CONFIG_FILE) ]; then \
46		echo 'Building $(firstword $(ALL)) requires a configuration file'; \
47		echo '(.config). See README for more instructions. You can'; \
48		echo 'run "cp defconfig .config" to create an example'; \
49		echo 'configuration.'; \
50		exit 1; \
51	fi
52VERIFY := verify_config
53else
54VERIFY :=
55endif
56
57# default target
58.PHONY: _all
59_all: $(VERIFY) $(ALL) $(EXTRA_TARGETS)
60
61# continue setup
62COVSUFFIX := $(if $(CONFIG_CODE_COVERAGE),-cov,)
63PROJ := $(_PROJ)$(COVSUFFIX)
64
65Q=@
66E=echo
67ifeq ($(V), 1)
68Q=
69E=true
70endif
71ifeq ($(QUIET), 1)
72Q=@
73E=true
74endif
75
76ifeq ($(Q),@)
77MAKEFLAGS += --no-print-directory
78endif
79
80_DIRS := $(BUILDDIR)/$(PROJ)
81.PHONY: _make_dirs
82_make_dirs:
83	@mkdir -p $(_DIRS)
84
85$(BUILDDIR)/$(PROJ)/src/%.o: $(ROOTDIR)src/%.c $(CONFIG_FILE) | _make_dirs
86	$(Q)$(CC) -c -o $@ $(CFLAGS) $<
87	@$(E) "  CC " $<
88$(BUILDDIR)/$(PROJ)/%.o: %.c $(CONFIG_FILE) | _make_dirs
89	$(Q)$(CC) -c -o $@ $(CFLAGS) $<
90	@$(E) "  CC " $<
91# for the fuzzing tests
92$(BUILDDIR)/$(PROJ)/wpa_supplicant/%.o: $(ROOTDIR)wpa_supplicant/%.c $(CONFIG_FILE) | _make_dirs
93	$(Q)$(CC) -c -o $@ $(CFLAGS) $<
94	@$(E) "  CC " $<
95
96# libraries - they know how to build themselves
97# (lib_phony so we recurse all the time)
98.PHONY: lib_phony
99lib_phony:
100# nothing
101
102$(BUILDDIR)/$(PROJ)/%.a: $(CONFIG_FILE) lib_phony
103	$(Q)$(MAKE) -C $(ROOTDIR)$(dir $(@:$(BUILDDIR)/$(PROJ)/%=%)) OUT=$(abspath $(dir $@))/
104
105BUILDOBJ = $(patsubst %,$(BUILDDIR)/$(PROJ)/%,$(patsubst $(ROOTDIR)%,%,$(1)))
106
107.PHONY: common-clean
108common-clean:
109	$(Q)rm -rf $(ALL) $(BUILDDIR)/$(PROJ)
110