4b755c9672
If the build path is long, the contents of the _DIRS variable can be very long, since it repeats the same directories very often. In some cases, this has triggered an "Argument list too long" build error. Reported-by: Robert Marko <robimarko@gmail.com> Suggested-by: Eneas U de Queiroz <cotequeiroz@gmail.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
109 lines
2.2 KiB
Text
109 lines
2.2 KiB
Text
.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)
|