3 # kBuild - Footer - Target lists - Pass 2 - Passes.
7 # Copyright (c) 2004-2017 knut st. osmundsen <bird-kBuild-spam-xviiv@anduin.net>
9 # This file is part of kBuild.
11 # kBuild is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version source of the License, or
14 # (at your option) any later version.
16 # kBuild is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
21 # You should have received a copy of the GNU General Public License
22 # along with kBuild; if not, write to the Free Software
23 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 # As a special exception you are granted permission to include this file, via
27 # the kmk include directive, as you wish without this in itself causing the
28 # resulting makefile, program or whatever to be covered by the GPL license.
29 # This exception does not however invalidate any other reasons why the makefile,
30 # program, whatever should not be covered the GPL.
35 # PASSES (including directory and makefile walking)
39 # First, check whether we need to order the passes explicitly or not.
40 # This depends on whether we're a leaf makefile or not. A leaf will
41 # know all its dependencies, while a recursive one relies on the
42 # order sub-directories and other makefiles are executed it.
45 ## Setup a pass and check for optimizations.
46 # @param $(PASS) Uppercase pass name.
47 define def_pass_setup_and_optimize
49 # The setup. ## @todo This is looks a bit weird...
50 ifndef SUBDIRS_
$(PASS
)
51 SUBDIRS_
$(PASS
) := $(SUBDIRS
) $(SUBDIRS.
$(KBUILD_TARGET
)) $(SUBDIRS.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
))
53 ifndef SUBDIRS_AFTER_
$(PASS
)
54 SUBDIRS_AFTER_
$(PASS
) := $(SUBDIRS_AFTER
) $(SUBDIRS_AFTER.
$(KBUILD_TARGET
)) $(SUBDIRS_AFTER.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
))
56 ifndef MAKEFILES_BEFORE_
$(PASS
)
57 MAKEFILES_BEFORE_
$(PASS
) := $(MAKEFILES_BEFORE
) $(MAKEFILES_BEFORE.
$(KBUILD_TARGET
)) $(MAKEFILES_BEFORE.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
))
59 ifndef MAKEFILES_AFTER_
$(PASS
)
60 MAKEFILES_AFTER_
$(PASS
) := $(MAKEFILES_AFTER
) $(MAKEFILES_AFTER.
$(KBUILD_TARGET
)) $(MAKEFILES_AFTER.
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
))
64 ifeq ($(_KBUILD_STRICT_PASS_ORDER
),nonstrict
)
66 $(SUBDIRS_
$(PASS
)) $(SUBDIRS_
$(PASS
).
$(KBUILD_TARGET
)) $(SUBDIRS_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) \
67 $(MAKEFILES_BEFORE_
$(PASS
)) $(MAKEFILES_BEFORE_
$(PASS
).
$(KBUILD_TARGET
)) $(MAKEFILES_BEFORE_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) \
68 $(SUBDIRS_AFTER_
$(PASS
)) $(SUBDIRS_AFTER_
$(PASS
).
$(KBUILD_TARGET
)) $(SUBDIRS_AFTER_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) \
69 $(MAKEFILES_AFTER_
$(PASS
)) $(MAKEFILES_AFTER_
$(PASS
).
$(KBUILD_TARGET
)) $(MAKEFILES_AFTER_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) \
71 _KBUILD_STRICT_PASS_ORDER
:= strict
73 endif # _KBUILD_STRICT_PASS_ORDER == nonstrict
74 endef # def_pass_setup_and_optimize
75 $(eval-opt-var def_pass_setup_and_optimize
)
77 ## PASS: Setup & optimization.
78 # Check if we can apply the non-strict pass order optimzation (no SUBDIRS_* and MAKEFILES_*),
79 # and set up the pass specific variables as we go along.
80 _KBUILD_STRICT_PASS_ORDER
:= nonstrict
81 $(foreach PASS
, $(PASSES
), $(evalval def_pass_setup_and_optimize
))
82 #$ (error _KBUILD_STRICT_PASS_ORDER=$(_KBUILD_STRICT_PASS_ORDER))
84 ifeq ($(_KBUILD_STRICT_PASS_ORDER
),strict
)
85 if
!defined
(KBUILD_SAFE_PARALLEL
) ||
"$(KMK_OPT_JOBS)" == "1"
86 _KBUILD_STRICT_PASS_ORDER
:= strict_unsafe
92 # @param $(pass) Lowercase pass name.
93 # @param $(PASS) Uppercase pass name.
94 # @param $(subdir) Subdirectory
95 # @param $(tag) tag to attach to the rule name.
96 define def_pass_subdir
97 pass_
$(pass
)$(tag
):: $(dep
)
98 + $$(QUIET
)$$(MAKE
) -C
$(subdir
) -f
$$(notdir $$(firstword $$(wildcard $$(addprefix $(subdir
)/,$$(DEFAULT_MAKEFILE
))))) pass_
$(pass
)
102 # @param $(pass) Lowercase pass name.
103 # @param $(PASS) Uppercase pass name.
104 # @param $(makefile) Makefile.
105 # @param $(tag) tag to attach to the rule name.
106 define def_pass_makefile
107 pass_
$(pass
)$(tag
):: $(dep
)
108 + $$(QUIET
)$$(MAKE
) -C
$(patsubst %/,%,$(dir $(makefile
))) -f
$(notdir $(makefile
)) pass_
$(pass
)
111 ## Execute a pass, strict order.
112 # @param $(pass) Lowercase pass name.
113 # @param $(PASS) Uppercase pass name.
114 define def_pass_strict
117 $(foreach subdir
, $(SUBDIRS_
$(PASS
)) $(SUBDIRS_
$(PASS
).
$(KBUILD_TARGET
)) $(SUBDIRS_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) ,$(eval
$(def_pass_subdir
)))
118 $(foreach makefile
,$(MAKEFILES_BEFORE_
$(PASS
)) $(MAKEFILES_BEFORE_
$(PASS
).
$(KBUILD_TARGET
)) $(MAKEFILES_BEFORE_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)),$(eval
$(def_pass_makefile
)))
121 $(eval dep
:=pass_
$(pass
)_doit
)
122 $(foreach subdir
, $(SUBDIRS_AFTER_
$(PASS
)) $(SUBDIRS_AFTER_
$(PASS
).
$(KBUILD_TARGET
)) $(SUBDIRS_AFTER_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) ,$(eval
$(def_pass_subdir
)))
123 $(foreach makefile
,$(MAKEFILES_AFTER_
$(PASS
)) $(MAKEFILES_AFTER_
$(PASS
).
$(KBUILD_TARGET
)) $(MAKEFILES_AFTER_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) ,$(eval
$(def_pass_makefile
)))
125 .NOTPARALLEL
: pass_
$(pass
) pass_
$(pass
)_before pass_
$(pass
)_after pass_
$(pass
)_this
126 .PHONY
: pass_
$(pass
) pass_
$(pass
)_before pass_
$(pass
)_after pass_
$(pass
)_this pass_
$(pass
)_doit
127 pass_
$(pass
)_doit
: $(PASS_
$(PASS
)_trgs
) $(foreach var
,$(PASS_
$(PASS
)_vars
),$($(var
)))
128 pass_
$(pass
)_this
: pass_
$(pass
)_before
129 + $$(QUIET
)$$(MAKE
) -f
$$(MAKEFILE
) pass_
$(pass
)_doit
130 pass_
$(pass
)_after
:: pass_
$(pass
)_this
131 pass_
$(pass
): pass_
$(pass
)_after
132 #$ (warning pass=$(pass) PASS=$(PASS): $(PASS_$(PASS)_trgs) $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var))))
133 endef # def_pass_strict
134 $(eval-opt-var def_pass_strict
)
136 ## Execute a pass, strict order.
137 # @param $(pass) Lowercase pass name.
138 # @param $(PASS) Uppercase pass name.
139 define def_pass_strict_unsafe
142 $(foreach subdir
, $(SUBDIRS_
$(PASS
)) $(SUBDIRS_
$(PASS
).
$(KBUILD_TARGET
)) $(SUBDIRS_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) ,$(eval
$(def_pass_subdir
)))
143 $(foreach makefile
,$(MAKEFILES_BEFORE_
$(PASS
)) $(MAKEFILES_BEFORE_
$(PASS
).
$(KBUILD_TARGET
)) $(MAKEFILES_BEFORE_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)),$(eval
$(def_pass_makefile
)))
146 $(eval dep
:=pass_
$(pass
)_doit
)
147 $(foreach subdir
, $(SUBDIRS_AFTER_
$(PASS
)) $(SUBDIRS_AFTER_
$(PASS
).
$(KBUILD_TARGET
)) $(SUBDIRS_AFTER_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) ,$(eval
$(def_pass_subdir
)))
148 $(foreach makefile
,$(MAKEFILES_AFTER_
$(PASS
)) $(MAKEFILES_AFTER_
$(PASS
).
$(KBUILD_TARGET
)) $(MAKEFILES_AFTER_
$(PASS
).
$(KBUILD_TARGET
).
$(KBUILD_TARGET_ARCH
)) ,$(eval
$(def_pass_makefile
)))
150 .PHONY
: pass_
$(pass
) pass_
$(pass
)_before pass_
$(pass
)_after pass_
$(pass
)_doit
151 .NOTPARALLEL
: pass_
$(pass
) pass_
$(pass
)_before pass_
$(pass
)_after pass_
$(pass
)_doit
152 pass_
$(pass
)_doit
: pass_
$(pass
)_before \
153 $(PASS_
$(PASS
)_trgs
) $(foreach var
,$(PASS_
$(PASS
)_vars
),$($(var
)))
155 pass_
$(pass
)_before \
158 #$ (warning pass=$(pass) PASS=$(PASS): $(PASS_$(PASS)_trgs) $(PASS_$(PASS)_trgs) $(foreach var,$(PASS_$(PASS)_vars),$($(var))))
159 endef # def_pass_strict_unsafe
160 $(eval-opt-var def_pass_strict_unsafe
)
162 ## Execute a pass, non-strict pass ordering.
163 # @param $(pass) Lowercase pass name.
164 # @param $(PASS) Uppercase pass name.
165 define def_pass_nonstrict
166 .PHONY
: pass_
$(pass
) pass_
$(pass
)_before pass_
$(pass
)_after pass_
$(pass
)_doit
167 pass_
$(pass
)_doit
: $(PASS_
$(PASS
)_trgs
) $(foreach var
,$(PASS_
$(PASS
)_vars
),$$$$($(var
)))
168 pass_
$(pass
): pass_
$(pass
)_doit
169 endef # def_pass_nonstrict
172 # Generate the rules for the defined passes.
173 $(foreach PASS
, $(PASSES
), \
174 $(eval pass
:= $(PASS_
$(PASS
)_pass
)) \
175 $(eval
$(def_pass_
$(_KBUILD_STRICT_PASS_ORDER
))))
178 ## Pass order, strict.
179 # @param $(pass) Current pass name.
180 # @param $(prev_pass) The previous pass name.
181 define def_pass_order_strict
182 .PHONY
: pass_
$(pass
)_order
183 .NOTPARALLEL
: pass_
$(pass
)_order
184 pass_
$(pass
)_order
: $(pass_prev
)
185 %$$(call MSG_PASS
,$$(if
$$(PASS_
$(PASS
)),$$(PASS_
$(PASS
)),$(pass
)))
186 + $$(QUIET
)$$(MAKE
) -f
$$(MAKEFILE
) pass_
$(pass
)
187 $(eval pass_prev
:= pass_
$(pass
)_order
)
188 endef # def_pass_order_strict
189 $(eval-opt-var def_pass_order_strict
)
191 ## Pass order, strict unsafe.
192 # @param $(pass) Current pass name.
193 # @param $(prev_pass) The previous pass name.
194 define def_pass_order_strict_unsafe
195 .NOTPARALLEL
: pass_
$(pass
)_order pass_
$(pass
)_banner
196 .PHONY
: pass_
$(pass
)_order pass_
$(pass
)_banner
197 pass_
$(pass
)_banner
: $(pass_prev
)
198 %$$(call MSG_PASS
,$$(if
$$(PASS_
$(PASS
)),$$(PASS_
$(PASS
)),$(pass
)))
199 pass_
$(pass
)_order
: $(pass_prev
) \
200 pass_
$(pass
)_banner \
202 $(eval pass_prev
:= pass_
$(pass
)_order
)
203 endef # def_pass_order_strict_unsafe
204 $(eval-opt-var def_pass_order_strict_unsafe
)
206 ## Pass order, non-strict.
207 # @param $(pass) Current pass name.
208 # @param $(prev_pass) The previous pass name.
209 define def_pass_order_nonstrict
210 .PHONY
: pass_
$(pass
)_order pass_
$(pass
)_banner
212 %$$(call MSG_PASS
,$$(if
$$(PASS_
$(PASS
)),$$(PASS_
$(PASS
)),$(pass
)))
213 pass_
$(pass
)_order
: \
215 pass_
$(pass
)_banner \
217 $(eval pass_prev
:= pass_
$(pass
)_order
)
218 endef # def_pass_order_nonstrict
219 $(eval-opt-var def_pass_order_nonstrict
)
222 # Use dependencies to ensure correct pass order.
224 $(foreach PASS
,$(DEFAULT_PASSES
),\
225 $(eval pass
:= $(PASS_
$(PASS
)_pass
)) \
226 $(eval
$(def_pass_order_
$(_KBUILD_STRICT_PASS_ORDER
))))
228 ifdef KBUILD_PROFILE_SELF
229 $(evalcall def_profile_self
, done passes
)
232 # Some common pass aliases
233 ifndef KBUILD_NO_PASS_ALIASES
238 nothing
: pass_nothing
241 staging
: pass_staging
244 packing
: pass_packing
246 ifndef KBUILD_NO_TESTING_PASS_ALIASES
252 endif # KBUILD_NO_TESTING_PASS_ALIASES
253 endif # KBUILD_NO_PASS_ALIASES