Makefile
changeset 29662 78c47f0002c3
parent 28902 0c09b47449c8
child 41040 7b919a4497ff
equal deleted inserted replaced
29565:34ead0aa3d9d 29662:78c47f0002c3
     1 #
     1 #
     2 # Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
     2 # Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
     3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4 #
     4 #
     5 # This code is free software; you can redistribute it and/or modify it
     5 # This code is free software; you can redistribute it and/or modify it
     6 # under the terms of the GNU General Public License version 2 only, as
     6 # under the terms of the GNU General Public License version 2 only, as
     7 # published by the Free Software Foundation.  Oracle designates this
     7 # published by the Free Software Foundation.  Oracle designates this
    21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22 # or visit www.oracle.com if you need additional information or have any
    22 # or visit www.oracle.com if you need additional information or have any
    23 # questions.
    23 # questions.
    24 #
    24 #
    25 
    25 
    26 # This must be the first rule
    26 ###
    27 default:
    27 ### This file is just a very small wrapper needed to run the real make/Init.gmk.
       
    28 ### It also performs some sanity checks on make.
       
    29 ###
    28 
    30 
    29 # Inclusion of this pseudo-target will cause make to execute this file
    31 # The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU Make.
    30 # serially, regardless of -j. Recursively called makefiles will not be
    32 # /usr/ccs/bin/make lacks basically every other flow control mechanism.
    31 # affected, however. This is required for correct dependency management.
    33 .TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU Make/gmake, this is a requirement. Check your path. 1>&2 && exit 1
    32 .NOTPARALLEL:
       
    33 
    34 
    34 # The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU make.
    35 # The .FEATURES variable is likely to be unique for GNU Make.
    35 # /usr/ccs/bin/make lacks basically every other flow control mechanism.
    36 ifeq ($(.FEATURES), )
    36 .TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU make/gmake, this is a requirement. Check your path. 1>&2 && exit 1
    37   $(info Error: '$(MAKE)' does not seem to be GNU Make, which is a requirement.)
       
    38   $(info Check your path, or upgrade to GNU Make 3.81 or newer.)
       
    39   $(error Cannot continue)
       
    40 endif
    37 
    41 
    38 # Assume we have GNU make, but check version.
    42 # Assume we have GNU Make, but check version.
    39 ifeq ($(strip $(foreach v, 3.81% 3.82% 4.%, $(filter $v, $(MAKE_VERSION)))), )
    43 ifeq ($(strip $(foreach v, 3.81% 3.82% 4.%, $(filter $v, $(MAKE_VERSION)))), )
    40   $(error This version of GNU Make is too low ($(MAKE_VERSION)). Check your path, or upgrade to 3.81 or newer.)
    44   $(info Error: This version of GNU Make is too low ($(MAKE_VERSION)).)
       
    45   $(info Check your path, or upgrade to GNU Make 3.81 or newer.)
       
    46   $(error Cannot continue)
       
    47 endif
       
    48 
       
    49 # In Cygwin, the MAKE variable gets prepended with the current directory if the
       
    50 # make executable is called using a Windows mixed path (c:/cygwin/bin/make.exe).
       
    51 ifneq ($(findstring :, $(MAKE)), )
       
    52   MAKE := $(patsubst $(CURDIR)%, %, $(patsubst $(CURDIR)/%, %, $(MAKE)))
    41 endif
    53 endif
    42 
    54 
    43 # Locate this Makefile
    55 # Locate this Makefile
    44 ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),)
    56 ifeq ($(filter /%, $(lastword $(MAKEFILE_LIST))),)
    45   makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST))
    57   makefile_path := $(CURDIR)/$(strip $(lastword $(MAKEFILE_LIST)))
    46 else
    58 else
    47   makefile_path:=$(lastword $(MAKEFILE_LIST))
    59   makefile_path := $(lastword $(MAKEFILE_LIST))
    48 endif
    60 endif
    49 root_dir:=$(patsubst %/,%,$(dir $(makefile_path)))
    61 topdir := $(strip $(patsubst %/, %, $(dir $(makefile_path))))
    50 
    62 
    51 ifeq ($(MAIN_TARGETS), )
    63 # ... and then we can include the real makefile
    52   COMMAND_LINE_VARIABLES:=$(subst =command,,$(filter %=command,$(foreach var,$(.VARIABLES),$(var)=$(firstword $(origin $(var))))))
    64 include $(topdir)/make/Init.gmk
    53   MAKE_CONTROL_VARIABLES:=LOG CONF SPEC JOBS TEST IGNORE_OLD_CONFIG
       
    54   UNKNOWN_COMMAND_LINE_VARIABLES:=$(strip $(filter-out $(MAKE_CONTROL_VARIABLES), $(COMMAND_LINE_VARIABLES)))
       
    55   ifneq ($(UNKNOWN_COMMAND_LINE_VARIABLES), )
       
    56     $(info Note: Command line contains non-control variables: $(UNKNOWN_COMMAND_LINE_VARIABLES).)
       
    57     $(info Make sure it is not mistyped, and that you intend to override this variable.)
       
    58     $(info 'make help' will list known control variables)
       
    59   endif
       
    60 endif
       
    61 
       
    62 ifneq ($(findstring qp,$(MAKEFLAGS)),)
       
    63   # When called with -qp, assume an external part (e.g. bash completion) is trying
       
    64   # to understand our targets.
       
    65   # Duplication of global targets, needed before ParseConfAndSpec in case we have
       
    66   # no configurations.
       
    67   help:
       
    68   # If both CONF and SPEC are unset, look for all available configurations by
       
    69   # setting CONF to the empty string.
       
    70   ifeq ($(SPEC), )
       
    71     CONF?=
       
    72   endif
       
    73 endif
       
    74 
       
    75 # ... and then we can include our helper functions
       
    76 include $(root_dir)/make/MakeHelpers.gmk
       
    77 
       
    78 $(eval $(call ParseLogLevel))
       
    79 $(eval $(call ParseConfAndSpec))
       
    80 
       
    81 # Now determine if we have zero, one or several configurations to build.
       
    82 ifeq ($(SPEC),)
       
    83   # Since we got past ParseConfAndSpec, we must be building a global target. Do nothing.
       
    84 else
       
    85   # In Cygwin, the MAKE variable gets messed up if the make executable is called with
       
    86   # a Windows mixed path (c:/cygwin/bin/make.exe). If that's the case, fix it by removing
       
    87   # the prepended root_dir.
       
    88   ifneq ($(findstring :, $(MAKE)), )
       
    89     MAKE := $(patsubst $(root_dir)%, %, $(MAKE))
       
    90   endif
       
    91 
       
    92   # We are potentially building multiple configurations.
       
    93   # First, find out the valid targets
       
    94   # Run the makefile with an arbitrary SPEC using -p -q (quiet dry-run and dump rules) to find
       
    95   # available PHONY targets. Use this list as valid targets to pass on to the repeated calls.
       
    96   all_phony_targets := $(sort $(filter-out $(global_targets), $(strip $(shell \
       
    97       cd $(root_dir)/make && $(MAKE) -f Main.gmk -p -q FRC SPEC=$(firstword $(SPEC)) \
       
    98       -I $(root_dir)/make/common | grep "^.PHONY:" | head -n 1 | cut -d " " -f 2-))))
       
    99 
       
   100   # Loop through the configurations and call the main-wrapper for each one. The wrapper
       
   101   # target will execute with a single configuration loaded.
       
   102   $(all_phony_targets):
       
   103 	@$(if $(TARGET_RUN),,\
       
   104           $(foreach spec,$(SPEC),\
       
   105             (cd $(root_dir) && $(MAKE) SPEC=$(spec) MAIN_TARGETS="$(call GetRealTarget)" \
       
   106 	    $(VERBOSE) VERBOSE=$(VERBOSE) LOG_LEVEL=$(LOG_LEVEL) main-wrapper) &&) true)
       
   107 	@echo > /dev/null
       
   108 	$(eval TARGET_RUN=true)
       
   109 
       
   110   .PHONY: $(all_phony_targets)
       
   111 
       
   112   ifneq ($(MAIN_TARGETS), )
       
   113     # The wrapper target was called so we now have a single configuration. Load the spec file
       
   114     # and call the real Main.gmk.
       
   115     include $(SPEC)
       
   116     include $(SRC_ROOT)/make/common/MakeBase.gmk
       
   117 
       
   118     ### Clean up from previous run
       
   119     # Remove any build.log from a previous run, if they exist
       
   120     ifneq (,$(BUILD_LOG))
       
   121       ifneq (,$(BUILD_LOG_PREVIOUS))
       
   122         # Rotate old log
       
   123         $(shell $(RM) $(BUILD_LOG_PREVIOUS) 2> /dev/null)
       
   124         $(shell $(MV) $(BUILD_LOG) $(BUILD_LOG_PREVIOUS) 2> /dev/null)
       
   125       else
       
   126         $(shell $(RM) $(BUILD_LOG) 2> /dev/null)
       
   127       endif
       
   128       $(shell $(RM) $(OUTPUT_ROOT)/build-trace-time.log 2> /dev/null)
       
   129     endif
       
   130     # Remove any javac server logs and port files. This
       
   131     # prevents a new make run to reuse the previous servers.
       
   132     ifneq (,$(SJAVAC_SERVER_DIR))
       
   133       $(shell $(MKDIR) -p $(SJAVAC_SERVER_DIR) && $(RM) -rf $(SJAVAC_SERVER_DIR)/*)
       
   134     endif
       
   135 
       
   136     # Split out the targets requiring sequential execution. Run these targets separately
       
   137     # from the rest so that the rest may still enjoy full parallel execution.
       
   138     SEQUENTIAL_TARGETS := $(filter dist-clean clean% reconfigure, $(MAIN_TARGETS))
       
   139     PARALLEL_TARGETS := $(filter-out $(SEQUENTIAL_TARGETS), $(MAIN_TARGETS))
       
   140 
       
   141     main-wrapper:
       
   142         ifneq ($(SEQUENTIAL_TARGETS), )
       
   143 	  (cd $(SRC_ROOT)/make && $(MAKE) -f Main.gmk SPEC=$(SPEC) -j 1 \
       
   144 	      $(VERBOSE) VERBOSE=$(VERBOSE) LOG_LEVEL=$(LOG_LEVEL) $(SEQUENTIAL_TARGETS))
       
   145         endif
       
   146         ifneq ($(PARALLEL_TARGETS), )
       
   147 	  @$(call AtMakeStart)
       
   148 	  (cd $(SRC_ROOT)/make && $(BUILD_LOG_WRAPPER) $(MAKE) -f Main.gmk SPEC=$(SPEC) -j $(JOBS) \
       
   149 	      $(VERBOSE) VERBOSE=$(VERBOSE) LOG_LEVEL=$(LOG_LEVEL) $(PARALLEL_TARGETS) \
       
   150 	      $(if $(filter true, $(OUTPUT_SYNC_SUPPORTED)), -O$(OUTPUT_SYNC)))
       
   151 	  @$(call AtMakeEnd)
       
   152         endif
       
   153 
       
   154      .PHONY: main-wrapper
       
   155 
       
   156    endif
       
   157 endif
       
   158 
       
   159 # Here are "global" targets, i.e. targets that can be executed without specifying a single configuration.
       
   160 # If you add more global targets, please update the variable global_targets in MakeHelpers.
       
   161 
       
   162 # Helper macro to allow $(info) to properly print strings beginning with spaces.
       
   163 _:=
       
   164 
       
   165 help:
       
   166 	$(info )
       
   167 	$(info OpenJDK Makefile help)
       
   168 	$(info =====================)
       
   169 	$(info )
       
   170 	$(info Common make targets)
       
   171 	$(info $(_) make [default]         # Compile all modules in langtools, hotspot, jdk, jaxws,)
       
   172 	$(info $(_)                        # jaxp and corba, and create a runnable "exploded" image)
       
   173 	$(info $(_) make all               # Compile everything, all repos, docs and images)
       
   174 	$(info $(_) make images            # Create complete j2sdk and j2re images)
       
   175 	$(info $(_) make <phase>           # Build the specified phase and everything it depends on)
       
   176 	$(info $(_)                        # (gensrc, java, copy, libs, launchers, gendata, rmic))
       
   177 	$(info $(_) make *-only            # Applies to most targets and disables compling the)
       
   178 	$(info $(_)                        # dependencies for the target. This is faster but may)
       
   179 	$(info $(_)                        # result in incorrect build results!)
       
   180 	$(info $(_) make docs              # Create all docs)
       
   181 	$(info $(_) make docs-javadoc      # Create just javadocs, depends on less than full docs)
       
   182 	$(info $(_) make profiles          # Create complete j2re compact profile images)
       
   183 	$(info $(_) make bootcycle-images  # Build images twice, second time with newly built JDK)
       
   184 	$(info $(_) make install           # Install the generated images locally)
       
   185 	$(info $(_) make reconfigure       # Rerun configure with the same arguments as last time)
       
   186 	$(info $(_) make help              # Give some help on using make)
       
   187 	$(info $(_) make test              # Run tests, default is all tests (see TEST below))
       
   188 	$(info )
       
   189 	$(info Targets for cleaning)
       
   190 	$(info $(_) make clean             # Remove all files generated by make, but not those)
       
   191 	$(info $(_)                        # generated by configure)
       
   192 	$(info $(_) make dist-clean        # Remove all files, including configuration)
       
   193 	$(info $(_) make clean-<outputdir> # Remove the subdir in the output dir with the name)
       
   194 	$(info $(_) make clean-<phase>     # Remove all build results related to a certain build)
       
   195 	$(info $(_)                        # phase (gensrc, java, libs, launchers))
       
   196 	$(info $(_) make clean-<module>    # Remove all build results related to a certain module)
       
   197 	$(info $(_) make clean-<module>-<phase> # Remove all build results related to a certain)
       
   198 	$(info $(_)                        # module and phase)
       
   199 	$(info )
       
   200 	$(info Targets for specific modules)
       
   201 	$(info $(_) make <module>          # Build <module> and everything it depends on.)
       
   202 	$(info $(_) make <module>-<phase>  # Compile the specified phase for the specified module)
       
   203 	$(info $(_)                        # and everything it depends on)
       
   204 	$(info $(_)                        # (gensrc, java, copy, libs, launchers, gendata, rmic))
       
   205 	$(info )
       
   206 	$(info Make control variables)
       
   207 	$(info $(_) CONF=                  # Build all configurations (note, assignment is empty))
       
   208 	$(info $(_) CONF=<substring>       # Build the configuration(s) with a name matching)
       
   209 	$(info $(_)                        # <substring>)
       
   210 	$(info $(_) SPEC=<spec file>       # Build the configuration given by the spec file)
       
   211 	$(info $(_) LOG=<loglevel>         # Change the log level from warn to <loglevel>)
       
   212 	$(info $(_)                        # Available log levels are:)
       
   213 	$(info $(_)                        # 'warn' (default), 'info', 'debug' and 'trace')
       
   214 	$(info $(_)                        # To see executed command lines, use LOG=debug)
       
   215 	$(info $(_) JOBS=<n>               # Run <n> parallel make jobs)
       
   216 	$(info $(_)                        # Note that -jN does not work as expected!)
       
   217 	$(info $(_) IGNORE_OLD_CONFIG=true # Skip tests if spec file is up to date)
       
   218 	$(info $(_) make test TEST=<test>  # Only run the given test or tests, e.g.)
       
   219 	$(info $(_)                        # make test TEST="jdk_lang jdk_net")
       
   220 	$(info )
       
   221 
       
   222 .PHONY: help