Makefile
changeset 25854 98ce0879ab4c
parent 22031 ae288cbb4c28
child 26128 91be51647a45
--- a/Makefile	Sun Aug 10 19:38:50 2014 -0700
+++ b/Makefile	Sun Aug 17 15:51:37 2014 +0100
@@ -58,29 +58,70 @@
 ifeq ($(SPEC),)
   # Since we got past ParseConfAndSpec, we must be building a global target. Do nothing.
 else
-  ifeq ($(words $(SPEC)),1)
-    # We are building a single configuration. This is the normal case. Execute the Main.gmk file.
-    include $(root_dir)/make/Main.gmk
-  else
-    # We are building multiple configurations.
-    # First, find out the valid targets
-    # Run the makefile with an arbitrary SPEC using -p -q (quiet dry-run and dump rules) to find
-    # available PHONY targets. Use this list as valid targets to pass on to the repeated calls.
-    all_phony_targets=$(filter-out $(global_targets), $(strip $(shell \
-        cd $(root_dir) && $(MAKE) -p -q FRC SPEC=$(firstword $(SPEC)) | \
-        grep ^.PHONY: | head -n 1 | cut -d " " -f 2-)))
+  # In Cygwin, the MAKE variable gets messed up if the make executable is called with
+  # a Windows mixed path (c:/cygwin/bin/make.exe). If that's the case, fix it by removing
+  # the prepended root_dir.
+  ifneq ($(findstring :, $(MAKE)), )
+    MAKE := $(patsubst $(root_dir)%, %, $(MAKE))
+  endif
+
+  # We are potentially building multiple configurations.
+  # First, find out the valid targets
+  # Run the makefile with an arbitrary SPEC using -p -q (quiet dry-run and dump rules) to find
+  # available PHONY targets. Use this list as valid targets to pass on to the repeated calls.
+  all_phony_targets := $(sort $(filter-out $(global_targets), $(strip $(shell \
+      cd $(root_dir)/make && $(MAKE) -f Main.gmk -p -q FRC SPEC=$(firstword $(SPEC)) | \
+      grep "^.PHONY:" | head -n 1 | cut -d " " -f 2-))))
+
+  # Loop through the configurations and call the main-wrapper for each one. The wrapper
+  # target will execute with a single configuration loaded.
+  $(all_phony_targets):
+	@$(if $(TARGET_RUN),,\
+          $(foreach spec,$(SPEC),\
+            (cd $(root_dir) && $(MAKE) SPEC=$(spec) MAIN_TARGETS="$(call GetRealTarget)" \
+	    $(VERBOSE) VERBOSE=$(VERBOSE) LOG_LEVEL=$(LOG_LEVEL) main-wrapper) &&) true)
+	@echo > /dev/null
+	$(eval TARGET_RUN=true)
+
+  .PHONY: $(all_phony_targets)
 
-    $(all_phony_targets):
-	@$(foreach spec,$(SPEC),(cd $(root_dir) && $(MAKE) SPEC=$(spec) \
-	    $(VERBOSE) VERBOSE=$(VERBOSE) LOG_LEVEL=$(LOG_LEVEL) $@) &&) true
+  ifneq ($(MAIN_TARGETS), )
+    # The wrapper target was called so we now have a single configuration. Load the spec file
+    # and call the real Main.gmk.
+    include $(SPEC)
 
