mirror of
https://github.com/openwrt/openwrt.git
synced 2026-10-13 19:48:16 +04:00
The variants of a package are built one after the other in one recipe. For packages with many variants, such as the boot loaders, this makes the variants the longest chain of the package build, also if nothing has to be done. Add PKG_PARALLEL_VARIANTS. If a package sets it, every variant gets its own make target with the dependencies of the package, and the package target depends on these targets. A package must only set it if its variants share no files outside of their build directories. Signed-off-by: John Crispin <john@phrozen.org>
125 lines
5.2 KiB
Makefile
125 lines
5.2 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
# Copyright (C) 2007-2020 OpenWrt.org
|
|
|
|
ifeq ($(MAKECMDGOALS),prereq)
|
|
SUBTARGETS:=prereq
|
|
PREREQ_ONLY:=1
|
|
# For target/linux related target add dtb to selectively compile dtbs
|
|
else ifneq ($(filter target/linux/%,$(MAKECMDGOALS)),)
|
|
SUBTARGETS:=$(DEFAULT_SUBDIR_TARGETS) dtb
|
|
else
|
|
SUBTARGETS:=$(DEFAULT_SUBDIR_TARGETS)
|
|
endif
|
|
|
|
subtarget-default = $(filter-out ., \
|
|
$(if $($(1)/builddirs-$(2)),$($(1)/builddirs-$(2)), \
|
|
$(if $($(1)/builddirs-default),$($(1)/builddirs-default), \
|
|
$($(1)/builddirs))))
|
|
|
|
define subtarget
|
|
$(call warn_eval,$(1),t,T,$(1)/$(2): $($(1)/) $(foreach bd,$(call subtarget-default,$(1),$(2)),$(1)/$(bd)/$(2)))
|
|
|
|
endef
|
|
|
|
define ERROR
|
|
($(call MESSAGE, $(2)); $(if $(BUILD_LOG), echo "$(2)" >> $(BUILD_LOG_DIR)/$(1)/error.txt;) $(if $(3),, exit 1;))
|
|
endef
|
|
|
|
lastdir=$(word $(words $(subst /, ,$(1))),$(subst /, ,$(1)))
|
|
diralias=$(if $(findstring $(1),$(call lastdir,$(1))),,$(call lastdir,$(1)))
|
|
|
|
subdir_make_opts = \
|
|
$(if $(SUBDIR_MAKE_DEBUG),-d) -r -C $(1) \
|
|
BUILD_SUBDIR="$(1)" \
|
|
BUILD_VARIANT="$(4)" \
|
|
ALL_VARIANTS="$(5)"
|
|
|
|
# 1: subdir
|
|
# 2: target
|
|
# 3: build type
|
|
# 4: build variant
|
|
# 5: all variants
|
|
log_make = \
|
|
$(if $(call debug,$(1),v),,@)+ \
|
|
$(if $(BUILD_LOG), \
|
|
set -o pipefail; \
|
|
mkdir -p $(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4));) \
|
|
$(SCRIPT_DIR)/time.pl "time: $(1)$(if $(4),/$(4))/$(if $(3),$(3)-)$(2)" \
|
|
$$(SUBMAKE) $(subdir_make_opts) $(if $(3),$(3)-)$(2) \
|
|
$(if $(BUILD_LOG),SILENT= 2>&1 | tee $(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4))/$(if $(3),$(3)-)$(2).txt)
|
|
|
|
ifdef CONFIG_AUTOREMOVE
|
|
rebuild_check = \
|
|
@-$$(NO_TRACE_MAKE) $(subdir_make_opts) check-depends >/dev/null 2>/dev/null; \
|
|
$(if $(BUILD_LOG),mkdir -p $(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4));) \
|
|
$$(NO_TRACE_MAKE) $(if $(BUILD_LOG),-d) -q $(subdir_make_opts) .$(if $(3),$(3)-)$(2) \
|
|
> $(if $(BUILD_LOG),$(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4))/check-$(if $(3),$(3)-)$(2).txt,/dev/null) 2>&1 || \
|
|
$$(SUBMAKE) $(subdir_make_opts) clean-build >/dev/null 2>/dev/null
|
|
|
|
endif
|
|
|
|
subdir_variants = $(filter-out *,$(if $(BUILD_VARIANT),$(BUILD_VARIANT),$(if $(strip $($(1)/variants)),$($(1)/variants),$(if $($(1)/default-variant),$($(1)/default-variant),__default))))
|
|
|
|
# Parameters: <subdir> <builddir> <target> <variant>
|
|
define subdir_variant
|
|
$(if $(BUILD_LOG),@mkdir -p $(BUILD_LOG_DIR)/$(1)/$(2)/$(filter-out __default,$(4)))
|
|
$(if $($(1)/autoremove),$(call rebuild_check,$(1)/$(2),$(3),,$(filter-out __default,$(4)),$($(1)/$(2)/variants)))
|
|
$(call log_make,$(1)/$(2),$(3),,$(filter-out __default,$(4)),$($(1)/$(2)/variants)) \
|
|
|| $(call ERROR,$(1), ERROR: $(1)/$(2) failed to build$(if $(filter-out __default,$(4)), (build variant: $(4))).,$(findstring $(2),$($(1)/builddirs-ignore-$(3))))
|
|
endef
|
|
|
|
# Parameters: <subdir>
|
|
define subdir
|
|
$(call warn,$(1),d,D $(1))
|
|
$(foreach bd,$($(1)/builddirs),
|
|
$(call warn,$(1),d,BD $(1)/$(bd))
|
|
$(foreach target,$(SUBTARGETS) $($(1)/subtargets),
|
|
$(foreach btype,$(buildtypes-$(bd)),
|
|
$(call warn_eval,$(1)/$(bd),t,T,$(1)/$(bd)/$(btype)/$(target): $(if $(NO_DEPS)$(QUILT),,$($(1)/$(bd)/$(btype)/$(target)) $(call $(1)//$(btype)/$(target),$(1)/$(bd)/$(btype))))
|
|
$(call log_make,$(1)/$(bd),$(target),$(btype),$(filter-out __default,$(variant)),$($(1)/$(bd)/variants)) \
|
|
|| $(call ERROR,$(1), ERROR: $(1)/$(bd) [$(btype)] failed to build.,$(findstring $(bd),$($(1)/builddirs-ignore-$(btype)-$(target))))
|
|
$(if $(call diralias,$(bd)),$(call warn_eval,$(1)/$(bd),l,T,$(1)/$(call diralias,$(bd))/$(btype)/$(target): $(1)/$(bd)/$(btype)/$(target)))
|
|
)
|
|
$(if $($(1)/$(bd)/parallel-variants),
|
|
$(foreach variant,$(call subdir_variants,$(1)/$(bd)),
|
|
$(call warn_eval,$(1)/$(bd),t,T,$(1)/$(bd)/$(variant)/$(target): $(if $(NO_DEPS)$(QUILT),,$($(1)/$(bd)/$(target)) $(call $(1)//$(target),$(1)/$(bd))))
|
|
$(call subdir_variant,$(1),$(bd),$(target),$(variant))
|
|
)
|
|
$(call warn_eval,$(1)/$(bd),t,T,$(1)/$(bd)/$(target): $(foreach variant,$(call subdir_variants,$(1)/$(bd)),$(1)/$(bd)/$(variant)/$(target)))
|
|
,
|
|
$(call warn_eval,$(1)/$(bd),t,T,$(1)/$(bd)/$(target): $(if $(NO_DEPS)$(QUILT),,$($(1)/$(bd)/$(target)) $(call $(1)//$(target),$(1)/$(bd))))
|
|
$(foreach variant,$(call subdir_variants,$(1)/$(bd)),
|
|
$(call subdir_variant,$(1),$(bd),$(target),$(variant))
|
|
)
|
|
)
|
|
$(if $(PREREQ_ONLY)$(DUMP_TARGET_DB),,
|
|
# aliases
|
|
$(if $(call diralias,$(bd)),$(call warn_eval,$(1)/$(bd),l,T,$(1)/$(call diralias,$(bd))/$(target): $(1)/$(bd)/$(target)))
|
|
)
|
|
)
|
|
)
|
|
$(foreach target,$(SUBTARGETS) $($(1)/subtargets),$(call subtarget,$(1),$(target)))
|
|
endef
|
|
|
|
ifndef DUMP_TARGET_DB
|
|
# Parameters: <subdir> <name> <target> <depends> <config options> <stampfile location>
|
|
define stampfile
|
|
$(1)/stamp-$(3):=$(if $(6),$(6),$(STAGING_DIR))/stamp/.$(2)_$(3)$(5)
|
|
$$($(1)/stamp-$(3)): $(TMP_DIR)/.build $(4)
|
|
@+$(SCRIPT_DIR)/timestamp.pl -n $$($(1)/stamp-$(3)) $(1) $(4) || \
|
|
$(MAKE) $(if $(QUIET),--no-print-directory) $$($(1)/flags-$(3)) $(1)/$(3)
|
|
@mkdir -p $$$$(dirname $$($(1)/stamp-$(3)))
|
|
@touch $$($(1)/stamp-$(3))
|
|
|
|
$$(if $(call debug,$(1),v),,.SILENT: $$($(1)/stamp-$(3)))
|
|
|
|
.PRECIOUS: $$($(1)/stamp-$(3)) # work around a make bug
|
|
|
|
$(1)//clean+=$(1)/stamp-$(3)/clean
|
|
$(1)/stamp-$(3)/clean: FORCE
|
|
@rm -f $$($(1)/stamp-$(3))
|
|
|
|
endef
|
|
endif
|