client.mk 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. # -*- makefile -*-
  2. # vim:set ts=8 sw=8 sts=8 noet:
  3. # This Source Code Form is subject to the terms of the Mozilla Public
  4. # License, v. 2.0. If a copy of the MPL was not distributed with this
  5. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6. # Build a mozilla application.
  7. #
  8. # To build a tree,
  9. # 1. hg clone ssh://hg.mozilla.org/mozilla-central mozilla
  10. # 2. cd mozilla
  11. # 3. create your .mozconfig file with
  12. # ac_add_options --enable-application=browser
  13. # 4. gmake -f client.mk
  14. #
  15. # Other targets (gmake -f client.mk [targets...]),
  16. # build
  17. # clean (realclean is now the same as clean)
  18. # distclean
  19. #
  20. # See http://developer.mozilla.org/en/docs/Build_Documentation for
  21. # more information.
  22. #
  23. # Options:
  24. # MOZ_BUILD_PROJECTS - Build multiple projects in subdirectories
  25. # of MOZ_OBJDIR
  26. # MOZ_OBJDIR - Destination object directory
  27. # MOZ_MAKE_FLAGS - Flags to pass to $(MAKE)
  28. # MOZ_PREFLIGHT_ALL } - Makefiles to run before any project in
  29. # MOZ_PREFLIGHT } MOZ_BUILD_PROJECTS, before each project, after
  30. # MOZ_POSTFLIGHT } each project, and after all projects; these
  31. # MOZ_POSTFLIGHT_ALL } variables contain space-separated lists
  32. # MOZ_UNIFY_BDATE - Set to use the same bdate for each project in
  33. # MOZ_BUILD_PROJECTS
  34. #
  35. #######################################################################
  36. # Defines
  37. comma := ,
  38. ifdef MACH
  39. ifndef NO_BUILDSTATUS_MESSAGES
  40. define BUILDSTATUS
  41. @echo 'BUILDSTATUS $1'
  42. endef
  43. endif
  44. endif
  45. CWD := $(CURDIR)
  46. ifneq (1,$(words $(CWD)))
  47. $(error The mozilla directory cannot be located in a path with spaces.)
  48. endif
  49. ifeq "$(CWD)" "/"
  50. CWD := /.
  51. endif
  52. ifndef TOPSRCDIR
  53. ifeq (,$(wildcard client.mk))
  54. TOPSRCDIR := $(patsubst %/,%,$(dir $(MAKEFILE_LIST)))
  55. else
  56. TOPSRCDIR := $(CWD)
  57. endif
  58. endif
  59. SH := /bin/sh
  60. PERL ?= perl
  61. PYTHON ?= $(shell which python2.7 > /dev/null 2>&1 && echo python2.7 || echo python)
  62. CONFIG_GUESS_SCRIPT := $(wildcard $(TOPSRCDIR)/build/autoconf/config.guess)
  63. ifdef CONFIG_GUESS_SCRIPT
  64. CONFIG_GUESS := $(shell $(CONFIG_GUESS_SCRIPT))
  65. endif
  66. ####################################
  67. # Sanity checks
  68. # Windows checks.
  69. ifneq (,$(findstring mingw,$(CONFIG_GUESS)))
  70. # check for CRLF line endings
  71. ifneq (0,$(shell $(PERL) -e 'binmode(STDIN); while (<STDIN>) { if (/\r/) { print "1"; exit } } print "0"' < $(TOPSRCDIR)/client.mk))
  72. $(error This source tree appears to have Windows-style line endings. To \
  73. convert it to Unix-style line endings, check \
  74. "https://developer.mozilla.org/en-US/docs/Developer_Guide/Mozilla_build_FAQ\#Win32-specific_questions" \
  75. for a workaround of this issue.)
  76. endif
  77. # Set this for baseconfig.mk
  78. HOST_OS_ARCH=WINNT
  79. endif
  80. ####################################
  81. # Load mozconfig Options
  82. # See build pages, http://www.mozilla.org/build/ for how to set up mozconfig.
  83. define CR
  84. endef
  85. # As $(shell) doesn't preserve newlines, use sed to replace them with an
  86. # unlikely sequence (||), which is then replaced back to newlines by make
  87. # before evaluation. $(shell) replacing newlines with spaces, || is always
  88. # followed by a space (since sed doesn't remove newlines), except on the
  89. # last line, so replace both '|| ' and '||'.
  90. # Also, make MOZ_PGO available to mozconfig when passed on make command line.
  91. # Likewise for MOZ_CURRENT_PROJECT.
  92. MOZCONFIG_CONTENT := $(subst ||,$(CR),$(subst || ,$(CR),$(shell $(addprefix MOZ_CURRENT_PROJECT=,$(MOZ_CURRENT_PROJECT)) MOZ_PGO=$(MOZ_PGO) $(TOPSRCDIR)/mach environment --format=client.mk | sed 's/$$/||/')))
  93. $(eval $(MOZCONFIG_CONTENT))
  94. export FOUND_MOZCONFIG
  95. # As '||' was used as a newline separator, it means it's not occurring in
  96. # lines themselves. It can thus safely be used to replaces normal spaces,
  97. # to then replace newlines with normal spaces. This allows to get a list
  98. # of mozconfig output lines.
  99. MOZCONFIG_OUT_LINES := $(subst $(CR), ,$(subst $(NULL) $(NULL),||,$(MOZCONFIG_CONTENT)))
  100. # Filter-out comments from those lines.
  101. START_COMMENT = \#
  102. MOZCONFIG_OUT_FILTERED := $(filter-out $(START_COMMENT)%,$(MOZCONFIG_OUT_LINES))
  103. ifdef AUTOCLOBBER
  104. export AUTOCLOBBER=1
  105. endif
  106. ifdef MOZ_PGO
  107. export MOZ_PGO
  108. endif
  109. ifdef MOZ_PARALLEL_BUILD
  110. MOZ_MAKE_FLAGS := $(filter-out -j%,$(MOZ_MAKE_FLAGS))
  111. MOZ_MAKE_FLAGS += -j$(MOZ_PARALLEL_BUILD)
  112. endif
  113. # Automatically add -jN to make flags if not defined. N defaults to number of cores.
  114. ifeq (,$(findstring -j,$(MOZ_MAKE_FLAGS)))
  115. cores=$(shell $(PYTHON) -c 'import multiprocessing; print(multiprocessing.cpu_count())')
  116. MOZ_MAKE_FLAGS += -j$(cores)
  117. endif
  118. ifdef MOZ_BUILD_PROJECTS
  119. ifdef MOZ_CURRENT_PROJECT
  120. BUILD_PROJECT_ARG = MOZ_BUILD_APP=$(MOZ_CURRENT_PROJECT)
  121. export MOZ_CURRENT_PROJECT
  122. else
  123. MOZ_MAKE = $(error Cannot build in the OBJDIR when MOZ_CURRENT_PROJECT is not set.)
  124. endif
  125. endif # MOZ_BUILD_PROJECTS
  126. MOZ_MAKE = $(MAKE) $(MOZ_MAKE_FLAGS) -C $(OBJDIR)
  127. # 'configure' scripts generated by autoconf.
  128. CONFIGURES := $(TOPSRCDIR)/configure
  129. CONFIGURES += $(TOPSRCDIR)/js/src/configure
  130. # Make targets that are going to be passed to the real build system
  131. OBJDIR_TARGETS = install export libs clean realclean distclean maybe_clobber_profiledbuild upload sdk installer package package-compare stage-package source-package l10n-check automation/build
  132. #######################################################################
  133. # Rules
  134. # The default rule is build
  135. build::
  136. $(MAKE) -f $(TOPSRCDIR)/client.mk $(if $(MOZ_PGO),profiledbuild,realbuild) CREATE_MOZCONFIG_JSON=
  137. # Include baseconfig.mk for its $(MAKE) validation.
  138. include $(TOPSRCDIR)/config/baseconfig.mk
  139. # Define mkdir
  140. include $(TOPSRCDIR)/config/makefiles/makeutils.mk
  141. include $(TOPSRCDIR)/config/makefiles/autotargets.mk
  142. # Create a makefile containing the mk_add_options values from mozconfig,
  143. # but only do so when OBJDIR is defined (see further above).
  144. ifdef MOZ_BUILD_PROJECTS
  145. ifdef MOZ_CURRENT_PROJECT
  146. WANT_MOZCONFIG_MK = 1
  147. else
  148. WANT_MOZCONFIG_MK =
  149. endif
  150. else
  151. WANT_MOZCONFIG_MK = 1
  152. endif
  153. ifdef WANT_MOZCONFIG_MK
  154. # For now, only output "export" lines and lines containing UPLOAD_EXTRA_FILES
  155. # from mach environment --format=client.mk output.
  156. MOZCONFIG_MK_LINES := $(filter export||% UPLOAD_EXTRA_FILES% %UPLOAD_EXTRA_FILES%,$(MOZCONFIG_OUT_LINES))
  157. $(OBJDIR)/.mozconfig.mk: $(TOPSRCDIR)/client.mk $(FOUND_MOZCONFIG) $(call mkdir_deps,$(OBJDIR)) $(OBJDIR)/CLOBBER
  158. $(if $(MOZCONFIG_MK_LINES),( $(foreach line,$(MOZCONFIG_MK_LINES), echo '$(subst ||, ,$(line))';) )) > $@
  159. ifdef MOZ_CURRENT_PROJECT
  160. echo export MOZ_CURRENT_PROJECT=$(MOZ_CURRENT_PROJECT) >> $@
  161. endif
  162. # Include that makefile so that it is created. This should not actually change
  163. # the environment since MOZCONFIG_CONTENT, which MOZCONFIG_OUT_LINES derives
  164. # from, has already been eval'ed.
  165. include $(OBJDIR)/.mozconfig.mk
  166. endif
  167. # Print out any options loaded from mozconfig.
  168. all realbuild clean distclean export libs install realclean::
  169. ifneq (,$(strip $(MOZCONFIG_OUT_FILTERED)))
  170. $(info Adding client.mk options from $(FOUND_MOZCONFIG):)
  171. $(foreach line,$(MOZCONFIG_OUT_FILTERED),$(info $(NULL) $(NULL) $(NULL) $(NULL) $(subst ||, ,$(line))))
  172. endif
  173. # Windows equivalents
  174. build_all: build
  175. clobber clobber_all: clean
  176. # helper target for mobile
  177. build_and_deploy: build package install
  178. # Do everything from scratch
  179. everything: clean build
  180. ####################################
  181. # Profile-Guided Optimization
  182. # This is up here, outside of the MOZ_CURRENT_PROJECT logic so that this
  183. # is usable in multi-pass builds, where you might not have a runnable
  184. # application until all the build passes and postflight scripts have run.
  185. profiledbuild::
  186. $(call BUILDSTATUS,TIERS pgo_profile_generate pgo_package pgo_profile pgo_clobber pgo_profile_use)
  187. $(call BUILDSTATUS,TIER_START pgo_profile_generate)
  188. $(MAKE) -f $(TOPSRCDIR)/client.mk realbuild MOZ_PROFILE_GENERATE=1 MOZ_PGO_INSTRUMENTED=1 CREATE_MOZCONFIG_JSON=
  189. $(call BUILDSTATUS,TIER_FINISH pgo_profile_generate)
  190. $(call BUILDSTATUS,TIER_START pgo_package)
  191. $(MAKE) -C $(OBJDIR) package MOZ_PGO_INSTRUMENTED=1 MOZ_INTERNAL_SIGNING_FORMAT= MOZ_EXTERNAL_SIGNING_FORMAT=
  192. rm -f $(OBJDIR)/jarlog/en-US.log
  193. $(call BUILDSTATUS,TIER_FINISH pgo_package)
  194. $(call BUILDSTATUS,TIER_START pgo_profile)
  195. MOZ_PGO_INSTRUMENTED=1 JARLOG_FILE=jarlog/en-US.log EXTRA_TEST_ARGS=10 $(MAKE) -C $(OBJDIR) pgo-profile-run
  196. $(call BUILDSTATUS,TIER_FINISH pgo_profile)
  197. $(call BUILDSTATUS,TIER_START pgo_clobber)
  198. $(MAKE) -f $(TOPSRCDIR)/client.mk maybe_clobber_profiledbuild CREATE_MOZCONFIG_JSON=
  199. $(call BUILDSTATUS,TIER_FINISH pgo_clobber)
  200. $(call BUILDSTATUS,TIER_START pgo_profile_use)
  201. $(MAKE) -f $(TOPSRCDIR)/client.mk realbuild MOZ_PROFILE_USE=1 CREATE_MOZCONFIG_JSON=
  202. $(call BUILDSTATUS,TIER_FINISH pgo_profile_use)
  203. #####################################################
  204. # Build date unification
  205. ifdef MOZ_UNIFY_BDATE
  206. ifndef MOZ_BUILD_DATE
  207. ifdef MOZ_BUILD_PROJECTS
  208. MOZ_BUILD_DATE = $(shell $(PYTHON) $(TOPSRCDIR)/build/variables.py buildid_header | awk '{print $$3}')
  209. export MOZ_BUILD_DATE
  210. endif
  211. endif
  212. endif
  213. #####################################################
  214. # Preflight, before building any project
  215. realbuild preflight_all::
  216. ifeq (,$(MOZ_CURRENT_PROJECT)$(if $(MOZ_PREFLIGHT_ALL),,1))
  217. # Don't run preflight_all for individual projects in multi-project builds
  218. # (when MOZ_CURRENT_PROJECT is set.)
  219. ifndef MOZ_BUILD_PROJECTS
  220. # Building a single project, OBJDIR is usable.
  221. set -e; \
  222. for mkfile in $(MOZ_PREFLIGHT_ALL); do \
  223. $(MAKE) -f $(TOPSRCDIR)/$$mkfile preflight_all TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
  224. done
  225. else
  226. # OBJDIR refers to the project-specific OBJDIR, which is not available at
  227. # this point when building multiple projects. Only MOZ_OBJDIR is available.
  228. set -e; \
  229. for mkfile in $(MOZ_PREFLIGHT_ALL); do \
  230. $(MAKE) -f $(TOPSRCDIR)/$$mkfile preflight_all TOPSRCDIR=$(TOPSRCDIR) MOZ_OBJDIR=$(MOZ_OBJDIR) MOZ_BUILD_PROJECTS='$(MOZ_BUILD_PROJECTS)'; \
  231. done
  232. endif
  233. endif
  234. # If we're building multiple projects, but haven't specified which project,
  235. # loop through them.
  236. ifeq (,$(MOZ_CURRENT_PROJECT)$(if $(MOZ_BUILD_PROJECTS),,1))
  237. configure realbuild preflight postflight $(OBJDIR_TARGETS)::
  238. set -e; \
  239. for app in $(MOZ_BUILD_PROJECTS); do \
  240. $(MAKE) -f $(TOPSRCDIR)/client.mk $@ MOZ_CURRENT_PROJECT=$$app; \
  241. done
  242. else
  243. # MOZ_CURRENT_PROJECT: either doing a single-project build, or building an
  244. # individual project in a multi-project build.
  245. ####################################
  246. # Configure
  247. MAKEFILE = $(wildcard $(OBJDIR)/Makefile)
  248. CONFIG_STATUS = $(wildcard $(OBJDIR)/config.status)
  249. CONFIG_CACHE = $(wildcard $(OBJDIR)/config.cache)
  250. EXTRA_CONFIG_DEPS := \
  251. $(TOPSRCDIR)/aclocal.m4 \
  252. $(TOPSRCDIR)/old-configure.in \
  253. $(wildcard $(TOPSRCDIR)/build/autoconf/*.m4) \
  254. $(TOPSRCDIR)/js/src/aclocal.m4 \
  255. $(TOPSRCDIR)/js/src/old-configure.in \
  256. $(NULL)
  257. $(CONFIGURES): %: %.in $(EXTRA_CONFIG_DEPS)
  258. @echo Generating $@
  259. cp -f $< $@
  260. chmod +x $@
  261. CONFIG_STATUS_DEPS := \
  262. $(wildcard $(TOPSRCDIR)/*/confvars.sh) \
  263. $(wildcard $(TOPSRCDIR)/application/*/confvars.sh) \
  264. $(CONFIGURES) \
  265. $(TOPSRCDIR)/CLOBBER \
  266. $(TOPSRCDIR)/nsprpub/configure \
  267. $(TOPSRCDIR)/config/milestone.txt \
  268. $(TOPSRCDIR)/build/virtualenv_packages.txt \
  269. $(TOPSRCDIR)/python/mozbuild/mozbuild/virtualenv.py \
  270. $(TOPSRCDIR)/testing/mozbase/packages.txt \
  271. $(OBJDIR)/.mozconfig.json \
  272. $(NULL)
  273. CONFIGURE_ENV_ARGS += \
  274. MAKE='$(MAKE)' \
  275. $(NULL)
  276. # configure uses the program name to determine @srcdir@. Calling it without
  277. # $(TOPSRCDIR) will set @srcdir@ to "."; otherwise, it is set to the full
  278. # path of $(TOPSRCDIR).
  279. ifeq ($(TOPSRCDIR),$(OBJDIR))
  280. CONFIGURE = ./configure
  281. else
  282. CONFIGURE = $(TOPSRCDIR)/configure
  283. endif
  284. $(OBJDIR)/CLOBBER: $(TOPSRCDIR)/CLOBBER
  285. $(PYTHON) $(TOPSRCDIR)/config/pythonpath.py -I $(TOPSRCDIR)/testing/mozbase/mozfile \
  286. $(TOPSRCDIR)/python/mozbuild/mozbuild/controller/clobber.py $(TOPSRCDIR) $(OBJDIR)
  287. configure-files: $(CONFIGURES)
  288. configure-preqs = \
  289. $(OBJDIR)/CLOBBER \
  290. configure-files \
  291. $(call mkdir_deps,$(OBJDIR)) \
  292. $(if $(MOZ_BUILD_PROJECTS),$(call mkdir_deps,$(MOZ_OBJDIR))) \
  293. save-mozconfig \
  294. $(OBJDIR)/.mozconfig.json \
  295. $(NULL)
  296. CREATE_MOZCONFIG_JSON = $(shell $(TOPSRCDIR)/mach environment --format=json -o $(OBJDIR)/.mozconfig.json)
  297. # Force CREATE_MOZCONFIG_JSON above to be resolved, without side effects in
  298. # case the result is non empty, and allowing an override on the make command
  299. # line not running the command (using := $(shell) still runs the shell command).
  300. ifneq (,$(CREATE_MOZCONFIG_JSON))
  301. endif
  302. $(OBJDIR)/.mozconfig.json: $(call mkdir_deps,$(OBJDIR)) ;
  303. save-mozconfig: $(FOUND_MOZCONFIG)
  304. ifdef FOUND_MOZCONFIG
  305. -cp $(FOUND_MOZCONFIG) $(OBJDIR)/.mozconfig
  306. endif
  307. configure:: $(configure-preqs)
  308. $(call BUILDSTATUS,TIERS configure)
  309. $(call BUILDSTATUS,TIER_START configure)
  310. @echo cd $(OBJDIR);
  311. @echo $(CONFIGURE) $(CONFIGURE_ARGS)
  312. @cd $(OBJDIR) && $(BUILD_PROJECT_ARG) $(CONFIGURE_ENV_ARGS) $(CONFIGURE) $(CONFIGURE_ARGS) \
  313. || ( echo '*** Fix above errors and then restart with\
  314. "$(MAKE) -f client.mk build"' && exit 1 )
  315. @touch $(OBJDIR)/Makefile
  316. $(call BUILDSTATUS,TIER_FINISH configure)
  317. ifneq (,$(MAKEFILE))
  318. $(OBJDIR)/Makefile: $(OBJDIR)/config.status
  319. $(OBJDIR)/config.status: $(CONFIG_STATUS_DEPS)
  320. else
  321. $(OBJDIR)/Makefile: $(CONFIG_STATUS_DEPS)
  322. endif
  323. @$(MAKE) -f $(TOPSRCDIR)/client.mk configure CREATE_MOZCONFIG_JSON=
  324. ifneq (,$(CONFIG_STATUS))
  325. $(OBJDIR)/config/autoconf.mk: $(TOPSRCDIR)/config/autoconf.mk.in
  326. $(PYTHON) $(OBJDIR)/config.status -n --file=$(OBJDIR)/config/autoconf.mk
  327. endif
  328. ####################################
  329. # Preflight
  330. realbuild preflight::
  331. ifdef MOZ_PREFLIGHT
  332. set -e; \
  333. for mkfile in $(MOZ_PREFLIGHT); do \
  334. $(MAKE) -f $(TOPSRCDIR)/$$mkfile preflight TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
  335. done
  336. endif
  337. ####################################
  338. # Build it
  339. realbuild:: $(OBJDIR)/Makefile $(OBJDIR)/config.status
  340. +$(MOZ_MAKE)
  341. ####################################
  342. # Other targets
  343. # Pass these target onto the real build system
  344. $(OBJDIR_TARGETS):: $(OBJDIR)/Makefile $(OBJDIR)/config.status
  345. +$(MOZ_MAKE) $@
  346. ####################################
  347. # Postflight
  348. realbuild postflight::
  349. ifdef MOZ_POSTFLIGHT
  350. set -e; \
  351. for mkfile in $(MOZ_POSTFLIGHT); do \
  352. $(MAKE) -f $(TOPSRCDIR)/$$mkfile postflight TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
  353. done
  354. endif
  355. endif # MOZ_CURRENT_PROJECT
  356. ####################################
  357. # Postflight, after building all projects
  358. ifdef MOZ_AUTOMATION
  359. ifndef MOZ_CURRENT_PROJECT
  360. $(if $(MOZ_PGO),profiledbuild,realbuild)::
  361. # Only run the automation/build target for the first project.
  362. # (i.e. first platform of universal builds)
  363. $(MAKE) -f $(TOPSRCDIR)/client.mk automation/build $(addprefix MOZ_CURRENT_PROJECT=,$(firstword $(MOZ_BUILD_PROJECTS)))
  364. endif
  365. endif
  366. realbuild postflight_all::
  367. ifeq (,$(MOZ_CURRENT_PROJECT)$(if $(MOZ_POSTFLIGHT_ALL),,1))
  368. # Don't run postflight_all for individual projects in multi-project builds
  369. # (when MOZ_CURRENT_PROJECT is set.)
  370. ifndef MOZ_BUILD_PROJECTS
  371. # Building a single project, OBJDIR is usable.
  372. set -e; \
  373. for mkfile in $(MOZ_POSTFLIGHT_ALL); do \
  374. $(MAKE) -f $(TOPSRCDIR)/$$mkfile postflight_all TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
  375. done
  376. else
  377. # OBJDIR refers to the project-specific OBJDIR, which is not available at
  378. # this point when building multiple projects. Only MOZ_OBJDIR is available.
  379. set -e; \
  380. for mkfile in $(MOZ_POSTFLIGHT_ALL); do \
  381. $(MAKE) -f $(TOPSRCDIR)/$$mkfile postflight_all TOPSRCDIR=$(TOPSRCDIR) MOZ_OBJDIR=$(MOZ_OBJDIR) MOZ_BUILD_PROJECTS='$(MOZ_BUILD_PROJECTS)'; \
  382. done
  383. endif
  384. endif
  385. echo-variable-%:
  386. @echo $($*)
  387. # This makefile doesn't support parallel execution. It does pass
  388. # MOZ_MAKE_FLAGS to sub-make processes, so they will correctly execute
  389. # in parallel.
  390. .NOTPARALLEL:
  391. .PHONY: checkout \
  392. real_checkout \
  393. realbuild \
  394. build \
  395. profiledbuild \
  396. pull_all \
  397. build_all \
  398. clobber \
  399. clobber_all \
  400. pull_and_build_all \
  401. everything \
  402. configure \
  403. preflight_all \
  404. preflight \
  405. postflight \
  406. postflight_all \
  407. $(OBJDIR_TARGETS)