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)),)
218 $$(info Building configuration '$$(matching_conf)' (matching CONF_NAME=$$(CONF_NAME)))
219 endif
220 # Create a SPEC definition. This will contain the path to exactly one spec file.
221 SPECS := $$(build_dir)/$$(matching_conf)/spec.gmk
222 else ifneq ($$(origin CONF), undefined)
223 # User have given a CONF= argument.
224 ifeq ($$(CONF),)
225 # If given CONF=, match all configurations
226 matching_confs := $$(strip $$(all_confs))
227 else
228 # Otherwise select those that contain the given CONF string
229 matching_confs := $$(strip $$(foreach var, $$(all_confs), \
230 $$(if $$(findstring $$(CONF), $$(var)), $$(var))))
231 endif
232 ifeq ($$(matching_confs),)
233 $$(info Error: No configurations found matching CONF=$$(CONF).)
234 $$(info Available configurations in $$(build_dir):)
235 $$(foreach var, $$(all_confs), $$(info * $$(var)))
236 $$(error Cannot continue)
237 else
238 ifeq ($$(words $$(matching_confs)), 1)
239 $$(info Building configuration '$$(matching_confs)' (matching CONF=$$(CONF)))
240 else
241 $$(info Building these configurations (matching CONF=$$(CONF)):)
242 $$(foreach var, $$(matching_confs), $$(info * $$(var)))
243 endif
244 endif
245
246 # Create a SPEC definition. This will contain the path to one or more spec.gmk files.
247 SPECS := $$(addsuffix /spec.gmk, $$(addprefix $$(build_dir)/, $$(matching_confs)))
248 else
249 # No CONF or SPEC given, check the available configurations
250 ifneq ($$(words $$(all_spec_files)), 1)
251 $$(info Error: No CONF given, but more than one configuration found.)
252 $$(info Available configurations in $$(build_dir):)
253 $$(foreach var, $$(all_confs), $$(info * $$(var)))
254 $$(info Please retry building with CONF=<config pattern> (or SPEC=<spec file>).)
255 $$(info )
256 $$(error Cannot continue)
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)),)
218 $$(info Building configuration '$$(matching_conf)' (matching CONF_NAME=$$(CONF_NAME)))
219 endif
220 # Create a SPEC definition. This will contain the path to exactly one spec file.
221 SPECS := $$(build_dir)/$$(matching_conf)/spec.gmk
222 else ifneq ($$(origin CONF), undefined)
223 # User have given a CONF= argument.
224 ifeq ($$(CONF),)
225 # If given CONF=, match all configurations
226 matching_confs := $$(strip $$(all_confs))
227 else
228 # Otherwise select those that contain the given CONF string
229 matching_confs := $$(strip $$(foreach var, $$(all_confs), \
230 $$(if $$(findstring $$(CONF), $$(var)), $$(var))))
231 endif
232 ifeq ($$(matching_confs),)
233 $$(info Error: No configurations found matching CONF=$$(CONF).)
234 $$(info Available configurations in $$(build_dir):)
235 $$(foreach var, $$(all_confs), $$(info * $$(var)))
236 $$(error Cannot continue)
237 else
238 # Don't repeat this output on make restarts caused by including
239 # generated files.
240 ifeq ($$(MAKE_RESTARTS),)
241 ifeq ($$(words $$(matching_confs)), 1)
242 $$(info Building configuration '$$(matching_confs)' (matching CONF=$$(CONF)))
243 else
244 $$(info Building these configurations (matching CONF=$$(CONF)):)
245 $$(foreach var, $$(matching_confs), $$(info * $$(var)))
246 endif
247 endif
248 endif
249
250 # Create a SPEC definition. This will contain the path to one or more spec.gmk files.
251 SPECS := $$(addsuffix /spec.gmk, $$(addprefix $$(build_dir)/, $$(matching_confs)))
252 else
253 # No CONF or SPEC given, check the available configurations
254 ifneq ($$(words $$(all_spec_files)), 1)
255 $$(info Error: No CONF given, but more than one configuration found.)
256 $$(info Available configurations in $$(build_dir):)
257 $$(foreach var, $$(all_confs), $$(info * $$(var)))
258 $$(info Please retry building with CONF=<config pattern> (or SPEC=<spec file>).)
259 $$(info )
260 $$(error Cannot continue)
261 endif
262
263 # We found exactly one configuration, use it
264 SPECS := $$(strip $$(all_spec_files))
265 endif
266 endif
267 endef
268
269 # Param 1: SPEC file to use
270 define GenerateModuleDeps
271 ( cd $(topdir) && \
272 $(MAKE) $(MAKE_LOG_FLAGS) -r -R -f $(topdir)/make/GenerateModuleDeps.gmk \
273 -I $(topdir)/make/common SPEC=$(strip $1) LOG_LEVEL=$(LOG_LEVEL) )
274 endef
275
276 # Extract main targets from Main.gmk using the spec provided in $2.
277 #
278 # Param 1: FORCE = force generation of main-targets.gmk or LAZY = do not force.
279 # Param 2: The SPEC file to use.
280 define DefineMainTargets
281
282 # We will start by making sure the main-targets.gmk file is removed, if
283 # make has not been restarted. By the -include, we will trigger the
284 # rule for generating the file (which is never there since we removed it),
285 # thus generating it fresh, and make will restart, incrementing the restart
286 # count.
287 main_targets_file := $$(dir $(strip $2))make-support/main-targets.gmk
288 module_deps_file := $$(dir $(strip $2))make-support/module-deps.gmk
289
290 ifeq ($$(MAKE_RESTARTS),)
291 # Only do this if make has not been restarted, and if we do not force it.
292 ifeq ($(strip $1), FORCE)
293 $$(shell rm -f $$(main_targets_file) $$(module_deps_file))
294 endif
295 endif
296
297 $$(module_deps_file):
298 @$$(call GenerateModuleDeps, $2)
299
300 $$(main_targets_file): $$(module_deps_file)
301 @( cd $$(topdir) && \
302 $$(MAKE) $$(MAKE_LOG_FLAGS) -r -R -f $$(topdir)/make/Main.gmk \
303 -I $$(topdir)/make/common SPEC=$(strip $2) NO_RECIPES=true \
304 LOG_LEVEL=$$(LOG_LEVEL) \
305 create-main-targets-include )
306
307 # Now include main-targets.gmk. This will define ALL_MAIN_TARGETS.
308 -include $$(main_targets_file)
309 endef
310
311 define PrintConfCheckFailed
312 @echo ' '
313 @echo "Please rerun configure! Easiest way to do this is by running"
314 @echo "'make reconfigure'."
315 @echo "This behavior may also be changed using CONF_CHECK=<ignore|auto>."
316 @echo ' '
317 endef
318
319 else # $(HAS_SPEC)=true
320 ##############################################################################
321 # Helper functions for the 'main' target. These functions assume a single,
322 # proper and existing SPEC is included.
323 ##############################################################################
324
325 include $(SRC_ROOT)/make/common/MakeBase.gmk
326
327 # Define basic logging setup
328 BUILD_LOG := $(OUTPUT_ROOT)/build.log
329 BUILD_TRACE_LOG := $(OUTPUT_ROOT)/build-trace-time.log
330
331 BUILD_LOG_PIPE := > >($(TEE) -a $(BUILD_LOG)) 2> >($(TEE) -a $(BUILD_LOG) >&2)
332
333 # Sanity check the spec file, so it matches this source code
334 define CheckSpecSanity
335 ifneq ($$(ACTUAL_TOPDIR), $$(TOPDIR))
336 ifneq ($$(ACTUAL_TOPDIR), $$(ORIGINAL_TOPDIR))
337 ifneq ($$(ACTUAL_TOPDIR), $$(CANONICAL_TOPDIR))
338 $$(info Error: SPEC mismatch! Current working directory)
339 $$(info $$(ACTUAL_TOPDIR))
340 $$(info does not match either TOPDIR, ORIGINAL_TOPDIR or CANONICAL_TOPDIR)
341 $$(info $$(TOPDIR))
342 $$(info $$(ORIGINAL_TOPDIR))
343 $$(info $$(CANONICAL_TOPDIR))
344 $$(error Cannot continue)
345 endif
346 endif
347 endif
348 endef
349
350 # Parse COMPARE_BUILD into COMPARE_BUILD_*
351 # Syntax: COMPARE_BUILD=CONF=<configure options>:PATCH=<patch file>:
453 $(PRINTF) "* For target $(notdir $(basename $(logfile))):\n" $(NEWLINE) \
454 $(CAT) $(logfile) | $(GREP) -v -e "^Note: including file:" $(NEWLINE) \
455 ) \
456 $(PRINTF) "=== End of repeated output ===\n" \
457 )
458 endef
459
460 define PrintBuildLogFailures
461 if $(GREP) -q "recipe for target .* failed" $(BUILD_LOG) 2> /dev/null; then \
462 $(PRINTF) "=== Make failure sequence repeated here ===\n" ; \
463 $(GREP) "recipe for target .* failed" $(BUILD_LOG) ; \
464 $(PRINTF) "=== End of repeated output ===\n" ; \
465 $(PRINTF) "Hint: Try searching the build log for the name of the first failed target.\n" ; \
466 else \
467 $(PRINTF) "No indication of failed target found.\n" ; \
468 $(PRINTF) "Hint: Try searching the build log for '] Error'.\n" ; \
469 fi
470 endef
471
472 define RotateLogFiles
473 $(RM) $(BUILD_LOG).old 2> /dev/null && \
474 $(MV) $(BUILD_LOG) $(BUILD_LOG).old 2> /dev/null || true
475 $(if $(findstring trace, $(LOG_LEVEL)), \
476 $(RM) $(BUILD_TRACE_LOG).old 2> /dev/null && \
477 $(MV) $(BUILD_TRACE_LOG) $(BUILD_TRACE_LOG).old 2> /dev/null || true \
478 )
479 endef
480
481 define PrepareFailureLogs
482 $(RM) -r $(MAKESUPPORT_OUTPUTDIR)/failure-logs 2> /dev/null && \
483 $(MKDIR) -p $(MAKESUPPORT_OUTPUTDIR)/failure-logs
484 endef
485
486 # Remove any javac server logs and port files. This
487 # prevents a new make run to reuse the previous servers.
488 define PrepareSmartJavac
489 $(if $(SJAVAC_SERVER_DIR), \
490 $(RM) -r $(SJAVAC_SERVER_DIR) 2> /dev/null && \
491 $(MKDIR) -p $(SJAVAC_SERVER_DIR) \
492 )
493 endef
494
495 define CleanupSmartJavac
496 [ -f $(SJAVAC_SERVER_DIR)/server.port ] && $(ECHO) Stopping sjavac server && \
497 $(TOUCH) $(SJAVAC_SERVER_DIR)/server.port.stop; true
498 endef
499
500 define StartGlobalTimer
501 $(RM) -r $(BUILDTIMESDIR) 2> /dev/null && \
502 $(MKDIR) -p $(BUILDTIMESDIR) && \
503 $(call RecordStartTime,TOTAL)
504 endef
505
506 define StopGlobalTimer
507 $(call RecordEndTime,TOTAL)
508 endef
509
510 # Find all build_time_* files and print their contents in a list sorted
511 # on the name of the sub repository.
512 define ReportBuildTimes
513 $(PRINTF) $(LOG_INFO) -- \
514 "----- Build times -------\nStart %s\nEnd %s\n%s\n%s\n-------------------------\n" \
515 "`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \
516 "`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \
517 "`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | \
518 $(XARGS) $(CAT) | $(SORT) -k 2`" \
519 "`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`" \
520 $(BUILD_LOG_PIPE)
521 endef
522
523 endif # HAS_SPEC
524
525 endif # _INITSUPPORT_GMK
|