#
# Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

###
### Global targets for printing help etc.
###

# Helper macro to allow $(info) to properly print strings beginning with spaces.
_:=

help:
	$(info )
	$(info OpenJDK Makefile help)
	$(info =====================)
	$(info )
	$(info Common make targets)
	$(info $(_) make [default]         # Compile all modules and create a runnable "exploded")
	$(info $(_)                        # image (alias for jdk or exploded-image))
	$(info $(_) make all               # Create all images: product, test, docs)
	$(info $(_)                        # (alias for all-images))
	$(info $(_) make images            # Create a complete jdk image)
	$(info $(_)                        # (alias for product-images))
	$(info $(_) make <name>-image      # Build just the image for any of: )
	$(info $(_)                        # jdk, test, docs, symbols, legacy-jre, static-libs)
	$(info $(_) make <phase>           # Build the specified phase and everything it depends on)
	$(info $(_)                        # (gensrc, java, copy, libs, launchers, gendata, rmic))
	$(info $(_) make *-only            # Applies to most targets and disables building the)
	$(info $(_)                        # dependencies for that target. This is faster but may)
	$(info $(_)                        # result in incorrect build results!)
	$(info $(_) make docs              # Create all docs)
	$(info $(_) make docs-jdk-api      # Create just JDK javadocs)
	$(info $(_) make bootcycle-images  # Build images twice, second time with newly built JDK)
	$(info $(_) make install           # Install the generated images locally)
	$(info $(_) make reconfigure       # Rerun configure with the same arguments as last time)
	$(info $(_) make help              # Give some help on using make)
	$(info $(_) make test              # Run tests, default is all tests (see TEST below))
	$(info $(_) make run-test-<test>   # Run test, e.g. run-test-tier1)
	$(info $(_) make run-test TEST=<t> # Run test(s) given by TEST specification)
	$(info $(_) make exploded-run-test TEST=<t> # Run test(s) on the exploded image instead of)
	$(info $(_)                        # the full jdk image)
	$(info )
	$(info Targets for cleaning)
	$(info $(_) make clean             # Remove all files generated by make, but not those)
	$(info $(_)                        # generated by configure)
	$(info $(_) make dist-clean        # Remove all files, including configuration)
	$(info $(_) make clean-<outputdir> # Remove the subdir in the output dir with the name)
	$(info $(_) make clean-<phase>     # Remove all build results related to a certain build)
	$(info $(_)                        # phase (gensrc, java, libs, launchers))
	$(info $(_) make clean-<module>    # Remove all build results related to a certain module)
	$(info $(_) make clean-<module>-<phase> # Remove all build results related to a certain)
	$(info $(_)                        # module and phase)
	$(info )
	$(info Targets for Hotspot)
	$(info $(_) make hotspot           # Build all of hotspot)
	$(info $(_) make hotspot-<variant> # Build just the specified jvm variant)
	$(info $(_) make hotspot-gensrc    # Only build the gensrc part of hotspot)
	$(info $(_) make hotspot-<variant>-<phase> # Build the specified phase for the variant)
	$(info )
	$(info Targets for specific modules)
	$(info $(_) make <module>          # Build <module> and everything it depends on)
	$(info $(_) make <module>-<phase>  # Compile the specified phase for the specified module)
	$(info $(_)                        # and everything it depends on)
	$(info $(_)                        # (gensrc, java, copy, libs, launchers, gendata, rmic))
	$(info )
	$(info Make control variables)
	$(info $(_) CONF=                  # Build all configurations (note, assignment is empty))
	$(info $(_) CONF=<substring>       # Build the configuration(s) with a name matching)
	$(info $(_)                        # <substring>)
	$(info $(_) CONF_NAME=<string>     # Build the configuration with exactly the <string>)
	$(info $(_) SPEC=<spec file>       # Build the configuration given by the spec file)
	$(info $(_) 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=debug)
	$(info $(_) JOBS=<n>               # Run <n> parallel make jobs)
	$(info $(_)                        # Note that -jN does not work as expected!)
	$(info $(_) TEST_JOBS=<n>          # Run <n> parallel test jobs)
	$(info $(_) CONF_CHECK=<method>    # What to do if spec file is out of date)
	$(info $(_)                        # method is 'auto', 'ignore' or 'fail' (default))
	$(info $(_) make test TEST=<test>  # Only run the given test or tests, e.g.)
	$(info $(_)                        # make test TEST="jdk_lang jdk_net")
	$(info $(_) JTREG="OPT1=x;OPT2=y"  # Control the JTREG test harness for run-test)
	$(info $(_) GTEST="OPT1=x;OPT2=y"  # Control the GTEST test harness for run-test)
	$(info )
	$(if $(all_confs), $(info Available configurations in $(build_dir):) $(foreach var,$(all_confs),$(info * $(var))),\
	    $(info No configurations were found in $(build_dir).) $(info Run 'bash configure' to create a configuration.))
        # We need a dummy rule otherwise make will complain
	@true

print-configurations:
	$(foreach var, $(all_confs), $(info $(var)))
        # We need a dummy rule otherwise make will complain
	@true

# This is not really a "help" target, but it is a global target, and those are
# all contained in this file.
run-test-prebuilt:
	@( cd $(topdir) && \
	    $(MAKE) --no-print-directory -r -R -I make/common/ -f make/RunTestsPrebuilt.gmk \
	    run-test-prebuilt CUSTOM_MAKE_DIR=$(CUSTOM_MAKE_DIR) TEST="$(TEST)" )

ALL_GLOBAL_TARGETS := help print-configurations run-test-prebuilt

.PHONY: $(ALL_GLOBAL_TARGETS)
