common/makefiles/Makefile
changeset 14111 2a82ecb35fc7
parent 13697 5262b00bc10c
child 15053 64278cb83950
--- a/common/makefiles/Makefile	Wed Jul 05 18:26:51 2017 +0200
+++ b/common/makefiles/Makefile	Fri Oct 26 14:29:57 2012 -0700
@@ -24,13 +24,24 @@
 #
 
 # This must be the first rule
-default: all
+all:
 
 # Inclusion of this pseudo-target will cause make to execute this file
 # serially, regardless of -j. Recursively called makefiles will not be
 # affected, however. This is required for correct dependency management.
 .NOTPARALLEL:
 
+# The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU make.
+# /usr/ccs/bin/make lacks basically every other flow control mechanism.
+TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU make/gmake, this is a requirement. Check your path. 1>&2 && exit 1
+
+# Assume we have GNU make, but check version.
+ifeq (,$(findstring 3.81,$(MAKE_VERSION)))
+    ifeq (,$(findstring 3.82,$(MAKE_VERSION)))
+        $(error This version of GNU Make is too low ($(MAKE_VERSION)). Check your path, or upgrade to 3.81 or newer.)
+    endif
+endif
+
 # Locate this Makefile
 ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),)
     makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST))
@@ -43,202 +54,32 @@
 include $(dir $(makefile_path))/MakeHelpers.gmk
 
 $(eval $(call ParseLogLevel))
-$(eval $(call SetupLogging))
 $(eval $(call ParseConfAndSpec))
 
-ifneq ($(words $(SPEC)),1)
-### We have multiple configurations to build, call make repeatedly
-all clean dist-clean:
-langtools corba jaxp jaxws hotspot jdk images overlay-images install:
-langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only overlay-images-only install-only:
-clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images:
+# Now determine if we have zero, one or several configurations to build.
+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 $(dir $(makefile_path))/Main.gmk
+    else
+        # We are building multiple configurations.
+        # First, find out the valid targets
+        # Run the makefile with an arbitraty 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 \
+            $(MAKE) -p -q -f  $(makefile_path) SPEC=$(firstword $(SPEC)) | \
+            grep ^.PHONY: | head -n 1 | cut -d " " -f 2-)))
+
+$(all_phony_targets):
 	@$(foreach spec,$(SPEC),($(MAKE) -f $(makefile_path) SPEC=$(spec) $(VERBOSE) VERBOSE=$(VERBOSE) $@) &&) true
 
-.PHONY: all clean dist-clean
-.PHONY: langtools corba jaxp jaxws hotspot jdk images overlay-images install
-.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only overlay-images-only install-only
-.PHONY: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images
-
-else
-### This is the main part of the Makefile, for the normal case with SPEC specifying a single existing spec.gmk file.
-
-# Now load the spec
-include $(SPEC)
-
-# Load the vital tools for all the makefiles. 
-include $(SRC_ROOT)/common/makefiles/MakeBase.gmk
-
-### 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
 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
