1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 # You can obtain one at http://mozilla.org/MPL/2.0/.
5 ifndef INCLUDED_RULES_MK
6 include $(topsrcdir
)/config
/rules.mk
9 # The traditional model of directory traversal with make is as follows:
19 # Pseudo derecurse transforms the above into:
29 # Main rules (export, compile, libs and tools) call recurse_* rules.
30 # This wrapping is only really useful for build status.
32 $(if
$(filter $@
,$(MAKECMDGOALS
)),$(call BUILDSTATUS
,TIERS
$@
),)
33 $(call BUILDSTATUS
,TIER_START
$@
)
35 $(call BUILDSTATUS
,TIER_FINISH
$@
)
37 # Special rule that does install-manifests (cf. Makefile.in) + compile
39 +$(MAKE
) recurse_compile
41 # Get current tier and corresponding subtiers from the data in root.mk.
42 CURRENT_TIER
:= $(filter $(foreach tier
,$(RUNNABLE_TIERS
) $(non_default_tiers
),recurse_
$(tier
) $(tier
)-deps
),$(MAKECMDGOALS
))
43 ifneq (,$(filter-out 0 1,$(words $(CURRENT_TIER
))))
44 $(error
$(CURRENT_TIER
) not supported on the same make command line
)
46 CURRENT_TIER
:= $(subst recurse_
,,$(CURRENT_TIER
:-deps
=))
48 # The rules here are doing directory traversal, so we don't want further
49 # recursion to happen when running make -C subdir $tier. But some make files
50 # further call make -C something else, and sometimes expect recursion to
51 # happen in that case.
52 # Conveniently, every invocation of make increases MAKELEVEL, so only stop
53 # recursion from happening at current MAKELEVEL + 1.
56 export NO_RECURSE_MAKELEVEL
=1
58 export NO_RECURSE_MAKELEVEL
=$(word $(MAKELEVEL
),2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20)
62 RECURSE
= $(if
$(RECURSE_TRACE_ONLY
),@echo
$2/$1,$(call SUBMAKE
,$1,$2))
64 # Use the $(*_dirs) variables available in root.mk
65 CURRENT_DIRS
:= $($(CURRENT_TIER
)_dirs
)
67 # Need a list of compile targets because we can't use pattern rules:
68 # https://savannah.gnu.org/bugs/index.php?42833
69 # Only recurse the paths starting with RECURSE_BASE_DIR when provided.
70 .PHONY
: $(pre_compile_targets
) $(compile_targets
) $(syms_targets
)
71 $(pre_compile_targets
) $(compile_targets
) $(syms_targets
):
72 $(if
$(filter $(RECURSE_BASE_DIR
)%,$@
),$(call RECURSE
,$(@F
),$(@D
)))
74 $(syms_targets
): %/syms
: %/target
76 # Only hook symbols targets into the main compile graph in automation.
78 ifeq (1,$(MOZ_AUTOMATION_BUILD_SYMBOLS
))
79 recurse_compile
: $(syms_targets
)
83 # Create a separate rule that depends on every 'syms' target so that
84 # symbols can be dumped on demand locally.
86 recurse_syms
: $(syms_targets
)
88 # The compile tier has different rules from other tiers.
89 ifneq ($(CURRENT_TIER
),compile
)
91 # Recursion rule for all directories traversed for all subtiers in the
93 $(addsuffix /$(CURRENT_TIER
),$(CURRENT_DIRS
)): %/$(CURRENT_TIER
):
94 $(call RECURSE
,$(CURRENT_TIER
),$*)
96 .PHONY
: $(addsuffix /$(CURRENT_TIER
),$(CURRENT_DIRS
))
98 # Dummy rules for possibly inexisting dependencies for the above tier targets
99 $(addsuffix /Makefile
,$(CURRENT_DIRS
)) $(addsuffix /backend.mk
,$(CURRENT_DIRS
)):
101 ifeq ($(CURRENT_TIER
),export)
102 # At least build/export requires config/export for buildid, but who knows what
103 # else, so keep this global dependency to make config/export first for now.
104 $(addsuffix /$(CURRENT_TIER
),$(filter-out config
,$(CURRENT_DIRS
))): config
/$(CURRENT_TIER
)
106 # The export tier requires nsinstall, which is built from config. So every
107 # subdirectory traversal needs to happen after building nsinstall in config, which
108 # is done with the config/host target. Note the config/host target only exists if
109 # nsinstall is actually built, which it is not on Windows, because we use
110 # nsinstall.py there.
111 ifdef COMPILE_ENVIRONMENT
112 ifneq (,$(filter config
/host
, $(compile_targets
)))
113 $(addsuffix /$(CURRENT_TIER
),$(CURRENT_DIRS
)): config
/host
118 endif # ifeq ($(CURRENT_TIER),compile)
122 # Don't recurse if MAKELEVEL is NO_RECURSE_MAKELEVEL as defined above
123 ifeq ($(NO_RECURSE_MAKELEVEL
),$(MAKELEVEL
))
128 #########################
129 # Tier traversal handling
130 #########################
132 define CREATE_SUBTIER_TRAVERSAL_RULE
135 $(1):: $$(SUBMAKEFILES
)
140 $(foreach subtier
,$(filter-out compile
,$(RUNNABLE_TIERS
)),$(eval
$(call CREATE_SUBTIER_TRAVERSAL_RULE
,$(subtier
))))
142 ifndef TOPLEVEL_BUILD
143 ifdef COMPILE_ENVIRONMENT
145 @
$(MAKE
) -C
$(DEPTH
) compile RECURSE_BASE_DIR
=$(relativesrcdir
)/
146 endif # COMPILE_ENVIRONMENT
149 endif # ifeq ($(NO_RECURSE_MAKELEVEL),$(MAKELEVEL))
151 endif # ifeq (.,$(DEPTH))
159 # This is required so that the pre-export tier sees the rules in
161 ifeq ($(MOZ_WIDGET_TOOLKIT
),android
)
162 recurse_pre-export
:: mobile
/android
/pre-export
165 # CSS2Properties.webidl needs ServoCSSPropList.py from layout/style
166 dom
/bindings
/export: layout
/style
/ServoCSSPropList.py
168 # Various telemetry histogram files need ServoCSSPropList.py from layout/style
169 toolkit
/components
/telemetry
/export: layout
/style
/ServoCSSPropList.py
171 # The update agent needs to link to the updatecommon library, but the build system does not
172 # currently have a good way of expressing this dependency.
173 toolkit
/components
/updateagent
/target
: toolkit
/mozapps
/update
/common
/target
175 ifeq ($(TARGET_ENDIANNESS
),big
)
176 config
/external
/icu
/data
/target-objects
: config
/external
/icu
/data
/$(MDDEPDIR
)/icudt
$(MOZ_ICU_VERSION
)b.dat.stub
177 config
/external
/icu
/data
/$(MDDEPDIR
)/icudt
$(MOZ_ICU_VERSION
)b.dat.stub
: config
/external
/icu
/icupkg
/host
180 ifdef ENABLE_CLANG_PLUGIN
181 # Only target rules use the clang plugin.
182 $(filter %/target
%/target-objects
,$(filter-out config
/export config
/host build
/unix
/stdc
++compat
/% build
/clang-plugin
/%,$(compile_targets
))) security
/rlbox
/pre-compile media
/libsoundtouch
/src
/pre-compile
: build
/clang-plugin
/host build
/clang-plugin
/tests
/target-objects
183 build
/clang-plugin
/tests
/target-objects
: build
/clang-plugin
/host
184 # clang-plugin tests require js-confdefs.h on js standalone builds and mozilla-config.h on
185 # other builds, because they are -include'd.
187 # The js/src/export target only exists when CURRENT_TIER is export. If we're in a later tier,
188 # we can assume js/src/export has happened anyways.
189 ifeq ($(CURRENT_TIER
),export)
190 build
/clang-plugin
/tests
/target-objects
: js
/src
/export
193 build
/clang-plugin
/tests
/target-objects
: mozilla-config.h
197 # Interdependencies that moz.build world don't know about yet for compilation.
198 # Note some others are hardcoded or "guessed" in recursivemake.py and emitter.py
200 ifndef MOZ_SYSTEM_NSS
201 netwerk
/test/http3server
/target
: security
/nss
/lib
/nss
/nss_nss3
/target security
/nss
/lib
/ssl
/ssl_ssl3
/target
203 ifndef MOZ_SYSTEM_NSPR
204 netwerk
/test/http3server
/target
: config
/external
/nspr
/pr
/target
207 ifndef MOZ_SYSTEM_NSS
208 netwerk
/test/http3server
/target
: security
/target
213 # When building with RELR-based ELF hack, we need to build the relevant parts
215 $(filter %/target
,$(compile_targets
)): build
/unix
/elfhack
/host build
/unix
/elfhack
/inject
/target-objects
218 ifdef MOZ_USING_WASM_SANDBOXING
219 security
/rlbox
/pre-compile media
/libsoundtouch
/src
/pre-compile
: config
/external
/wasm2c_sandbox_compiler
/host
220 dom
/media
/ogg
/target-objects extensions
/spellcheck
/hunspell
/glue
/target-objects gfx
/thebes
/target-objects parser
/expat
/target-objects parser
/htmlparser
/target-objects gfx
/ots
/src
/target-objects
: security
/rlbox
/pre-compile
221 dom
/media
/target-objects dom
/media
/mediasink
/target-objects
: media
/libsoundtouch
/src
/pre-compile
224 # Most things are built during compile (target/host), but some things happen during export
225 # Those need to depend on config/export for system wrappers.
226 $(addprefix build
/unix
/stdc
++compat
/,target host
) build
/clang-plugin
/host
: config
/export
228 # Rust targets, and export targets that run cbindgen need
229 # $topobjdir/.cargo/config to be preprocessed first. Ideally, we'd only set it
230 # as a dependency of the rust targets, but unfortunately, that pushes Make to
231 # execute them much later than we'd like them to be when the file doesn't exist
232 # prior to Make running. So we also set it as a dependency of pre-export, which
233 # ensures it exists before recursing the rust targets and the export targets
234 # that run cbindgen, tricking Make into keeping them early.
235 $(rust_targets
): $(DEPTH
)/.cargo
/config
237 pre-export
:: $(DEPTH
)/.cargo
/config
240 # When building gtest as part of the build (LINK_GTEST_DURING_COMPILE),
241 # force the build system to get to it first, so that it can be linked
242 # quickly without LTO, allowing the build system to go ahead with
243 # plain gkrust and libxul while libxul-gtest is being linked and
245 ifneq (,$(filter toolkit
/library
/gtest
/rust
/target-objects
,$(compile_targets
)))
246 toolkit
/library
/rust
/target-objects
: toolkit
/library
/gtest
/rust
/target-objects