221 include $(SPEC) 222 223 # Our helper functions. 224 include $(TOPDIR)/make/InitSupport.gmk 225 226 # Parse COMPARE_BUILD (for makefile development) 227 $(eval $(call ParseCompareBuild)) 228 229 # If no LOG= was given on command line, but we have a non-standard default 230 # value, use that instead and re-parse log level. 231 ifeq ($(LOG), ) 232 ifneq ($(DEFAULT_LOG), ) 233 override LOG := $(DEFAULT_LOG) 234 $(eval $(call ParseLogLevel)) 235 endif 236 endif 237 238 ifeq ($(LOG_NOFILE), true) 239 # Disable build log if LOG=[level,]nofile was given 240 override BUILD_LOG_PIPE := 241 endif 242 243 ifeq ($(filter dist-clean, $(SEQUENTIAL_TARGETS)), dist-clean) 244 # We can't have a log file if we're about to remove it. 245 override BUILD_LOG_PIPE := 246 endif 247 248 ifeq ($(OUTPUT_SYNC_SUPPORTED), true) 249 OUTPUT_SYNC_FLAG := -O$(OUTPUT_SYNC) 250 endif 251 252 ############################################################################## 253 # Init targets 254 ############################################################################## 255 256 print-modules: 257 ( cd $(TOPDIR) && \ 258 $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ 259 NO_RECIPES=true print-modules ) 260 261 print-targets: 262 ( cd $(TOPDIR) && \ 263 $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ 264 NO_RECIPES=true print-targets ) 265 286 # The main target, for delegating into Main.gmk 287 ############################################################################## 288 289 MAIN_TARGETS := $(SEQUENTIAL_TARGETS) $(PARALLEL_TARGETS) $(COMPARE_BUILD_MAKE) 290 # If building the default target, add what they are to the description. 291 DESCRIPTION_TARGETS := $(strip $(MAIN_TARGETS)) 292 ifeq ($(DESCRIPTION_TARGETS), default) 293 DESCRIPTION_TARGETS += ($(DEFAULT_MAKE_TARGET)) 294 endif 295 TARGET_DESCRIPTION := target$(if $(word 2, $(MAIN_TARGETS)),s) \ 296 '$(strip $(DESCRIPTION_TARGETS))' in configuration '$(CONF_NAME)' 297 298 # MAKEOVERRIDES is automatically set and propagated by Make to sub-Make calls. 299 # We need to clear it of the init-specific variables. The user-specified 300 # variables are explicitly propagated using $(USER_MAKE_VARS). 301 main: MAKEOVERRIDES := 302 303 main: $(INIT_TARGETS) 304 ifneq ($(SEQUENTIAL_TARGETS)$(PARALLEL_TARGETS), ) 305 $(call RotateLogFiles) 306 $(PRINTF) "Building $(TARGET_DESCRIPTION)\n" $(BUILD_LOG_PIPE) 307 ifneq ($(SEQUENTIAL_TARGETS), ) 308 # Don't touch build output dir since we might be cleaning. That 309 # means no log pipe. 310 ( cd $(TOPDIR) && \ 311 $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ 312 $(SEQUENTIAL_TARGETS) ) 313 endif 314 ifneq ($(PARALLEL_TARGETS), ) 315 $(call PrepareFailureLogs) 316 $(call StartGlobalTimer) 317 $(call PrepareSmartJavac) 318 # JOBS will only be empty for a bootcycle-images recursive call 319 # or if specified via a make argument directly. In those cases 320 # treat it as NOT using jobs at all. 321 ( cd $(TOPDIR) && \ 322 $(NICE) $(MAKE) $(MAKE_ARGS) $(OUTPUT_SYNC_FLAG) \ 323 $(if $(JOBS), -j $(JOBS)) \ 324 -f make/Main.gmk $(USER_MAKE_VARS) \ 325 $(PARALLEL_TARGETS) $(COMPARE_BUILD_MAKE) $(BUILD_LOG_PIPE) || \ 326 ( exitcode=$$? && \ 327 $(PRINTF) "\nERROR: Build failed for $(TARGET_DESCRIPTION) (exit code $$exitcode) \n" \ 328 $(BUILD_LOG_PIPE) && \ 329 cd $(TOPDIR) && $(MAKE) $(MAKE_ARGS) -j 1 -f make/Init.gmk \ 330 HAS_SPEC=true on-failure ; \ 331 exit $$exitcode ) ) 332 $(call CleanupSmartJavac) 333 $(call StopGlobalTimer) 334 $(call ReportBuildTimes) 335 endif 336 if test -f $(MAKESUPPORT_OUTPUTDIR)/exit-with-error ; then \ 337 exit 1 ; \ 338 fi 339 $(PRINTF) "Finished building $(TARGET_DESCRIPTION)\n" $(BUILD_LOG_PIPE) 340 $(call ReportProfileTimes) 341 endif 342 343 on-failure: 344 $(call CleanupSmartJavac) 345 $(call StopGlobalTimer) 346 $(call ReportBuildTimes) 347 $(call PrintFailureReports) 348 $(call PrintBuildLogFailures) 349 $(call ReportProfileTimes) 350 $(PRINTF) "Hint: See doc/building.html#troubleshooting for assistance.\n\n" 351 ifneq ($(COMPARE_BUILD), ) 352 $(call CleanupCompareBuild) 353 endif 354 355 # Support targets for COMPARE_BUILD, used for makefile development 356 pre-compare-build: 357 $(call WaitForSmartJavacFinish) 358 $(call PrepareCompareBuild) 359 | 221 include $(SPEC) 222 223 # Our helper functions. 224 include $(TOPDIR)/make/InitSupport.gmk 225 226 # Parse COMPARE_BUILD (for makefile development) 227 $(eval $(call ParseCompareBuild)) 228 229 # If no LOG= was given on command line, but we have a non-standard default 230 # value, use that instead and re-parse log level. 231 ifeq ($(LOG), ) 232 ifneq ($(DEFAULT_LOG), ) 233 override LOG := $(DEFAULT_LOG) 234 $(eval $(call ParseLogLevel)) 235 endif 236 endif 237 238 ifeq ($(LOG_NOFILE), true) 239 # Disable build log if LOG=[level,]nofile was given 240 override BUILD_LOG_PIPE := 241 override BUILD_LOG_PIPE_SIMPLE := 242 endif 243 244 ifeq ($(filter dist-clean, $(SEQUENTIAL_TARGETS)), dist-clean) 245 # We can't have a log file if we're about to remove it. 246 override BUILD_LOG_PIPE := 247 override BUILD_LOG_PIPE_SIMPLE := 248 endif 249 250 ifeq ($(OUTPUT_SYNC_SUPPORTED), true) 251 OUTPUT_SYNC_FLAG := -O$(OUTPUT_SYNC) 252 endif 253 254 ############################################################################## 255 # Init targets 256 ############################################################################## 257 258 print-modules: 259 ( cd $(TOPDIR) && \ 260 $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ 261 NO_RECIPES=true print-modules ) 262 263 print-targets: 264 ( cd $(TOPDIR) && \ 265 $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ 266 NO_RECIPES=true print-targets ) 267 288 # The main target, for delegating into Main.gmk 289 ############################################################################## 290 291 MAIN_TARGETS := $(SEQUENTIAL_TARGETS) $(PARALLEL_TARGETS) $(COMPARE_BUILD_MAKE) 292 # If building the default target, add what they are to the description. 293 DESCRIPTION_TARGETS := $(strip $(MAIN_TARGETS)) 294 ifeq ($(DESCRIPTION_TARGETS), default) 295 DESCRIPTION_TARGETS += ($(DEFAULT_MAKE_TARGET)) 296 endif 297 TARGET_DESCRIPTION := target$(if $(word 2, $(MAIN_TARGETS)),s) \ 298 '$(strip $(DESCRIPTION_TARGETS))' in configuration '$(CONF_NAME)' 299 300 # MAKEOVERRIDES is automatically set and propagated by Make to sub-Make calls. 301 # We need to clear it of the init-specific variables. The user-specified 302 # variables are explicitly propagated using $(USER_MAKE_VARS). 303 main: MAKEOVERRIDES := 304 305 main: $(INIT_TARGETS) 306 ifneq ($(SEQUENTIAL_TARGETS)$(PARALLEL_TARGETS), ) 307 $(call RotateLogFiles) 308 $(PRINTF) "Building $(TARGET_DESCRIPTION)\n" $(BUILD_LOG_PIPE_SIMPLE) 309 ifneq ($(SEQUENTIAL_TARGETS), ) 310 # Don't touch build output dir since we might be cleaning. That 311 # means no log pipe. 312 ( cd $(TOPDIR) && \ 313 $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ 314 $(SEQUENTIAL_TARGETS) ) 315 endif 316 ifneq ($(PARALLEL_TARGETS), ) 317 $(call PrepareFailureLogs) 318 $(call StartGlobalTimer) 319 $(call PrepareSmartJavac) 320 # JOBS will only be empty for a bootcycle-images recursive call 321 # or if specified via a make argument directly. In those cases 322 # treat it as NOT using jobs at all. 323 ( cd $(TOPDIR) && \ 324 $(NICE) $(MAKE) $(MAKE_ARGS) $(OUTPUT_SYNC_FLAG) \ 325 $(if $(JOBS), -j $(JOBS)) \ 326 -f make/Main.gmk $(USER_MAKE_VARS) \ 327 $(PARALLEL_TARGETS) $(COMPARE_BUILD_MAKE) $(BUILD_LOG_PIPE) || \ 328 ( exitcode=$$? && \ 329 $(PRINTF) "\nERROR: Build failed for $(TARGET_DESCRIPTION) (exit code $$exitcode) \n" \ 330 $(BUILD_LOG_PIPE_SIMPLE) && \ 331 cd $(TOPDIR) && $(MAKE) $(MAKE_ARGS) -j 1 -f make/Init.gmk \ 332 HAS_SPEC=true on-failure ; \ 333 exit $$exitcode ) ) 334 $(call CleanupSmartJavac) 335 $(call StopGlobalTimer) 336 $(call ReportBuildTimes) 337 endif 338 if test -f $(MAKESUPPORT_OUTPUTDIR)/exit-with-error ; then \ 339 exit 1 ; \ 340 fi 341 $(PRINTF) "Finished building $(TARGET_DESCRIPTION)\n" $(BUILD_LOG_PIPE_SIMPLE) 342 $(call ReportProfileTimes) 343 endif 344 345 on-failure: 346 $(call CleanupSmartJavac) 347 $(call StopGlobalTimer) 348 $(call ReportBuildTimes) 349 $(call PrintFailureReports) 350 $(call PrintBuildLogFailures) 351 $(call ReportProfileTimes) 352 $(PRINTF) "Hint: See doc/building.html#troubleshooting for assistance.\n\n" 353 ifneq ($(COMPARE_BUILD), ) 354 $(call CleanupCompareBuild) 355 endif 356 357 # Support targets for COMPARE_BUILD, used for makefile development 358 pre-compare-build: 359 $(call WaitForSmartJavacFinish) 360 $(call PrepareCompareBuild) 361 |