138 # First try to remove ",nofile" if it exists, otherwise just remove "nofile"
139 LOG_STRIPPED := $$(subst nofile,, $$(subst $$(COMMA)nofile,, $$(LOG)))
140 # We might have ended up with a leading comma. Remove it
141 LOG_LEVEL := $$(strip $$(patsubst $$(COMMA)%, %, $$(LOG_STRIPPED)))
142 else
143 LOG_LEVEL := $$(LOG)
144 endif
145
146 ifeq ($$(LOG_LEVEL),)
147 # Set LOG to "warn" as default if not set
148 LOG_LEVEL := warn
149 endif
150
151 ifeq ($$(LOG_LEVEL), warn)
152 MAKE_LOG_FLAGS := -s
153 else ifeq ($$(LOG_LEVEL), info)
154 MAKE_LOG_FLAGS := -s
155 else ifeq ($$(LOG_LEVEL), debug)
156 MAKE_LOG_FLAGS :=
157 else ifeq ($$(LOG_LEVEL), trace)
158 MAKE_LOG_FLAGS := -d
159 else
160 $$(info Error: LOG must be one of: warn, info, debug or trace.)
161 $$(error Cannot continue)
162 endif
163 endef
164
165 define ParseConfAndSpec
166 ifneq ($$(origin SPEC), undefined)
167 # We have been given a SPEC, check that it works out properly
168 ifneq ($$(origin CONF), undefined)
169 # We also have a CONF argument. We can't have both.
170 $$(info Error: Cannot use CONF=$$(CONF) and SPEC=$$(SPEC) at the same time. Choose one.)
171 $$(error Cannot continue)
172 endif
173 ifneq ($$(origin CONF_NAME), undefined)
174 # We also have a CONF_NAME argument. We can't have both.
175 $$(info Error: Cannot use CONF_NAME=$$(CONF_NAME) and SPEC=$$(SPEC) at the same time. Choose one.)
176 $$(error Cannot continue)
177 endif
178 ifeq ($$(wildcard $$(SPEC)),)
257 endif
258
259 # We found exactly one configuration, use it
260 SPECS := $$(strip $$(all_spec_files))
261 endif
262 endif
263 endef
264
265 # Extract main targets from Main.gmk using the spec provided in $2.
266 #
267 # Param 1: FORCE = force generation of main-targets.gmk or LAZY = do not force.
268 # Param 2: The SPEC file to use.
269 define DefineMainTargets
270
271 # We will start by making sure the main-targets.gmk file is removed, if
272 # make has not been restarted. By the -include, we will trigger the
273 # rule for generating the file (which is never there since we removed it),
274 # thus generating it fresh, and make will restart, incrementing the restart
275 # count.
276 main_targets_file := $$(dir $(strip $2))make-support/main-targets.gmk
277
278 ifeq ($$(MAKE_RESTARTS),)
279 # Only do this if make has not been restarted, and if we do not force it.
280 ifeq ($(strip $1), FORCE)
281 $$(shell rm -f $$(main_targets_file))
282 endif
283 endif
284
285 $$(main_targets_file):
286 @( cd $$(topdir) && \
287 $$(MAKE) $$(MAKE_LOG_FLAGS) -r -R -f $$(topdir)/make/Main.gmk \
288 -I $$(topdir)/make/common SPEC=$(strip $2) NO_RECIPES=true \
289 LOG_LEVEL=$$(LOG_LEVEL) \
290 create-main-targets-include )
291
292 # Now include main-targets.gmk. This will define ALL_MAIN_TARGETS.
293 -include $$(main_targets_file)
294 endef
295
296 define PrintConfCheckFailed
297 @echo ' '
298 @echo "Please rerun configure! Easiest way to do this is by running"
299 @echo "'make reconfigure'."
300 @echo "This behavior may also be changed using CONF_CHECK=<ignore|auto>."
301 @echo ' '
302 endef
303
304 else # $(HAS_SPEC)=true
305 ##############################################################################
306 # Helper functions for the 'main' target. These functions assume a single,
307 # proper and existing SPEC is included.
308 ##############################################################################
309
310 include $(SRC_ROOT)/make/common/MakeBase.gmk
311
312 # Define basic logging setup
313 BUILD_LOG := $(OUTPUT_ROOT)/build.log
314 BUILD_TRACE_LOG := $(OUTPUT_ROOT)/build-trace-time.log
315
316 BUILD_LOG_WRAPPER := $(BASH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)
317
318 # Sanity check the spec file, so it matches this source code
319 define CheckSpecSanity
320 ifneq ($$(ACTUAL_TOPDIR), $$(TOPDIR))
321 ifneq ($$(ACTUAL_TOPDIR), $$(ORIGINAL_TOPDIR))
322 ifneq ($$(ACTUAL_TOPDIR), $$(CANONICAL_TOPDIR))
323 $$(info Error: SPEC mismatch! Current working directory)
324 $$(info $$(ACTUAL_TOPDIR))
325 $$(info does not match either TOPDIR, ORIGINAL_TOPDIR or CANONICAL_TOPDIR)
326 $$(info $$(TOPDIR))
327 $$(info $$(ORIGINAL_TOPDIR))
328 $$(info $$(CANONICAL_TOPDIR))
329 $$(error Cannot continue)
330 endif
331 endif
332 endif
333 endef
334
335 # Parse COMPARE_BUILD into COMPARE_BUILD_*
336 # Syntax: COMPARE_BUILD=CONF=<configure options>:PATCH=<patch file>:
438 $(PRINTF) "* For target $(notdir $(basename $(logfile))):\n" $(NEWLINE) \
439 $(CAT) $(logfile) | $(GREP) -v -e "^Note: including file:" $(NEWLINE) \
440 ) \
441 $(PRINTF) "=== End of repeated output ===\n" \
442 )
443 endef
444
445 define PrintBuildLogFailures
446 if $(GREP) -q "recipe for target .* failed" $(BUILD_LOG) 2> /dev/null; then \
447 $(PRINTF) "=== Make failure sequence repeated here ===\n" ; \
448 $(GREP) "recipe for target .* failed" $(BUILD_LOG) ; \
449 $(PRINTF) "=== End of repeated output ===\n" ; \
450 $(PRINTF) "Hint: Try searching the build log for the name of the first failed target.\n" ; \
451 else \
452 $(PRINTF) "No indication of failed target found.\n" ; \
453 $(PRINTF) "Hint: Try searching the build log for '] Error'.\n" ; \
454 fi
455 endef
456
457 define RotateLogFiles
458 $(RM) $(BUILD_LOG).old 2> /dev/null
459 $(MV) $(BUILD_LOG) $(BUILD_LOG).old 2> /dev/null || true
460 $(if $(findstring trace, $(LOG_LEVEL)), \
461 $(RM) $(BUILD_TRACE_LOG).old 2> /dev/null && \
462 $(MV) $(BUILD_TRACE_LOG) $(BUILD_TRACE_LOG).old 2> /dev/null || true \
463 )
464 endef
465
466 define PrepareFailureLogs
467 $(RM) -r $(MAKESUPPORT_OUTPUTDIR)/failure-logs 2> /dev/null
468 $(MKDIR) -p $(MAKESUPPORT_OUTPUTDIR)/failure-logs
469 endef
470
471 # Remove any javac server logs and port files. This
472 # prevents a new make run to reuse the previous servers.
473 define PrepareSmartJavac
474 $(if $(SJAVAC_SERVER_DIR), \
475 $(RM) -r $(SJAVAC_SERVER_DIR) 2> /dev/null && \
476 $(MKDIR) -p $(SJAVAC_SERVER_DIR) \
477 )
478 endef
479
480 define CleanupSmartJavac
481 [ -f $(SJAVAC_SERVER_DIR)/server.port ] && $(ECHO) Stopping sjavac server && \
482 $(TOUCH) $(SJAVAC_SERVER_DIR)/server.port.stop; true
483 endef
484
485 define StartGlobalTimer
486 $(RM) -r $(BUILDTIMESDIR) 2> /dev/null
487 $(MKDIR) -p $(BUILDTIMESDIR)
488 $(call RecordStartTime,TOTAL)
489 endef
490
491 define StopGlobalTimer
492 $(call RecordEndTime,TOTAL)
493 endef
494
495 # Find all build_time_* files and print their contents in a list sorted
496 # on the name of the sub repository.
497 define ReportBuildTimes
498 $(BUILD_LOG_WRAPPER) $(PRINTF) $(LOG_INFO) -- \
499 "----- Build times -------\nStart %s\nEnd %s\n%s\n%s\n-------------------------\n" \
500 "`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \
501 "`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \
502 "`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | \
503 $(XARGS) $(CAT) | $(SORT) -k 2`" \
504 "`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`"
505 endef
506
507 endif # HAS_SPEC
508
509 endif # _INITSUPPORT_GMK
|
138 # First try to remove ",nofile" if it exists, otherwise just remove "nofile"
139 LOG_STRIPPED := $$(subst nofile,, $$(subst $$(COMMA)nofile,, $$(LOG)))
140 # We might have ended up with a leading comma. Remove it
141 LOG_LEVEL := $$(strip $$(patsubst $$(COMMA)%, %, $$(LOG_STRIPPED)))
142 else
143 LOG_LEVEL := $$(LOG)
144 endif
145
146 ifeq ($$(LOG_LEVEL),)
147 # Set LOG to "warn" as default if not set
148 LOG_LEVEL := warn
149 endif
150
151 ifeq ($$(LOG_LEVEL), warn)
152 MAKE_LOG_FLAGS := -s
153 else ifeq ($$(LOG_LEVEL), info)
154 MAKE_LOG_FLAGS := -s
155 else ifeq ($$(LOG_LEVEL), debug)
156 MAKE_LOG_FLAGS :=
157 else ifeq ($$(LOG_LEVEL), trace)
158 MAKE_LOG_FLAGS :=
159 else
160 $$(info Error: LOG must be one of: warn, info, debug or trace.)
161 $$(error Cannot continue)
162 endif
163 endef
164
165 define ParseConfAndSpec
166 ifneq ($$(origin SPEC), undefined)
167 # We have been given a SPEC, check that it works out properly
168 ifneq ($$(origin CONF), undefined)
169 # We also have a CONF argument. We can't have both.
170 $$(info Error: Cannot use CONF=$$(CONF) and SPEC=$$(SPEC) at the same time. Choose one.)
171 $$(error Cannot continue)
172 endif
173 ifneq ($$(origin CONF_NAME), undefined)
174 # We also have a CONF_NAME argument. We can't have both.
175 $$(info Error: Cannot use CONF_NAME=$$(CONF_NAME) and SPEC=$$(SPEC) at the same time. Choose one.)
176 $$(error Cannot continue)
177 endif
178 ifeq ($$(wildcard $$(SPEC)),)
257 endif
258
259 # We found exactly one configuration, use it
260 SPECS := $$(strip $$(all_spec_files))
261 endif
262 endif
263 endef
264
265 # Extract main targets from Main.gmk using the spec provided in $2.
266 #
267 # Param 1: FORCE = force generation of main-targets.gmk or LAZY = do not force.
268 # Param 2: The SPEC file to use.
269 define DefineMainTargets
270
271 # We will start by making sure the main-targets.gmk file is removed, if
272 # make has not been restarted. By the -include, we will trigger the
273 # rule for generating the file (which is never there since we removed it),
274 # thus generating it fresh, and make will restart, incrementing the restart
275 # count.
276 main_targets_file := $$(dir $(strip $2))make-support/main-targets.gmk
277 module_deps_file := $$(dir $(strip $2))make-support/module-deps.gmk
278
279 ifeq ($$(MAKE_RESTARTS),)
280 ifeq ($(strip $1), FORCE)
281 $$(shell rm -f $$(main_targets_file) $$(module_deps_file))
282 endif
283 endif
284
285 $$(module_deps_file):
286 @( cd $$(topdir) && \
287 $$(MAKE) $$(MAKE_LOG_FLAGS) -r -R -f $$(topdir)/make/GenerateModuleDeps.gmk \
288 -I $$(topdir)/make/common SPEC=$(strip $2) LOG_LEVEL=$$(LOG_LEVEL) )
289
290 $$(main_targets_file): $$(module_deps_file)
291 @( cd $$(topdir) && \
292 $$(MAKE) $$(MAKE_LOG_FLAGS) -r -R -f $$(topdir)/make/Main.gmk \
293 -I $$(topdir)/make/common SPEC=$(strip $2) NO_RECIPES=true \
294 LOG_LEVEL=$$(LOG_LEVEL) \
295 create-main-targets-include )
296
297 # Now include main-targets.gmk. This will define ALL_MAIN_TARGETS.
298 -include $$(main_targets_file)
299 endef
300
301 define PrintConfCheckFailed
302 @echo ' '
303 @echo "Please rerun configure! Easiest way to do this is by running"
304 @echo "'make reconfigure'."
305 @echo "This behavior may also be changed using CONF_CHECK=<ignore|auto>."
306 @echo ' '
307 endef
308
309 else # $(HAS_SPEC)=true
310 ##############################################################################
311 # Helper functions for the 'main' target. These functions assume a single,
312 # proper and existing SPEC is included.
313 ##############################################################################
314
315 include $(SRC_ROOT)/make/common/MakeBase.gmk
316
317 # Define basic logging setup
318 BUILD_LOG := $(OUTPUT_ROOT)/build.log
319 BUILD_TRACE_LOG := $(OUTPUT_ROOT)/build-trace-time.log
320
321 BUILD_LOG_PIPE := > >($(TEE) -a $(BUILD_LOG)) 2> >($(TEE) -a $(BUILD_LOG) >&2)
322
323 # Sanity check the spec file, so it matches this source code
324 define CheckSpecSanity
325 ifneq ($$(ACTUAL_TOPDIR), $$(TOPDIR))
326 ifneq ($$(ACTUAL_TOPDIR), $$(ORIGINAL_TOPDIR))
327 ifneq ($$(ACTUAL_TOPDIR), $$(CANONICAL_TOPDIR))
328 $$(info Error: SPEC mismatch! Current working directory)
329 $$(info $$(ACTUAL_TOPDIR))
330 $$(info does not match either TOPDIR, ORIGINAL_TOPDIR or CANONICAL_TOPDIR)
331 $$(info $$(TOPDIR))
332 $$(info $$(ORIGINAL_TOPDIR))
333 $$(info $$(CANONICAL_TOPDIR))
334 $$(error Cannot continue)
335 endif
336 endif
337 endif
338 endef
339
340 # Parse COMPARE_BUILD into COMPARE_BUILD_*
341 # Syntax: COMPARE_BUILD=CONF=<configure options>:PATCH=<patch file>:
443 $(PRINTF) "* For target $(notdir $(basename $(logfile))):\n" $(NEWLINE) \
444 $(CAT) $(logfile) | $(GREP) -v -e "^Note: including file:" $(NEWLINE) \
445 ) \
446 $(PRINTF) "=== End of repeated output ===\n" \
447 )
448 endef
449
450 define PrintBuildLogFailures
451 if $(GREP) -q "recipe for target .* failed" $(BUILD_LOG) 2> /dev/null; then \
452 $(PRINTF) "=== Make failure sequence repeated here ===\n" ; \
453 $(GREP) "recipe for target .* failed" $(BUILD_LOG) ; \
454 $(PRINTF) "=== End of repeated output ===\n" ; \
455 $(PRINTF) "Hint: Try searching the build log for the name of the first failed target.\n" ; \
456 else \
457 $(PRINTF) "No indication of failed target found.\n" ; \
458 $(PRINTF) "Hint: Try searching the build log for '] Error'.\n" ; \
459 fi
460 endef
461
462 define RotateLogFiles
463 $(RM) $(BUILD_LOG).old 2> /dev/null && \
464 $(MV) $(BUILD_LOG) $(BUILD_LOG).old 2> /dev/null || true
465 $(if $(findstring trace, $(LOG_LEVEL)), \
466 $(RM) $(BUILD_TRACE_LOG).old 2> /dev/null && \
467 $(MV) $(BUILD_TRACE_LOG) $(BUILD_TRACE_LOG).old 2> /dev/null || true \
468 )
469 endef
470
471 define PrepareFailureLogs
472 $(RM) -r $(MAKESUPPORT_OUTPUTDIR)/failure-logs 2> /dev/null && \
473 $(MKDIR) -p $(MAKESUPPORT_OUTPUTDIR)/failure-logs
474 endef
475
476 # Remove any javac server logs and port files. This
477 # prevents a new make run to reuse the previous servers.
478 define PrepareSmartJavac
479 $(if $(SJAVAC_SERVER_DIR), \
480 $(RM) -r $(SJAVAC_SERVER_DIR) 2> /dev/null && \
481 $(MKDIR) -p $(SJAVAC_SERVER_DIR) \
482 )
483 endef
484
485 define CleanupSmartJavac
486 [ -f $(SJAVAC_SERVER_DIR)/server.port ] && $(ECHO) Stopping sjavac server && \
487 $(TOUCH) $(SJAVAC_SERVER_DIR)/server.port.stop; true
488 endef
489
490 define StartGlobalTimer
491 $(RM) -r $(BUILDTIMESDIR) 2> /dev/null && \
492 $(MKDIR) -p $(BUILDTIMESDIR) && \
493 $(call RecordStartTime,TOTAL)
494 endef
495
496 define StopGlobalTimer
497 $(call RecordEndTime,TOTAL)
498 endef
499
500 # Find all build_time_* files and print their contents in a list sorted
501 # on the name of the sub repository.
502 define ReportBuildTimes
503 $(PRINTF) $(LOG_INFO) -- \
504 "----- Build times -------\nStart %s\nEnd %s\n%s\n%s\n-------------------------\n" \
505 "`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \
506 "`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \
507 "`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | \
508 $(XARGS) $(CAT) | $(SORT) -k 2`" \
509 "`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`" \
510 $(BUILD_LOG_PIPE)
511 endef
512
513 endif # HAS_SPEC
514
515 endif # _INITSUPPORT_GMK
|