| # SPDX-License-Identifier: GPL-2.0-only |
| # |
| # Copyright (C) 2007-2020 OpenWrt.org |
| |
| PREP_MK= OPENWRT_BUILD= QUIET=0 |
| |
| export IS_TTY=$(if $(MAKE_TERMOUT),1,0) |
| |
| include $(TOPDIR)/include/verbose.mk |
| |
| ifeq ($(SDK),1) |
| include $(TOPDIR)/include/version.mk |
| else |
| REVISION:=$(shell $(TOPDIR)/scripts/getver.sh) |
| SOURCE_DATE_EPOCH:=$(shell $(TOPDIR)/scripts/get_source_date_epoch.sh) |
| endif |
| |
| RTOOLS ?= |
| BITNUM := $(shell getconf LONG_BIT) |
| NONEXIST := $(shell $(TOPDIR)/scripts/gettools.sh) |
| TOOLS_REFRESH:=0 |
| ifeq ($(NONEXIST),1) |
| TOOLS_REFRESH:=1 |
| endif |
| ifneq ($(strip $(RTOOLS)),) |
| TOOLS_REFRESH:=1 |
| endif |
| export TOOLS_REFRESH |
| export NONEXIST |
| export BITNUM |
| |
| export REVISION |
| export SOURCE_DATE_EPOCH |
| export GIT_CONFIG_PARAMETERS='core.autocrlf=false' |
| export GIT_ASKPASS:=/bin/true |
| export MAKE_JOBSERVER=$(filter --jobserver%,$(MAKEFLAGS)) |
| export GNU_HOST_NAME:=$(shell $(TOPDIR)/scripts/config.guess) |
| export HOST_OS:=$(shell uname) |
| export HOST_ARCH:=$(shell uname -m) |
| |
| ifeq ($(HOST_OS),Darwin) |
| ifneq ($(filter /Applications/Xcode.app/% /Library/Developer/%,$(MAKE)),) |
| $(error Please use a newer version of GNU make. The version shipped by Apple is not supported) |
| endif |
| endif |
| |
| # prevent perforce from messing with the patch utility |
| unexport P4PORT P4USER P4CONFIG P4CLIENT |
| |
| # prevent user defaults for quilt from interfering |
| unexport QUILT_PATCHES QUILT_PATCH_OPTS |
| |
| unexport C_INCLUDE_PATH CROSS_COMPILE ARCH |
| |
| # prevent distro default LPATH from interfering |
| unexport LPATH |
| |
| # make sure that a predefined CFLAGS variable does not disturb packages |
| export CFLAGS= |
| export LDFLAGS= |
| |
| empty:= |
| space:= $(empty) $(empty) |
| path:=$(subst :,$(space),$(PATH)) |
| path:=$(filter-out .%,$(path)) |
| path:=$(subst $(space),:,$(path)) |
| export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) |
| export PATH:=$(path) |
| export STAGING_DIR_HOST:=$(if $(STAGING_DIR),$(abspath $(STAGING_DIR)/../host),$(TOPDIR)/staging_dir/host) |
| |
| unexport TAR_OPTIONS |
| |
| ifeq ($(FORCE),) |
| .config scripts/config/conf scripts/config/mconf: $(STAGING_DIR_HOST)/.prereq-build |
| endif |
| |
| SCAN_COOKIE?=$(shell echo $$$$) |
| export SCAN_COOKIE |
| |
| SUBMAKE:=umask 022; $(SUBMAKE) |
| |
| ULIMIT_FIX=_limit=`ulimit -n`; [ "$$_limit" = "unlimited" -o "$$_limit" -ge 1024 ] || ulimit -n 1024; |
| |
| prepare-mk: $(STAGING_DIR_HOST)/.prereq-build FORCE ; |
| |
| ifdef SDK |
| IGNORE_PACKAGES = linux |
| endif |
| |
| _ignore = $(foreach p,$(IGNORE_PACKAGES),--ignore $(p)) |
| |
| prepare-tmpinfo: FORCE |
| @+$(MAKE) -r -s $(STAGING_DIR_HOST)/.prereq-build $(PREP_MK) |
| mkdir -p tmp/info feeds |
| [ -e $(TOPDIR)/feeds/base ] || ln -sf $(TOPDIR)/package $(TOPDIR)/feeds/base |
| $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="packageinfo" SCAN_DIR="package" SCAN_NAME="package" SCAN_DEPTH=5 SCAN_EXTRA="" |
| $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="targetinfo" SCAN_DIR="target/linux" SCAN_NAME="target" SCAN_DEPTH=3 SCAN_EXTRA="! -path 'target/linux/[^m]*' ! -path 'target/linux/m[^m]*'" SCAN_MAKEOPTS="TARGET_BUILD=1" |
| for type in package target; do \ |
| f=tmp/.$${type}info; t=tmp/.config-$${type}.in; \ |
| [ "$$t" -nt "$$f" ] || ./scripts/$${type}-metadata.pl $(_ignore) config "$$f" > "$$t" || { rm -f "$$t"; echo "Failed to build $$t"; false; break; }; \ |
| done |
| [ tmp/.config-feeds.in -nt tmp/.packageauxvars ] || ./scripts/feeds feed_config > tmp/.config-feeds.in |
| ./scripts/package-metadata.pl mk tmp/.packageinfo > tmp/.packagedeps || { rm -f tmp/.packagedeps; false; } |
| ./scripts/package-metadata.pl pkgaux tmp/.packageinfo > tmp/.packageauxvars || { rm -f tmp/.packageauxvars; false; } |
| ./scripts/package-metadata.pl usergroup tmp/.packageinfo > tmp/.packageusergroup || { rm -f tmp/.packageusergroup; false; } |
| touch $(TOPDIR)/tmp/.build |
| |
| .config: ./scripts/config/conf $(if $(CONFIG_HAVE_DOT_CONFIG),,prepare-tmpinfo) |
| @+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \ |
| [ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \ |
| $(_SINGLE)$(NO_TRACE_MAKE) menuconfig $(PREP_MK); \ |
| fi |
| ifneq (,$(filter OPT_%,$(.VARIABLES))) |
| @+( \ |
| cp .config tmp/.config; \ |
| $(foreach c,$(patsubst OPT_%,%,$(filter OPT_%,$(.VARIABLES))),\ |
| DEP1=`awk 'BEGIN{opt="$(c)"};$$1=="config"{flg=($$2==opt);fnd=fnd||flg};flg&&$$1=="select"{print($$2)};END{exit !fnd}' config/Config-build.in`; \ |
| if [ $$? -ne 0 ]; then echo "Unrecognized option $(c)" >&2; exit 1; fi; \ |
| echo "Setting $(c)=$(OPT_$c)"; \ |
| sed -i 's/^.*\<CONFIG_$(c)\>.*/$(if $(filter y,$(OPT_$c)),CONFIG_$(c)=y,# CONFIG_$(c) is not set)/' tmp/.config; \ |
| $(if $(filter y,$(OPT_$c)),,export DEPS="$$DEP1"; while true; do DEPN=`awk 'BEGIN{split(ENVIRON["DEPS"], a);for(i in a){print(a[i]);opt[a[i]]=1}};$$1=="config"{flg=opt[$$2];fnd=fnd||flg};flg&&$$1=="select"{if(!opt[$$2]){print($$2);opt[$$2]=1}}' config/Config-*.in`; if [ "$$DEPS" = "$$DEPN" ]; then break; else export DEPS="$$DEPN"; fi; done; for c in $$DEPS; do echo " Setting $$c=n"; sed -i "s/^.*\\<CONFIG_$$c\\>.*/# CONFIG_$$c is not set/" tmp/.config; done;) \ |
| ) \ |
| ./scripts/config/conf $(KCONF_FLAGS) --defconfig=tmp/.config -w tmp/.config Config.in > /dev/null 2>&1; \ |
| if cmp -s .config tmp/.config; then \ |
| echo ".config not updated"; \ |
| else \ |
| diff -u .config tmp/.config; \ |
| $(SUBMAKE) -r clean; \ |
| [ -e $(MRVLDIR)/services/Makefile ] && $(_SINGLE)$(SUBMAKE) -C $(MRVLDIR)/services dirclean || true; \ |
| [ -e $(MRVLDIR)/linux/.config ] && $(_SINGLE)$(SUBMAKE) -C $(MRVLDIR)/linux mrproper || true; \ |
| mv tmp/.config .config; \ |
| echo ".config updated after make clean"; \ |
| fi; \ |
| ) |
| endif |
| |
| ifeq ($(RECURSIVE_DEP_IS_ERROR),1) |
| KCONF_FLAGS=--fatalrecursive |
| endif |
| ifneq ($(DISTRO_PKG_CONFIG),) |
| scripts/config/%onf: export PATH:=$(dir $(DISTRO_PKG_CONFIG)):$(PATH) |
| endif |
| scripts/config/%onf: CFLAGS+= -O2 |
| scripts/config/%onf: FORCE |
| @$(_SINGLE)$(SUBMAKE) $(if $(findstring s,$(OPENWRT_VERBOSE)),,-s) \ |
| -C scripts/config $(notdir $@) |
| |
| $(eval $(call rdep,scripts/config,scripts/config/mconf)) |
| |
| config: scripts/config/conf prepare-tmpinfo FORCE |
| [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ |
| $< $(KCONF_FLAGS) Config.in |
| |
| config-clean: FORCE |
| $(_SINGLE)$(NO_TRACE_MAKE) -C scripts/config clean |
| |
| defconfig: scripts/config/conf prepare-tmpinfo FORCE |
| touch .config |
| @if [ ! -s .config -a -e $(HOME)/.openwrt/defconfig ]; then cp $(HOME)/.openwrt/defconfig .config; fi |
| [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ |
| $< $(KCONF_FLAGS) --defconfig=.config Config.in |
| |
| defconfig_%: scripts/config/conf prepare-tmpinfo FORCE |
| touch .config |
| @if [ -e $(TOPDIR)/config/defconfig_$(*) ]; then cp $(TOPDIR)/config/defconfig_$(*) .config; fi |
| [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ |
| $< $(KCONF_FLAGS) --defconfig=.config Config.in |
| |
| confdefault-y=allyes |
| confdefault-m=allmod |
| confdefault-n=allno |
| confdefault:=$(confdefault-$(CONFDEFAULT)) |
| |
| oldconfig: scripts/config/conf prepare-tmpinfo FORCE |
| [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ |
| $< $(KCONF_FLAGS) --$(if $(confdefault),$(confdefault),old)config Config.in |
| |
| menuconfig: scripts/config/mconf prepare-tmpinfo FORCE |
| if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \ |
| cp $(HOME)/.openwrt/defconfig .config; \ |
| fi |
| [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ |
| $< Config.in |
| |
| nconfig: scripts/config/nconf prepare-tmpinfo FORCE |
| if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \ |
| cp $(HOME)/.openwrt/defconfig .config; \ |
| fi |
| [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ |
| $< Config.in |
| |
| xconfig: scripts/config/qconf prepare-tmpinfo FORCE |
| if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \ |
| cp $(HOME)/.openwrt/defconfig .config; \ |
| fi |
| $< Config.in |
| |
| prepare_kernel_conf: .config toolchain/install FORCE |
| |
| ifeq ($(wildcard $(STAGING_DIR_HOST)/bin/quilt),) |
| prepare_kernel_conf: |
| @+$(SUBMAKE) -r tools/quilt/compile |
| else |
| prepare_kernel_conf: ; |
| endif |
| |
| kernel_oldconfig: prepare_kernel_conf |
| $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux oldconfig |
| |
| ifneq ($(DISTRO_PKG_CONFIG),) |
| kernel_menuconfig: export PATH:=$(dir $(DISTRO_PKG_CONFIG)):$(PATH) |
| kernel_nconfig: export PATH:=$(dir $(DISTRO_PKG_CONFIG)):$(PATH) |
| kernel_xconfig: export PATH:=$(dir $(DISTRO_PKG_CONFIG)):$(PATH) |
| endif |
| kernel_menuconfig: prepare_kernel_conf |
| @if [ -e $(MRVLDIR)/linux/.config ]; then $(_SINGLE)$(SUBMAKE) -C $(MRVLDIR)/linux mrproper; fi |
| $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux menuconfig |
| |
| kernel_nconfig: prepare_kernel_conf |
| $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux nconfig |
| |
| kernel_xconfig: prepare_kernel_conf |
| $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux xconfig |
| |
| $(STAGING_DIR_HOST)/.prereq-build: include/prereq-build.mk |
| mkdir -p tmp |
| @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq 2>/dev/null || { \ |
| echo "Prerequisite check failed. Use FORCE=1 to override."; \ |
| false; \ |
| } |
| ifneq ($(realpath $(TOPDIR)/include/prepare.mk),) |
| @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prepare.mk prepare 2>/dev/null || { \ |
| echo "Preparation failed."; \ |
| false; \ |
| } |
| endif |
| touch $@ |
| |
| printdb: FORCE |
| @$(_SINGLE)$(NO_TRACE_MAKE) -p $@ V=99 DUMP_TARGET_DB=1 2>&1 |
| |
| ifndef SDK |
| DOWNLOAD_DIRS = tools/download toolchain/download package/download target/download |
| else |
| DOWNLOAD_DIRS = package/download |
| endif |
| |
| download: .config FORCE $(if $(wildcard $(STAGING_DIR_HOST)/bin/flock),,tools/flock/compile) |
| @+$(foreach dir,$(DOWNLOAD_DIRS),$(SUBMAKE) $(dir);) |
| |
| clean dirclean: .config |
| @+$(SUBMAKE) -r $@ |
| @if [ -e $(MRVLDIR)/services/Makefile ]; then $(_SINGLE)$(SUBMAKE) -C $(MRVLDIR)/services dirclean; fi |
| @if [ -e $(MRVLDIR)/linux/.config ]; then $(_SINGLE)$(SUBMAKE) -C $(MRVLDIR)/linux mrproper; fi |
| |
| prereq:: prepare-tmpinfo .config |
| @+$(NO_TRACE_MAKE) -r -s $@ |
| |
| check: .config FORCE |
| @+$(NO_TRACE_MAKE) -r -s $@ QUIET= V=s |
| |
| val.% var.%: FORCE |
| @+$(NO_TRACE_MAKE) -r -s $@ QUIET= V=s |
| |
| WARN_PARALLEL_ERROR = $(if $(BUILD_LOG),,$(and $(filter -j,$(MAKEFLAGS)),$(findstring s,$(OPENWRT_VERBOSE)))) |
| |
| ifeq ($(SDK),1) |
| |
| %:: |
| @+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq |
| @./scripts/config/conf $(KCONF_FLAGS) --defconfig=.config Config.in |
| @+$(ULIMIT_FIX) $(SUBMAKE) -r $@ |
| |
| else |
| |
| %:: |
| @+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq |
| @( \ |
| cp .config tmp/.config; \ |
| ./scripts/config/conf $(KCONF_FLAGS) --defconfig=tmp/.config -w tmp/.config Config.in > /dev/null 2>&1; \ |
| if ./scripts/kconfig.pl '>' .config tmp/.config | grep -q CONFIG; then \ |
| printf "$(_R)WARNING: your configuration is out of sync. Please run make menuconfig, oldconfig or defconfig!$(_N)\n" >&2; \ |
| fi \ |
| ) |
| @+$(ULIMIT_FIX) $(SUBMAKE) -r $@ $(if $(WARN_PARALLEL_ERROR), || { \ |
| printf "$(_R)Build failed - please re-run with -j1 to see the real error message$(_N)\n" >&2; \ |
| false; \ |
| } ) |
| |
| endif |
| |
| # update all feeds, re-create index files, install symlinks |
| package/symlinks: |
| ./scripts/feeds update -a |
| ./scripts/feeds install -a |
| |
| # re-create index files, install symlinks |
| package/symlinks-install: |
| ./scripts/feeds update -i |
| ./scripts/feeds install -a |
| |
| # remove all symlinks, don't touch ./feeds |
| package/symlinks-clean: |
| ./scripts/feeds uninstall -a |
| |
| help: |
| cat README.md |
| |
| preclean: |
| rm -rf build_dir .ccache .config* feeds key-build* logs package/feeds target/linux/feeds staging_dir tmp |
| @$(_SINGLE)$(SUBMAKE) -C scripts/config clean |
| @$(_SINGLE)$(SUBMAKE) -C $(MRVLDIR)/uboot distclean |
| @if [ -e $(MRVLDIR)/services/Makefile ]; then $(_SINGLE)$(SUBMAKE) -C $(MRVLDIR)/services distclean; fi |
| @if [ -e package/utils/adbd/src/adb/Makefile ]; then $(_SINGLE)$(SUBMAKE) -C package/utils/adbd/src/adb clean; fi |
| @if [ -e $(MRVLDIR)/linux/.config ]; then $(_SINGLE)$(SUBMAKE) -C $(MRVLDIR)/linux distclean; fi |
| |
| distclean: preclean |
| rm -rf owtoolchain host bin |
| |
| ifeq ($(findstring v,$(DEBUG)),) |
| .SILENT: symlinkclean clean dirclean preclean distclean config-clean download help tmpinfo-clean .config scripts/config/mconf scripts/config/conf menuconfig $(STAGING_DIR_HOST)/.prereq-build tmp/.prereq-package prepare-tmpinfo |
| endif |
| .PHONY: help FORCE |
| .NOTPARALLEL: |
| |