-# Clean out any notifications from the previous build.
-$(shell $(FIND) $(OUTPUT_ROOT) -name "_the.*.notify" $(FIND_DELETE))
-
-# Reset the build timers.
-$(eval $(call ResetTimers))
-
-# Setup number of jobs to use. -jN is unfortunately not available for us to parse from the command line,
-# hence this workaround.
-ifeq ($(JOBS),)
-    JOBS=$(NUM_CORES)
-endif
-MAKE_ARGS:=$(MAKE_ARGS) -j$(JOBS)
-
-### Main targets
-
-all: jdk
-	@$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port)
-	@$(call AtRootMakeEnd)
-.PHONY: all
-
-langtools: start-make langtools-only
-langtools-only:
-	@$(call MakeStart,langtools,all)
-	@($(CD) $(LANGTOOLS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS))
-	@$(call MakeFinish,langtools,all)
-
-corba: langtools corba-only
-corba-only:
-	@$(call MakeStart,corba,all)
-	@($(CD) $(CORBA_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS))
-	@$(call MakeFinish,corba,all)
-
-jaxp: langtools jaxp-only
-jaxp-only:
-	@$(call MakeStart,jaxp,all)
-	@($(CD) $(JAXP_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS))
-	@$(call MakeFinish,jaxp,all)
-
-jaxws: langtools jaxp jaxws-only
-jaxws-only:
-	@$(call MakeStart,jaxws,all)
-	@($(CD) $(JAXWS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS))
-	@$(call MakeFinish,jaxws,all)
-
-hotspot: langtools hotspot-only
-hotspot-only:
-	@$(call MakeStart,hotspot,all)
-	@($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f HotspotWrapper.gmk)
-	@$(call MakeFinish,hotspot,all)
-
-jdk: langtools corba jaxp jaxws hotspot jdk-only
-jdk-only:
-	@$(call MakeStart,jdk,all)
-	@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) $(JDK_TARGET))
-	@$(call MakeFinish,jdk,all)
-
-images: source-tips start-make jdk langtools corba jaxp jaxws hotspot images-only
-images-only:
-	@$(call MakeStart,jdk-images,$@)
-	@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) images)
-	@$(call MakeFinish,jdk-images,$@)
-	@$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port)
-	@$(call AtRootMakeEnd)
-
-overlay-images: source-tips start-make jdk langtools corba jaxp jaxws hotspot overlay-images-only
-overlay-images-only:
-	@$(call MakeStart,jdk-overlay-images,$@)
-	@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) overlay-images)
-	@$(call MakeFinish,jdk-overlay-images,$@)
-	@$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port)
-	@$(call AtRootMakeEnd)
-
-install: source-tips start-make jdk langtools corba jaxp jaxws hotspot install-only
-install-only:
-	@$(call MakeStart,jdk-images,$@)
-	@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) install)
-	@$(call MakeFinish,jdk-images,$@)
-	@$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port)
-	@$(call AtRootMakeEnd)
-
-docs: start-make jdk docs-only
-docs-only:
-	@$(call MakeStart,docs,$@)
-	@($(CD) $(SRC_ROOT)/common/makefiles/javadoc && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs)
-	@$(call MakeFinish,docs,$@)
-	@$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port)
-	@$(call AtRootMakeEnd)
-
-
-.PHONY: langtools corba jaxp jaxws hotspot jdk images install
-.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only install-only
-
-start-make:
-	@$(call AtRootMakeStart)
-.PHONY: start-make
-
-bootcycle-images:
-	@$(ECHO) Boot cycle build step 1: Building the JDK image normally
-	@($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(SPEC) images)
-	@$(ECHO) Boot cycle build step 2: Building a new JDK image using previously built image
-	@($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(dir $(SPEC))bootcycle-spec.gmk images)
-
-test: start-make
-	@$(call MakeStart,test,$(if $(TEST),$(TEST),all))
-	@($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) MAKEFLAGS= -j1 PRODUCT_HOME=$(OUTPUT_ROOT)/jdk JPRT_JAVA_HOME=$(OUTPUT_ROOT)/jdk ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true
-	@$(call MakeFinish,test,$(if $(TEST),$(TEST),all))
-	@$(call AtRootMakeEnd)
-.PHONY: test
-
-
-# Stores the tips for each repository. This file is be used when constructing the jdk image and can be
-# used to track the exact sources used to build that image.
-source-tips: $(OUTPUT_ROOT)/source_tips
-$(OUTPUT_ROOT)/source_tips: FRC
-	@$(MKDIR) -p $(@D)
-	@$(RM) $@
-	@$(call GetSourceTips)
-
-
-# Remove everything, except the output from configure.
-clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images clean-bootcycle-build
-	@($(CD) $(OUTPUT_ROOT) && $(RM) -r tmp source_tips build.log*)
-	@$(ECHO) Cleaned everything except the build configuration.
-.PHONY: clean
-
-# Remove everything, you have to rerun configure.
-dist-clean:
-	@$(RM) -r $(OUTPUT_ROOT)
-	@$(ECHO) Cleaned everything, you will have to re-run configure.
-.PHONY: dist-clean
-
-clean-langtools:
-	$(call CleanComponent,langtools)
-clean-corba:
-	$(call CleanComponent,corba)
-clean-jaxp:
-	$(call CleanComponent,jaxp)
-clean-jaxws:
-	$(call CleanComponent,jaxws)
-clean-hotspot:
-	$(call CleanComponent,hotspot)
-clean-jdk:
-	$(call CleanComponent,jdk)
-clean-images:
-	$(call CleanComponent,images)
-clean-bootcycle-build:
-	$(call CleanComponent,bootcycle-build)
-
-.PHONY: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images
-
-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 fatal-error macro.
+# If you addd more global targets, please update the variable global_targets in MakeHelpers.
 
 help:
 	$(info )
@@ -258,7 +99,7 @@
 	$(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 or images))
+	$(info (Component is any of langtools, corba, jaxp, jaxws, hotspot, jdk, images or overlay-images))
 	$(info .  make <component>       # Build <component> and everything it depends on. )
 	$(info .  make <component>-only  # Build <component> only, without dependencies. This)
 	$(info .                         # is faster but can result in incorrect build results!)
@@ -272,7 +113,7 @@
 	$(info .  make LOG=<loglevel>    # Change the log level from warn to <loglevel>)
 	$(info .                         # Available log levels are:)
 	$(info .                         # 'warn' (default), 'info', 'debug' and 'trace')
-	$(info .                         # To see executed command lines, use LOG=info)
+	$(info .                         # To see executed command lines, use LOG=debug)
 	$(info )
 	$(info .  make JOBS=<n>          # Run <n> parallel make jobs)
 	$(info .                         # Note that -jN does not work as expected!)
@@ -280,5 +121,11 @@
 	$(info .  make test TEST=<test>  # Only run the given test or tests, e.g.)
 	$(info .                         # make test TEST="jdk_lang jdk_net")
 	$(info )
-.PHONY: help
-FRC: # Force target
+
+configure:
+	@$(SHELL) $(root_dir)/configure $(CONFIGURE_ARGS)
+	@echo ====================================================
+	@echo "Note: This is a non-recommended way of running configure."
+	@echo "Instead, run 'sh configure' in the top-level directory"
+
+.PHONY: help configure