-    .PHONY: $(all_phony_targets)
+    ### Clean up from previous run
+    # Remove any build.log from a previous run, if they exist
+    ifneq (,$(BUILD_LOG))
+      ifneq (,$(BUILD_LOG_PREVIOUS))
+        # Rotate old log
+        $(shell $(RM) $(BUILD_LOG_PREVIOUS) 2> /dev/null)
+        $(shell $(MV) $(BUILD_LOG) $(BUILD_LOG_PREVIOUS) 2> /dev/null)
+      else
+        $(shell $(RM) $(BUILD_LOG) 2> /dev/null)
+      endif
+      $(shell $(RM) $(OUTPUT_ROOT)/build-trace-time.log 2> /dev/null)
+    endif
+    # Remove any javac server logs and port files. This
+    # prevents a new make run to reuse the previous servers.
+    ifneq (,$(SJAVAC_SERVER_DIR))
+      $(shell $(MKDIR) -p $(SJAVAC_SERVER_DIR) && $(RM) -rf $(SJAVAC_SERVER_DIR)/*)
+    endif
 
-  endif
+    main-wrapper:
+	@$(if $(findstring clean, $(MAIN_TARGETS)), , $(call AtMakeStart))
+	(cd $(root_dir)/make && $(BUILD_LOG_WRAPPER) $(MAKE) -f Main.gmk SPEC=$(SPEC) -j $(JOBS) \
+	    $(VERBOSE) VERBOSE=$(VERBOSE) LOG_LEVEL=$(LOG_LEVEL) $(MAIN_TARGETS) \
+	    $(if $(filter true, $(OUTPUT_SYNC_SUPPORTED)), -O$(OUTPUT_SYNC)))
+	@$(if $(findstring clean, $(MAIN_TARGETS)), , $(call AtMakeEnd))
+
+     .PHONY: main-wrapper
+
+   endif
 endif
 
 # Here are "global" targets, i.e. targets that can be executed without specifying a single configuration.
-# If you addd more global targets, please update the variable global_targets in MakeHelpers.
+# If you add more global targets, please update the variable global_targets in MakeHelpers.
 
 help:
 	$(info )
@@ -88,12 +129,12 @@
 	$(info =====================)
 	$(info )
 	$(info Common make targets)
-	$(info .  make [default]         # Compile all product in langtools, hotspot, jaxp, jaxws,)
-	$(info .                         # corba and jdk)
-	$(info .  make all               # Compile everything, all repos and images)
+	$(info .  make [default]         # Compile all modules in langtools, hotspot, jaxp, jaxws,)
+	$(info .                         # corba and jdk and create a runnable "exploded" image)
+	$(info .  make all               # Compile everything, all repos, docs and images)
 	$(info .  make images            # Create complete j2sdk and j2re images)
-	$(info .  make docs              # Create javadocs)
-	$(info .  make overlay-images    # Create limited images for sparc 64 bit platforms)
+	$(info .  make docs              # Create all docs)
+	$(info .  make docs-javadoc      # Create just javadocs, depends on less than full docs)
 	$(info .  make profiles          # Create complete j2re compact profile images)
 	$(info .  make bootcycle-images  # Build images twice, second time with newly build JDK)
 	$(info .  make install           # Install the generated images locally)
@@ -103,12 +144,18 @@
 	$(info .  make help              # Give some help on using make)
 	$(info .  make test              # Run tests, default is all tests (see TEST below))
 	$(info )
-	$(info Targets for specific components)
-	$(info (Component is any of langtools, corba, jaxp, jaxws, hotspot, jdk, nashorn, images, overlay-images, docs or test))
-	$(info .  make <component>       # Build <component> and everything it depends on. )
-	$(info .  make <component>-only  # Build <component> only, without dependencies. This)
+	$(info Targets for specific modules)
+	$(info .  make <module>          # Build <module> and everything it depends on. )
+	$(info .  make <module>-only     # Build <module> only, without dependencies. This)
 	$(info .                         # is faster but can result in incorrect build results!)
-	$(info .  make clean-<component> # Remove files generated by make for <component>)
+	$(info .  make <module>-java     # Compile java classes for <module> and everything it)
+	$(info .                         # depends on)
+	$(info .  make <module>-libs     # Build native libraries for <module> and everything it)
+	$(info .                         # depends on)
+	$(info .  make <module>-launchers# Build native executables for <module> and everything it)
+	$(info .                         # depends on)
+	$(info .  make <module>-gensrc   # Execute the gensrc step for <module> and everything it)
+	$(info .                         # depends on)
 	$(info )
 	$(info Useful make variables)
 	$(info .  make CONF=             # Build all configurations (note, assignment is empty))